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