1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin #ifndef _NV_PRIVATE
22da2e3ebdSchin /*
23da2e3ebdSchin  * This is the implementation header file for name-value pairs
24da2e3ebdSchin  */
25da2e3ebdSchin 
26da2e3ebdSchin #define _NV_PRIVATE	\
27da2e3ebdSchin 	Namfun_t	*nvfun;		/* pointer to trap functions */ \
28da2e3ebdSchin 	union Value	nvalue; 	/* value field */ \
29da2e3ebdSchin 	char		*nvenv;		/* pointer to environment name */
30da2e3ebdSchin 
31da2e3ebdSchin #include	<ast.h>
32da2e3ebdSchin #include	<cdt.h>
33*b30d1939SAndy Fiddaman 
34*b30d1939SAndy Fiddaman typedef int (*Nambfp_f)(int, char**, void*);
35da2e3ebdSchin 
36da2e3ebdSchin /* Nodes can have all kinds of values */
37da2e3ebdSchin union Value
38da2e3ebdSchin {
39da2e3ebdSchin 	const char		*cp;
40da2e3ebdSchin 	int			*ip;
41da2e3ebdSchin 	char			c;
42da2e3ebdSchin 	int			i;
43da2e3ebdSchin 	unsigned int		u;
44da2e3ebdSchin 	int32_t			*lp;
45da2e3ebdSchin 	Sflong_t		*llp;	/* for long long arithmetic */
46da2e3ebdSchin 	int16_t			s;
477c2fbfb3SApril Chin 	int16_t			*sp;
48da2e3ebdSchin 	double			*dp;	/* for floating point arithmetic */
49da2e3ebdSchin 	Sfdouble_t		*ldp;	/* for long floating point arithmetic */
50da2e3ebdSchin 	struct Namarray		*array;	/* for array node */
51da2e3ebdSchin 	struct Namval		*np;	/* for Namval_t node */
52da2e3ebdSchin 	union Value		*up;	/* for indirect node */
53da2e3ebdSchin 	struct Ufunction 	*rp;	/* shell user defined functions */
54da2e3ebdSchin 	struct Namfun		*funp;	/* discipline pointer */
55da2e3ebdSchin 	struct Namref		*nrp;	/* name reference */
56*b30d1939SAndy Fiddaman 	Nambfp_f		bfp;	/* builtin entry point function pointer */
57da2e3ebdSchin };
58da2e3ebdSchin 
59da2e3ebdSchin #include	"nval.h"
60da2e3ebdSchin 
61da2e3ebdSchin /* used for arrays */
62da2e3ebdSchin 
63da2e3ebdSchin #define ARRAY_MAX 	(1L<<ARRAY_BITS) /* maximum number of elements in an array */
64da2e3ebdSchin #define ARRAY_MASK	(ARRAY_MAX-1)	/* For index values */
65da2e3ebdSchin 
66da2e3ebdSchin #define ARRAY_INCR	32	/* number of elements to grow when array
67da2e3ebdSchin 				   bound exceeded.  Must be a power of 2 */
68da2e3ebdSchin #define ARRAY_FILL	(8L<<ARRAY_BITS)	/* used with nv_putsub() */
69da2e3ebdSchin #define ARRAY_NOCLONE	(16L<<ARRAY_BITS)	/* do not clone array disc */
70da2e3ebdSchin #define ARRAY_NOCHILD   (32L<<ARRAY_BITS)	/* skip compound arrays */
71da2e3ebdSchin #define ARRAY_SETSUB	(64L<<ARRAY_BITS)	/* set subscript */
727c2fbfb3SApril Chin #define ARRAY_NOSCOPE	(128L<<ARRAY_BITS)	/* top level scope only */
737c2fbfb3SApril Chin #define ARRAY_TREE	(256L<<ARRAY_BITS)	/* arrays of compound vars */
74*b30d1939SAndy Fiddaman #if SHOPT_FIXEDARRAY
75*b30d1939SAndy Fiddaman #   define ARRAY_FIXED	ARRAY_NOCLONE		/* For index values */
76*b30d1939SAndy Fiddaman #endif /* SHOPT_FIXEDARRAY */
77*b30d1939SAndy Fiddaman #define NV_FARRAY	0x10000000		/* fixed sized arrays */
78da2e3ebdSchin #define NV_ASETSUB	8			/* set subscript */
79da2e3ebdSchin 
80da2e3ebdSchin /* These flags are used as options to array_get() */
81da2e3ebdSchin #define ARRAY_ASSIGN	0
82da2e3ebdSchin #define ARRAY_LOOKUP	1
83da2e3ebdSchin #define ARRAY_DELETE	2
84da2e3ebdSchin 
85da2e3ebdSchin 
86da2e3ebdSchin struct Namref
87da2e3ebdSchin {
88da2e3ebdSchin 	Namval_t	*np;
89da2e3ebdSchin 	Namval_t	*table;
90da2e3ebdSchin 	Dt_t		*root;
91da2e3ebdSchin 	char		*sub;
92*b30d1939SAndy Fiddaman #if SHOPT_FIXEDARRAY
93*b30d1939SAndy Fiddaman 	int		curi;
94*b30d1939SAndy Fiddaman 	char		dim;
95*b30d1939SAndy Fiddaman #endif /* SHOPT_FIXEDARRAY */
96da2e3ebdSchin };
97da2e3ebdSchin 
98da2e3ebdSchin /* This describes a user shell function node */
99da2e3ebdSchin struct Ufunction
100da2e3ebdSchin {
1017c2fbfb3SApril Chin 	int		*ptree;		/* address of parse tree */
1027c2fbfb3SApril Chin 	int		lineno;		/* line number of function start */
103*b30d1939SAndy Fiddaman 	short		argc;		/* number of references */
104*b30d1939SAndy Fiddaman 	short		running;	/* function is running */
105*b30d1939SAndy Fiddaman 	char		**argv;		/* reference argument list */
1067c2fbfb3SApril Chin 	off_t		hoffset;	/* offset into source or history file */
1077c2fbfb3SApril Chin 	Namval_t	*nspace;	/* pointer to name space */
1087c2fbfb3SApril Chin 	char		*fname;		/* file name where function defined */
1097c2fbfb3SApril Chin 	char		*help;		/* help string */
1107c2fbfb3SApril Chin 	Dt_t		*sdict;		/* dictionary for statics */
1117c2fbfb3SApril Chin 	Dt_t		*fdict;		/* dictionary node belongs to */
1127c2fbfb3SApril Chin 	Namval_t	*np;		/* function node pointer */
113da2e3ebdSchin };
114da2e3ebdSchin 
115da2e3ebdSchin #ifndef ARG_RAW
116da2e3ebdSchin     struct argnod;
117da2e3ebdSchin #endif /* !ARG_RAW */
118da2e3ebdSchin 
119da2e3ebdSchin /* attributes of Namval_t items */
120da2e3ebdSchin 
121da2e3ebdSchin /* The following attributes are for internal use */
12234f9b3eeSRoland Mainz #define NV_NOCHANGE	(NV_EXPORT|NV_IMPORT|NV_RDONLY|NV_TAGGED|NV_NOFREE|NV_ARRAY)
1237c2fbfb3SApril Chin #define NV_ATTRIBUTES	(~(NV_NOSCOPE|NV_ARRAY|NV_NOARRAY|NV_IDENT|NV_ASSIGN|NV_REF|NV_VARNAME|NV_STATIC))
124da2e3ebdSchin #define NV_PARAM	NV_NODISC	/* expansion use positional params */
125da2e3ebdSchin 
126da2e3ebdSchin /* This following are for use with nodes which are not name-values */
127da2e3ebdSchin #define NV_TYPE		0x1000000
1287c2fbfb3SApril Chin #define NV_STATIC	0x2000000
1297c2fbfb3SApril Chin #define NV_COMVAR	0x4000000
130*b30d1939SAndy Fiddaman #define NV_UNJUST	0x800000		/* clear justify attributes */
131da2e3ebdSchin #define NV_FUNCTION	(NV_RJUST|NV_FUNCT)	/* value is shell function */
132da2e3ebdSchin #define NV_FPOSIX	NV_LJUST		/* posix function semantics */
133da2e3ebdSchin #define NV_FTMP		NV_ZFILL		/* function source in tmpfile */
134*b30d1939SAndy Fiddaman #define NV_STATICF	NV_INTEGER		/* static class function */
135da2e3ebdSchin 
136da2e3ebdSchin #define NV_NOPRINT	(NV_LTOU|NV_UTOL)	/* do not print */
137da2e3ebdSchin #define NV_NOALIAS	(NV_NOPRINT|NV_IMPORT)
138da2e3ebdSchin #define NV_NOEXPAND	NV_RJUST		/* do not expand alias */
139da2e3ebdSchin #define NV_BLTIN	(NV_NOPRINT|NV_EXPORT)
140da2e3ebdSchin #define BLT_ENV		(NV_RDONLY)		/* non-stoppable,
141da2e3ebdSchin 						 * can modify enviornment */
142da2e3ebdSchin #define BLT_SPC		(NV_LJUST)		/* special built-ins */
143da2e3ebdSchin #define BLT_EXIT	(NV_RJUST)		/* exit value can be > 255 */
144da2e3ebdSchin #define BLT_DCL		(NV_TAGGED)		/* declaration command */
1457c2fbfb3SApril Chin #define BLT_NOSFIO	(NV_IMPORT)		/* doesn't use sfio */
1467c2fbfb3SApril Chin #define NV_OPTGET	(NV_BINARY)		/* function calls getopts */
1477c2fbfb3SApril Chin #define nv_isref(n)	(nv_isattr((n),NV_REF|NV_TAGGED|NV_FUNCT)==NV_REF)
1487c2fbfb3SApril Chin #define is_abuiltin(n)	(nv_isattr(n,NV_BLTIN|NV_INTEGER)==NV_BLTIN)
1497c2fbfb3SApril Chin #define is_afunction(n)	(nv_isattr(n,NV_FUNCTION|NV_REF)==NV_FUNCTION)
150da2e3ebdSchin #define	nv_funtree(n)	((n)->nvalue.rp->ptree)
151da2e3ebdSchin #define	funptr(n)	((n)->nvalue.bfp)
152da2e3ebdSchin 
153da2e3ebdSchin #define NV_SUBQUOTE	(NV_ADD<<1)	/* used with nv_endsubscript */
154da2e3ebdSchin 
155da2e3ebdSchin /* NAMNOD MACROS */
156da2e3ebdSchin /* ... for attributes */
157da2e3ebdSchin 
158da2e3ebdSchin #define nv_setattr(n,f)	((n)->nvflag = (f))
159da2e3ebdSchin #define nv_context(n)	((void*)(n)->nvfun)		/* for builtins */
160da2e3ebdSchin /* The following are for name references */
161da2e3ebdSchin #define nv_refnode(n)	((n)->nvalue.nrp->np)
162da2e3ebdSchin #define nv_reftree(n)	((n)->nvalue.nrp->root)
163da2e3ebdSchin #define nv_reftable(n)	((n)->nvalue.nrp->table)
164da2e3ebdSchin #define nv_refsub(n)	((n)->nvalue.nrp->sub)
165*b30d1939SAndy Fiddaman #if SHOPT_FIXEDARRAY
166*b30d1939SAndy Fiddaman #   define nv_refindex(n)	((n)->nvalue.nrp->curi)
167*b30d1939SAndy Fiddaman #   define nv_refdimen(n)	((n)->nvalue.nrp->dim)
168*b30d1939SAndy Fiddaman #endif /* SHOPT_FIXEDARRAY */
169da2e3ebdSchin 
170da2e3ebdSchin /* ... etc */
171da2e3ebdSchin 
172da2e3ebdSchin #define nv_setsize(n,s)	((n)->nvsize = (s))
173da2e3ebdSchin #undef nv_size
174da2e3ebdSchin #define nv_size(np)	((np)->nvsize)
1753e14f97fSRoger A. Faulkner #define _nv_hasget(np)  ((np)->nvfun && (np)->nvfun->disc && nv_hasget(np))
1763e14f97fSRoger A. Faulkner #define nv_isnull(np)	(!(np)->nvalue.cp && (nv_isattr(np,NV_SHORT|NV_INTEGER)!=(NV_SHORT|NV_INTEGER)) && !_nv_hasget(np))
177da2e3ebdSchin 
178da2e3ebdSchin /* ...	for arrays */
179da2e3ebdSchin 
180da2e3ebdSchin #define array_elem(ap)	((ap)->nelem&ARRAY_MASK)
181da2e3ebdSchin #define array_assoc(ap)	((ap)->fun)
182da2e3ebdSchin 
183da2e3ebdSchin extern int		array_maxindex(Namval_t*);
184da2e3ebdSchin extern char 		*nv_endsubscript(Namval_t*, char*, int);
185da2e3ebdSchin extern Namfun_t 	*nv_cover(Namval_t*);
186da2e3ebdSchin extern Namarr_t 	*nv_arrayptr(Namval_t*);
18734f9b3eeSRoland Mainz extern int		nv_arrayisset(Namval_t*, Namarr_t*);
1887c2fbfb3SApril Chin extern int		nv_arraysettype(Namval_t*, Namval_t*,const char*,int);
1897c2fbfb3SApril Chin extern int		nv_aimax(Namval_t*);
1907c2fbfb3SApril Chin extern int		nv_atypeindex(Namval_t*, const char*);
191da2e3ebdSchin extern int		nv_setnotify(Namval_t*,char **);
192da2e3ebdSchin extern int		nv_unsetnotify(Namval_t*,char **);
19334f9b3eeSRoland Mainz extern void		nv_setlist(struct argnod*, int, Namval_t*);
1947c2fbfb3SApril Chin extern struct argnod*	nv_onlist(struct argnod*, const char*);
195da2e3ebdSchin extern void 		nv_optimize(Namval_t*);
196da2e3ebdSchin extern void		nv_outname(Sfio_t*,char*, int);
197da2e3ebdSchin extern void 		nv_unref(Namval_t*);
198da2e3ebdSchin extern void		_nv_unset(Namval_t*,int);
1993e14f97fSRoger A. Faulkner extern int		nv_hasget(Namval_t*);
200da2e3ebdSchin extern int		nv_clone(Namval_t*, Namval_t*, int);
2017c2fbfb3SApril Chin void			clone_all_disc(Namval_t*, Namval_t*, int);
2027c2fbfb3SApril Chin extern Namfun_t		*nv_clone_disc(Namfun_t*, int);
2037c2fbfb3SApril Chin extern void		*nv_diropen(Namval_t*, const char*);
204da2e3ebdSchin extern char		*nv_dirnext(void*);
205da2e3ebdSchin extern void		nv_dirclose(void*);
206da2e3ebdSchin extern char		*nv_getvtree(Namval_t*, Namfun_t*);
207da2e3ebdSchin extern void		nv_attribute(Namval_t*, Sfio_t*, char*, int);
208da2e3ebdSchin extern Namval_t		*nv_bfsearch(const char*, Dt_t*, Namval_t**, char**);
209da2e3ebdSchin extern Namval_t		*nv_mkclone(Namval_t*);
210da2e3ebdSchin extern Namval_t		*nv_mktype(Namval_t**, int);
2117c2fbfb3SApril Chin extern Namval_t		*nv_addnode(Namval_t*, int);
212da2e3ebdSchin extern Namval_t		*nv_parent(Namval_t*);
213da2e3ebdSchin extern char		*nv_getbuf(size_t);
214da2e3ebdSchin extern Namval_t		*nv_mount(Namval_t*, const char *name, Dt_t*);
215da2e3ebdSchin extern Namval_t		*nv_arraychild(Namval_t*, Namval_t*, int);
216da2e3ebdSchin extern int		nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);
2177c2fbfb3SApril Chin extern void		nv_outnode(Namval_t*,Sfio_t*, int, int);
2187c2fbfb3SApril Chin extern int		nv_subsaved(Namval_t*);
2197c2fbfb3SApril Chin extern void		nv_typename(Namval_t*, Sfio_t*);
22034f9b3eeSRoland Mainz extern void		nv_newtype(Namval_t*);
221*b30d1939SAndy Fiddaman extern int		nv_istable(Namval_t*);
222*b30d1939SAndy Fiddaman extern size_t		nv_datasize(Namval_t*, size_t*);
223*b30d1939SAndy Fiddaman extern Namfun_t		*nv_mapchar(Namval_t*, const char*);
224*b30d1939SAndy Fiddaman #if SHOPT_FIXEDARRAY
225*b30d1939SAndy Fiddaman    extern int		nv_arrfixed(Namval_t*, Sfio_t*, int, char*);
226*b30d1939SAndy Fiddaman #endif /* SHOPT_FIXEDARRAY */
227da2e3ebdSchin 
228da2e3ebdSchin extern const Namdisc_t	RESTRICTED_disc;
2297c2fbfb3SApril Chin extern const Namdisc_t	ENUM_disc;
230da2e3ebdSchin extern char		nv_local;
231da2e3ebdSchin extern Dtdisc_t		_Nvdisc;
2327c2fbfb3SApril Chin extern const char	*nv_discnames[];
233da2e3ebdSchin extern const char	e_subscript[];
234da2e3ebdSchin extern const char	e_nullset[];
235da2e3ebdSchin extern const char	e_notset[];
236da2e3ebdSchin extern const char	e_noparent[];
2377c2fbfb3SApril Chin extern const char	e_notelem[];
238da2e3ebdSchin extern const char	e_readonly[];
239da2e3ebdSchin extern const char	e_badfield[];
240da2e3ebdSchin extern const char	e_restricted[];
241da2e3ebdSchin extern const char	e_ident[];
242da2e3ebdSchin extern const char	e_varname[];
243da2e3ebdSchin extern const char	e_noalias[];
244da2e3ebdSchin extern const char	e_noarray[];
2457c2fbfb3SApril Chin extern const char	e_notenum[];
246*b30d1939SAndy Fiddaman extern const char	e_nounattr[];
247da2e3ebdSchin extern const char	e_aliname[];
248da2e3ebdSchin extern const char	e_badexport[];
249da2e3ebdSchin extern const char	e_badref[];
25034f9b3eeSRoland Mainz extern const char	e_badsubscript[];
251da2e3ebdSchin extern const char	e_noref[];
252da2e3ebdSchin extern const char	e_selfref[];
253*b30d1939SAndy Fiddaman extern const char	e_staticfun[];
254da2e3ebdSchin extern const char	e_envmarker[];
255da2e3ebdSchin extern const char	e_badlocale[];
256da2e3ebdSchin extern const char	e_loop[];
257da2e3ebdSchin extern const char	e_redef[];
2587c2fbfb3SApril Chin extern const char	e_required[];
2597c2fbfb3SApril Chin extern const char	e_badappend[];
2607c2fbfb3SApril Chin extern const char	e_unknowntype[];
261*b30d1939SAndy Fiddaman extern const char	e_unknownmap[];
262*b30d1939SAndy Fiddaman extern const char	e_mapchararg[];
263*b30d1939SAndy Fiddaman extern const char	e_subcomvar[];
264*b30d1939SAndy Fiddaman extern const char	e_badtypedef[];
265*b30d1939SAndy Fiddaman extern const char	e_typecompat[];
26634f9b3eeSRoland Mainz extern const char	e_globalref[];
267*b30d1939SAndy Fiddaman extern const char	e_tolower[];
268*b30d1939SAndy Fiddaman extern const char	e_toupper[];
269da2e3ebdSchin #endif /* _NV_PRIVATE */
270