xref: /onnv-gate/usr/src/lib/libshell/common/include/name.h (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1982-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                  David Korn <dgk@research.att.com>                   *
184887Schin *                                                                      *
194887Schin ***********************************************************************/
204887Schin #pragma prototyped
214887Schin #ifndef _NV_PRIVATE
224887Schin /*
234887Schin  * This is the implementation header file for name-value pairs
244887Schin  */
254887Schin 
264887Schin #define _NV_PRIVATE	\
274887Schin 	Namfun_t	*nvfun;		/* pointer to trap functions */ \
284887Schin 	union Value	nvalue; 	/* value field */ \
294887Schin 	char		*nvenv;		/* pointer to environment name */
304887Schin 
314887Schin #include	<ast.h>
324887Schin #include	<cdt.h>
334887Schin #include	"shtable.h"
344887Schin 
354887Schin /* Nodes can have all kinds of values */
364887Schin union Value
374887Schin {
384887Schin 	const char		*cp;
394887Schin 	int			*ip;
404887Schin 	char			c;
414887Schin 	int			i;
424887Schin 	unsigned int		u;
434887Schin 	int32_t			*lp;
444887Schin 	Sflong_t		*llp;	/* for long long arithmetic */
454887Schin 	int16_t			s;
468462SApril.Chin@Sun.COM 	int16_t			*sp;
474887Schin 	double			*dp;	/* for floating point arithmetic */
484887Schin 	Sfdouble_t		*ldp;	/* for long floating point arithmetic */
494887Schin 	struct Namarray		*array;	/* for array node */
504887Schin 	struct Namval		*np;	/* for Namval_t node */
514887Schin 	union Value		*up;	/* for indirect node */
524887Schin 	struct Ufunction 	*rp;	/* shell user defined functions */
534887Schin 	struct Namfun		*funp;	/* discipline pointer */
544887Schin 	struct Namref		*nrp;	/* name reference */
554887Schin 	int			(*bfp)(int,char*[],void*);/* builtin entry point function pointer */
564887Schin };
574887Schin 
584887Schin #include	"nval.h"
594887Schin 
604887Schin /* used for arrays */
614887Schin 
624887Schin #define ARRAY_MAX 	(1L<<ARRAY_BITS) /* maximum number of elements in an array */
634887Schin #define ARRAY_MASK	(ARRAY_MAX-1)	/* For index values */
644887Schin 
654887Schin #define ARRAY_INCR	32	/* number of elements to grow when array
664887Schin 				   bound exceeded.  Must be a power of 2 */
674887Schin #define ARRAY_FILL	(8L<<ARRAY_BITS)	/* used with nv_putsub() */
684887Schin #define ARRAY_NOCLONE	(16L<<ARRAY_BITS)	/* do not clone array disc */
694887Schin #define ARRAY_NOCHILD   (32L<<ARRAY_BITS)	/* skip compound arrays */
704887Schin #define ARRAY_SETSUB	(64L<<ARRAY_BITS)	/* set subscript */
718462SApril.Chin@Sun.COM #define ARRAY_NOSCOPE	(128L<<ARRAY_BITS)	/* top level scope only */
728462SApril.Chin@Sun.COM #define ARRAY_TREE	(256L<<ARRAY_BITS)	/* arrays of compound vars */
734887Schin #define NV_ASETSUB	8			/* set subscript */
744887Schin 
754887Schin /* These flags are used as options to array_get() */
764887Schin #define ARRAY_ASSIGN	0
774887Schin #define ARRAY_LOOKUP	1
784887Schin #define ARRAY_DELETE	2
794887Schin 
804887Schin 
814887Schin struct Namref
824887Schin {
834887Schin 	Namval_t	*np;
844887Schin 	Namval_t	*table;
854887Schin 	Dt_t		*root;
864887Schin 	char		*sub;
874887Schin };
884887Schin 
894887Schin /* This describes a user shell function node */
904887Schin struct Ufunction
914887Schin {
928462SApril.Chin@Sun.COM 	int		*ptree;		/* address of parse tree */
938462SApril.Chin@Sun.COM 	int		lineno;		/* line number of function start */
948462SApril.Chin@Sun.COM 	off_t		hoffset;	/* offset into source or history file */
958462SApril.Chin@Sun.COM 	Namval_t	*nspace;	/* pointer to name space */
968462SApril.Chin@Sun.COM 	char		*fname;		/* file name where function defined */
978462SApril.Chin@Sun.COM 	char		*help;		/* help string */
988462SApril.Chin@Sun.COM 	Dt_t		*sdict;		/* dictionary for statics */
998462SApril.Chin@Sun.COM 	Dt_t		*fdict;		/* dictionary node belongs to */
1008462SApril.Chin@Sun.COM 	Namval_t	*np;		/* function node pointer */
1014887Schin };
1024887Schin 
1034887Schin #ifndef ARG_RAW
1044887Schin     struct argnod;
1054887Schin #endif /* !ARG_RAW */
1064887Schin 
1074887Schin /* attributes of Namval_t items */
1084887Schin 
1094887Schin /* The following attributes are for internal use */
11010898Sroland.mainz@nrubsig.org #define NV_NOCHANGE	(NV_EXPORT|NV_IMPORT|NV_RDONLY|NV_TAGGED|NV_NOFREE|NV_ARRAY)
1118462SApril.Chin@Sun.COM #define NV_ATTRIBUTES	(~(NV_NOSCOPE|NV_ARRAY|NV_NOARRAY|NV_IDENT|NV_ASSIGN|NV_REF|NV_VARNAME|NV_STATIC))
1124887Schin #define NV_PARAM	NV_NODISC	/* expansion use positional params */
1134887Schin 
1144887Schin /* This following are for use with nodes which are not name-values */
1154887Schin #define NV_TYPE		0x1000000
1168462SApril.Chin@Sun.COM #define NV_STATIC	0x2000000
1178462SApril.Chin@Sun.COM #define NV_COMVAR	0x4000000
11810898Sroland.mainz@nrubsig.org #define NV_UNJUST	0x8000000		/* clear justify attributes */
1194887Schin #define NV_FUNCTION	(NV_RJUST|NV_FUNCT)	/* value is shell function */
1204887Schin #define NV_FPOSIX	NV_LJUST		/* posix function semantics */
1214887Schin #define NV_FTMP		NV_ZFILL		/* function source in tmpfile */
1224887Schin 
1234887Schin #define NV_NOPRINT	(NV_LTOU|NV_UTOL)	/* do not print */
1244887Schin #define NV_NOALIAS	(NV_NOPRINT|NV_IMPORT)
1254887Schin #define NV_NOEXPAND	NV_RJUST		/* do not expand alias */
1264887Schin #define NV_BLTIN	(NV_NOPRINT|NV_EXPORT)
1274887Schin #define BLT_ENV		(NV_RDONLY)		/* non-stoppable,
1284887Schin 						 * can modify enviornment */
1294887Schin #define BLT_SPC		(NV_LJUST)		/* special built-ins */
1304887Schin #define BLT_EXIT	(NV_RJUST)		/* exit value can be > 255 */
1314887Schin #define BLT_DCL		(NV_TAGGED)		/* declaration command */
1328462SApril.Chin@Sun.COM #define BLT_NOSFIO	(NV_IMPORT)		/* doesn't use sfio */
1338462SApril.Chin@Sun.COM #define NV_OPTGET	(NV_BINARY)		/* function calls getopts */
1348462SApril.Chin@Sun.COM #define nv_isref(n)	(nv_isattr((n),NV_REF|NV_TAGGED|NV_FUNCT)==NV_REF)
1358462SApril.Chin@Sun.COM #define nv_istable(n)	(nv_isattr((n),NV_TABLE|NV_LJUST|NV_RJUST|NV_INTEGER)==NV_TABLE)
1368462SApril.Chin@Sun.COM #define is_abuiltin(n)	(nv_isattr(n,NV_BLTIN|NV_INTEGER)==NV_BLTIN)
1378462SApril.Chin@Sun.COM #define is_afunction(n)	(nv_isattr(n,NV_FUNCTION|NV_REF)==NV_FUNCTION)
1384887Schin #define	nv_funtree(n)	((n)->nvalue.rp->ptree)
1394887Schin #define	funptr(n)	((n)->nvalue.bfp)
1404887Schin 
1414887Schin #define NV_SUBQUOTE	(NV_ADD<<1)	/* used with nv_endsubscript */
1424887Schin 
1434887Schin /* NAMNOD MACROS */
1444887Schin /* ... for attributes */
1454887Schin 
1464887Schin #define nv_setattr(n,f)	((n)->nvflag = (f))
1474887Schin #define nv_context(n)	((void*)(n)->nvfun)		/* for builtins */
1484887Schin /* The following are for name references */
1494887Schin #define nv_refnode(n)	((n)->nvalue.nrp->np)
1504887Schin #define nv_reftree(n)	((n)->nvalue.nrp->root)
1514887Schin #define nv_reftable(n)	((n)->nvalue.nrp->table)
1524887Schin #define nv_refsub(n)	((n)->nvalue.nrp->sub)
1534887Schin 
1544887Schin /* ... etc */
1554887Schin 
1564887Schin #define nv_setsize(n,s)	((n)->nvsize = (s))
1574887Schin #undef nv_size
1584887Schin #define nv_size(np)	((np)->nvsize)
159*12068SRoger.Faulkner@Oracle.COM #define _nv_hasget(np)  ((np)->nvfun && (np)->nvfun->disc && nv_hasget(np))
160*12068SRoger.Faulkner@Oracle.COM #define nv_isnull(np)	(!(np)->nvalue.cp && (nv_isattr(np,NV_SHORT|NV_INTEGER)!=(NV_SHORT|NV_INTEGER)) && !_nv_hasget(np))
1614887Schin 
1624887Schin /* ...	for arrays */
1634887Schin 
1644887Schin #define array_elem(ap)	((ap)->nelem&ARRAY_MASK)
1654887Schin #define array_assoc(ap)	((ap)->fun)
1664887Schin 
1674887Schin extern int		array_maxindex(Namval_t*);
1684887Schin extern char 		*nv_endsubscript(Namval_t*, char*, int);
1694887Schin extern Namfun_t 	*nv_cover(Namval_t*);
1704887Schin extern Namarr_t 	*nv_arrayptr(Namval_t*);
17110898Sroland.mainz@nrubsig.org extern int		nv_arrayisset(Namval_t*, Namarr_t*);
1728462SApril.Chin@Sun.COM extern int		nv_arraysettype(Namval_t*, Namval_t*,const char*,int);
1738462SApril.Chin@Sun.COM extern int		nv_aimax(Namval_t*);
1748462SApril.Chin@Sun.COM extern int		nv_atypeindex(Namval_t*, const char*);
1754887Schin extern int		nv_setnotify(Namval_t*,char **);
1764887Schin extern int		nv_unsetnotify(Namval_t*,char **);
17710898Sroland.mainz@nrubsig.org extern void		nv_setlist(struct argnod*, int, Namval_t*);
1788462SApril.Chin@Sun.COM extern struct argnod*	nv_onlist(struct argnod*, const char*);
1794887Schin extern void 		nv_optimize(Namval_t*);
1804887Schin extern void		nv_outname(Sfio_t*,char*, int);
1814887Schin extern void 		nv_unref(Namval_t*);
1824887Schin extern void		_nv_unset(Namval_t*,int);
183*12068SRoger.Faulkner@Oracle.COM extern int		nv_hasget(Namval_t*);
1844887Schin extern int		nv_clone(Namval_t*, Namval_t*, int);
1858462SApril.Chin@Sun.COM void			clone_all_disc(Namval_t*, Namval_t*, int);
1868462SApril.Chin@Sun.COM extern Namfun_t		*nv_clone_disc(Namfun_t*, int);
1878462SApril.Chin@Sun.COM extern void		*nv_diropen(Namval_t*, const char*);
1884887Schin extern char		*nv_dirnext(void*);
1894887Schin extern void		nv_dirclose(void*);
1904887Schin extern char		*nv_getvtree(Namval_t*, Namfun_t*);
1914887Schin extern void		nv_attribute(Namval_t*, Sfio_t*, char*, int);
1924887Schin extern Namval_t		*nv_bfsearch(const char*, Dt_t*, Namval_t**, char**);
1934887Schin extern Namval_t		*nv_mkclone(Namval_t*);
1944887Schin extern Namval_t		*nv_mktype(Namval_t**, int);
1958462SApril.Chin@Sun.COM extern Namval_t		*nv_addnode(Namval_t*, int);
1964887Schin extern Namval_t		*nv_parent(Namval_t*);
1974887Schin extern char		*nv_getbuf(size_t);
1984887Schin extern Namval_t		*nv_mount(Namval_t*, const char *name, Dt_t*);
1994887Schin extern Namval_t		*nv_arraychild(Namval_t*, Namval_t*, int);
2004887Schin extern int		nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);
2018462SApril.Chin@Sun.COM extern void		nv_outnode(Namval_t*,Sfio_t*, int, int);
2028462SApril.Chin@Sun.COM extern int		nv_subsaved(Namval_t*);
2038462SApril.Chin@Sun.COM extern void		nv_typename(Namval_t*, Sfio_t*);
20410898Sroland.mainz@nrubsig.org extern void		nv_newtype(Namval_t*);
2054887Schin 
2064887Schin extern const Namdisc_t	RESTRICTED_disc;
2078462SApril.Chin@Sun.COM extern const Namdisc_t	ENUM_disc;
2084887Schin extern char		nv_local;
2094887Schin extern Dtdisc_t		_Nvdisc;
2108462SApril.Chin@Sun.COM extern const char	*nv_discnames[];
2114887Schin extern const char	e_subscript[];
2124887Schin extern const char	e_nullset[];
2134887Schin extern const char	e_notset[];
2144887Schin extern const char	e_noparent[];
2158462SApril.Chin@Sun.COM extern const char	e_notelem[];
2164887Schin extern const char	e_readonly[];
2174887Schin extern const char	e_badfield[];
2184887Schin extern const char	e_restricted[];
2194887Schin extern const char	e_ident[];
2204887Schin extern const char	e_varname[];
2214887Schin extern const char	e_noalias[];
2224887Schin extern const char	e_noarray[];
2238462SApril.Chin@Sun.COM extern const char	e_notenum[];
2244887Schin extern const char	e_aliname[];
2254887Schin extern const char	e_badexport[];
2264887Schin extern const char	e_badref[];
22710898Sroland.mainz@nrubsig.org extern const char	e_badsubscript[];
2284887Schin extern const char	e_noref[];
2294887Schin extern const char	e_selfref[];
2304887Schin extern const char	e_envmarker[];
2314887Schin extern const char	e_badlocale[];
2324887Schin extern const char	e_loop[];
2334887Schin extern const char	e_redef[];
2348462SApril.Chin@Sun.COM extern const char	e_required[];
2358462SApril.Chin@Sun.COM extern const char	e_badappend[];
2368462SApril.Chin@Sun.COM extern const char	e_unknowntype[];
23710898Sroland.mainz@nrubsig.org extern const char	e_globalref[];
2384887Schin #endif /* _NV_PRIVATE */
239