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