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_DEFAULT 22da2e3ebdSchin /* 23da2e3ebdSchin * David Korn 24da2e3ebdSchin * AT&T Labs 25da2e3ebdSchin * 26da2e3ebdSchin * Interface definitions of structures for name-value pairs 27da2e3ebdSchin * These structures are used for named variables, functions and aliases 28da2e3ebdSchin * 29da2e3ebdSchin */ 30da2e3ebdSchin 31da2e3ebdSchin 32da2e3ebdSchin #include <ast.h> 33da2e3ebdSchin #include <cdt.h> 347c2fbfb3SApril Chin #include <option.h> 35da2e3ebdSchin 36da2e3ebdSchin /* for compatibility with old hash library */ 37da2e3ebdSchin #define Hashtab_t Dt_t 38da2e3ebdSchin #define HASH_BUCKET 1 39da2e3ebdSchin #define HASH_NOSCOPE 2 40da2e3ebdSchin #define HASH_SCOPE 4 41da2e3ebdSchin #define hashscope(x) dtvnext(x) 42da2e3ebdSchin 43da2e3ebdSchin typedef struct Namval Namval_t; 44da2e3ebdSchin typedef struct Namfun Namfun_t; 45da2e3ebdSchin typedef struct Namdisc Namdisc_t; 46da2e3ebdSchin typedef struct Nambfun Nambfun_t; 47da2e3ebdSchin typedef struct Namarray Namarr_t; 487c2fbfb3SApril Chin typedef struct Namdecl Namdecl_t; 49da2e3ebdSchin 50da2e3ebdSchin /* 51da2e3ebdSchin * This defines the template for nodes that have their own assignment 52da2e3ebdSchin * and or lookup functions 53da2e3ebdSchin */ 54da2e3ebdSchin struct Namdisc 55da2e3ebdSchin { 56da2e3ebdSchin size_t dsize; 57da2e3ebdSchin void (*putval)(Namval_t*, const char*, int, Namfun_t*); 58da2e3ebdSchin char *(*getval)(Namval_t*, Namfun_t*); 59da2e3ebdSchin Sfdouble_t (*getnum)(Namval_t*, Namfun_t*); 60da2e3ebdSchin char *(*setdisc)(Namval_t*, const char*, Namval_t*, Namfun_t*); 61da2e3ebdSchin Namval_t *(*createf)(Namval_t*, const char*, int, Namfun_t*); 62da2e3ebdSchin Namfun_t *(*clonef)(Namval_t*, Namval_t*, int, Namfun_t*); 63da2e3ebdSchin char *(*namef)(Namval_t*, Namfun_t*); 64da2e3ebdSchin Namval_t *(*nextf)(Namval_t*, Dt_t*, Namfun_t*); 65da2e3ebdSchin Namval_t *(*typef)(Namval_t*, Namfun_t*); 66da2e3ebdSchin int (*readf)(Namval_t*, Sfio_t*, int, Namfun_t*); 677c2fbfb3SApril Chin int (*writef)(Namval_t*, Sfio_t*, int, Namfun_t*); 68da2e3ebdSchin }; 69da2e3ebdSchin 70da2e3ebdSchin struct Namfun 71da2e3ebdSchin { 72da2e3ebdSchin const Namdisc_t *disc; 73da2e3ebdSchin char nofree; 747c2fbfb3SApril Chin unsigned char subshell; 75*b30d1939SAndy Fiddaman uint32_t dsize; 76da2e3ebdSchin Namfun_t *next; 77da2e3ebdSchin char *last; 78da2e3ebdSchin Namval_t *type; 79da2e3ebdSchin }; 80da2e3ebdSchin 81da2e3ebdSchin struct Nambfun 82da2e3ebdSchin { 83da2e3ebdSchin Namfun_t fun; 84da2e3ebdSchin int num; 85da2e3ebdSchin const char **bnames; 86da2e3ebdSchin Namval_t *bltins[1]; 87da2e3ebdSchin }; 88da2e3ebdSchin 89da2e3ebdSchin /* This is an array template header */ 90da2e3ebdSchin struct Namarray 91da2e3ebdSchin { 92da2e3ebdSchin Namfun_t hdr; 93da2e3ebdSchin long nelem; /* number of elements */ 94da2e3ebdSchin void *(*fun)(Namval_t*,const char*,int); /* associative arrays */ 95*b30d1939SAndy Fiddaman void *fixed; /* for fixed sized arrays */ 967c2fbfb3SApril Chin Dt_t *table; /* for subscripts */ 977c2fbfb3SApril Chin void *scope; /* non-zerp when scoped */ 98da2e3ebdSchin }; 99da2e3ebdSchin 1007c2fbfb3SApril Chin /* The context pointer for declaration command */ 1017c2fbfb3SApril Chin struct Namdecl 102da2e3ebdSchin { 1037c2fbfb3SApril Chin Namval_t *tp; /* point to type */ 104da2e3ebdSchin const char *optstring; 105da2e3ebdSchin void *optinfof; 106da2e3ebdSchin }; 107da2e3ebdSchin 108da2e3ebdSchin /* attributes of name-value node attribute flags */ 109da2e3ebdSchin 110da2e3ebdSchin #define NV_DEFAULT 0 111da2e3ebdSchin /* This defines the attributes for an attributed name-value pair node */ 112da2e3ebdSchin struct Namval 113da2e3ebdSchin { 114da2e3ebdSchin Dtlink_t nvlink; /* space for cdt links */ 115da2e3ebdSchin char *nvname; /* pointer to name of the node */ 116*b30d1939SAndy Fiddaman #if _ast_sizeof_pointer == 8 117*b30d1939SAndy Fiddaman # if _ast_intswap > 0 118*b30d1939SAndy Fiddaman unsigned short nvflag; /* attributes */ 119*b30d1939SAndy Fiddaman unsigned short pad1; 120*b30d1939SAndy Fiddaman # else 121*b30d1939SAndy Fiddaman unsigned short pad1; 122*b30d1939SAndy Fiddaman unsigned short nvflag; /* attributes */ 123*b30d1939SAndy Fiddaman # endif 124*b30d1939SAndy Fiddaman uint32_t nvsize; /* size or base */ 125*b30d1939SAndy Fiddaman #else 126da2e3ebdSchin unsigned short nvflag; /* attributes */ 127da2e3ebdSchin unsigned short nvsize; /* size or base */ 128*b30d1939SAndy Fiddaman #endif 129da2e3ebdSchin #ifdef _NV_PRIVATE 130da2e3ebdSchin _NV_PRIVATE 131da2e3ebdSchin #else 132da2e3ebdSchin Namfun_t *nvfun; 133da2e3ebdSchin char *nvalue; 134da2e3ebdSchin char *nvprivate; 135da2e3ebdSchin #endif /* _NV_PRIVATE */ 136da2e3ebdSchin }; 137da2e3ebdSchin 138da2e3ebdSchin #define NV_CLASS ".sh.type" 1397c2fbfb3SApril Chin #define NV_DATA "_" /* special class or instance variable */ 140da2e3ebdSchin #define NV_MINSZ (sizeof(struct Namval)-sizeof(Dtlink_t)-sizeof(char*)) 141da2e3ebdSchin #define nv_namptr(p,n) ((Namval_t*)((char*)(p)+(n)*NV_MINSZ-sizeof(Dtlink_t))) 142da2e3ebdSchin 143da2e3ebdSchin /* The following attributes are for internal use */ 144da2e3ebdSchin #define NV_NOFREE 0x200 /* don't free the space when releasing value */ 145da2e3ebdSchin #define NV_ARRAY 0x400 /* node is an array */ 146da2e3ebdSchin #define NV_REF 0x4000 /* reference bit */ 147da2e3ebdSchin #define NV_TABLE 0x800 /* node is a dictionary table */ 148da2e3ebdSchin #define NV_IMPORT 0x1000 /* value imported from environment */ 149da2e3ebdSchin #define NV_MINIMAL NV_IMPORT /* node does not contain all fields */ 150da2e3ebdSchin 151da2e3ebdSchin #define NV_INTEGER 0x2 /* integer attribute */ 152da2e3ebdSchin /* The following attributes are valid only when NV_INTEGER is off */ 153da2e3ebdSchin #define NV_LTOU 0x4 /* convert to uppercase */ 154da2e3ebdSchin #define NV_UTOL 0x8 /* convert to lowercase */ 155da2e3ebdSchin #define NV_ZFILL 0x10 /* right justify and fill with leading zeros */ 156da2e3ebdSchin #define NV_RJUST 0x20 /* right justify and blank fill */ 157da2e3ebdSchin #define NV_LJUST 0x40 /* left justify and blank fill */ 158da2e3ebdSchin #define NV_BINARY 0x100 /* fixed size data buffer */ 159da2e3ebdSchin #define NV_RAW NV_LJUST /* used only with NV_BINARY */ 160da2e3ebdSchin #define NV_HOST (NV_RJUST|NV_LJUST) /* map to host filename */ 161da2e3ebdSchin 162da2e3ebdSchin /* The following attributes do not effect the value */ 163da2e3ebdSchin #define NV_RDONLY 0x1 /* readonly bit */ 164da2e3ebdSchin #define NV_EXPORT 0x2000 /* export bit */ 165da2e3ebdSchin #define NV_TAGGED 0x8000 /* user define tag bit */ 166da2e3ebdSchin 167da2e3ebdSchin /* The following are used with NV_INTEGER */ 168da2e3ebdSchin #define NV_SHORT (NV_RJUST) /* when integers are not long */ 169da2e3ebdSchin #define NV_LONG (NV_UTOL) /* for long long and long double */ 170da2e3ebdSchin #define NV_UNSIGN (NV_LTOU) /* for unsigned quantities */ 1717c2fbfb3SApril Chin #define NV_DOUBLE (NV_INTEGER|NV_ZFILL) /* for floating point */ 172da2e3ebdSchin #define NV_EXPNOTE (NV_LJUST) /* for scientific notation */ 1737c2fbfb3SApril Chin #define NV_HEXFLOAT (NV_LTOU) /* for C99 base16 float notation */ 174da2e3ebdSchin 175da2e3ebdSchin /* options for nv_open */ 176da2e3ebdSchin 177da2e3ebdSchin #define NV_APPEND 0x10000 /* append value */ 1787c2fbfb3SApril Chin #define NV_MOVE 0x8000000 /* for use with nv_clone */ 179da2e3ebdSchin #define NV_ADD 8 180da2e3ebdSchin /* add node if not found */ 181da2e3ebdSchin #define NV_ASSIGN NV_NOFREE /* assignment is possible */ 182da2e3ebdSchin #define NV_NOASSIGN 0 /* backward compatibility */ 183da2e3ebdSchin #define NV_NOARRAY 0x200000 /* array name not possible */ 184da2e3ebdSchin #define NV_IARRAY 0x400000 /* for indexed array */ 185da2e3ebdSchin #define NV_NOREF NV_REF /* don't follow reference */ 186da2e3ebdSchin #define NV_IDENT 0x80 /* name must be identifier */ 187da2e3ebdSchin #define NV_VARNAME 0x20000 /* name must be ?(.)id*(.id) */ 188da2e3ebdSchin #define NV_NOADD 0x40000 /* do not add node */ 189da2e3ebdSchin #define NV_NOSCOPE 0x80000 /* look only in current scope */ 190da2e3ebdSchin #define NV_NOFAIL 0x100000 /* return 0 on failure, no msg */ 191da2e3ebdSchin #define NV_NODISC NV_IDENT /* ignore disciplines */ 192da2e3ebdSchin 193da2e3ebdSchin #define NV_FUNCT NV_IDENT /* option for nv_create */ 1947c2fbfb3SApril Chin #define NV_BLTINOPT NV_ZFILL /* mark builtins in libcmd */ 195da2e3ebdSchin 196da2e3ebdSchin #define NV_PUBLIC (~(NV_NOSCOPE|NV_ASSIGN|NV_IDENT|NV_VARNAME|NV_NOADD)) 197da2e3ebdSchin 198da2e3ebdSchin /* numeric types */ 1997c2fbfb3SApril Chin #define NV_INT16P (NV_LJUST|NV_SHORT|NV_INTEGER) 200da2e3ebdSchin #define NV_INT16 (NV_SHORT|NV_INTEGER) 201da2e3ebdSchin #define NV_UINT16 (NV_UNSIGN|NV_SHORT|NV_INTEGER) 2027c2fbfb3SApril Chin #define NV_UINT16P (NV_LJUSTNV_UNSIGN|NV_SHORT|NV_INTEGER) 203da2e3ebdSchin #define NV_INT32 (NV_INTEGER) 204da2e3ebdSchin #define NV_UNT32 (NV_UNSIGN|NV_INTEGER) 205da2e3ebdSchin #define NV_INT64 (NV_LONG|NV_INTEGER) 206da2e3ebdSchin #define NV_UINT64 (NV_UNSIGN|NV_LONG|NV_INTEGER) 2077c2fbfb3SApril Chin #define NV_FLOAT (NV_SHORT|NV_DOUBLE) 2087c2fbfb3SApril Chin #define NV_LDOUBLE (NV_LONG|NV_DOUBLE) 209da2e3ebdSchin 210da2e3ebdSchin /* name-value pair macros */ 211da2e3ebdSchin #define nv_isattr(np,f) ((np)->nvflag & (f)) 212da2e3ebdSchin #define nv_onattr(n,f) ((n)->nvflag |= (f)) 213da2e3ebdSchin #define nv_offattr(n,f) ((n)->nvflag &= ~(f)) 214da2e3ebdSchin #define nv_isarray(np) (nv_isattr((np),NV_ARRAY)) 215da2e3ebdSchin 216da2e3ebdSchin /* The following are operations for associative arrays */ 217da2e3ebdSchin #define NV_AINIT 1 /* initialize */ 218da2e3ebdSchin #define NV_AFREE 2 /* free array */ 219da2e3ebdSchin #define NV_ANEXT 3 /* advance to next subscript */ 220da2e3ebdSchin #define NV_ANAME 4 /* return subscript name */ 221da2e3ebdSchin #define NV_ADELETE 5 /* delete current subscript */ 222da2e3ebdSchin #define NV_AADD 6 /* add subscript if not found */ 223da2e3ebdSchin #define NV_ACURRENT 7 /* return current subscript Namval_t* */ 2247c2fbfb3SApril Chin #define NV_ASETSUB 8 /* set current subscript */ 225da2e3ebdSchin 226da2e3ebdSchin /* The following are for nv_disc */ 227da2e3ebdSchin #define NV_FIRST 1 228da2e3ebdSchin #define NV_LAST 2 229da2e3ebdSchin #define NV_POP 3 230da2e3ebdSchin #define NV_CLONE 4 231da2e3ebdSchin 232da2e3ebdSchin /* The following are operations for nv_putsub() */ 2337c2fbfb3SApril Chin #define ARRAY_BITS 22 234da2e3ebdSchin #define ARRAY_ADD (1L<<ARRAY_BITS) /* add subscript if not found */ 235da2e3ebdSchin #define ARRAY_SCAN (2L<<ARRAY_BITS) /* For ${array[@]} */ 236da2e3ebdSchin #define ARRAY_UNDEF (4L<<ARRAY_BITS) /* For ${array} */ 237da2e3ebdSchin 238da2e3ebdSchin 239da2e3ebdSchin /* These are disciplines provided by the library for use with nv_discfun */ 240da2e3ebdSchin #define NV_DCADD 0 /* used to add named disciplines */ 241da2e3ebdSchin #define NV_DCRESTRICT 1 /* variable that are restricted in rsh */ 242da2e3ebdSchin 243da2e3ebdSchin #if defined(__EXPORT__) && defined(_DLL) 244da2e3ebdSchin # ifdef _BLD_shell 245da2e3ebdSchin # define extern __EXPORT__ 246da2e3ebdSchin # else 247da2e3ebdSchin # define extern __IMPORT__ 248da2e3ebdSchin # endif /* _BLD_shell */ 249da2e3ebdSchin #endif /* _DLL */ 250da2e3ebdSchin /* prototype for array interface*/ 2517c2fbfb3SApril Chin extern Namarr_t *nv_arrayptr(Namval_t*); 252da2e3ebdSchin extern Namarr_t *nv_setarray(Namval_t*,void*(*)(Namval_t*,const char*,int)); 2537c2fbfb3SApril Chin extern int nv_arraynsub(Namarr_t*); 254da2e3ebdSchin extern void *nv_associative(Namval_t*,const char*,int); 255da2e3ebdSchin extern int nv_aindex(Namval_t*); 256da2e3ebdSchin extern int nv_nextsub(Namval_t*); 257da2e3ebdSchin extern char *nv_getsub(Namval_t*); 258da2e3ebdSchin extern Namval_t *nv_putsub(Namval_t*, char*, long); 259da2e3ebdSchin extern Namval_t *nv_opensub(Namval_t*); 260da2e3ebdSchin 261da2e3ebdSchin /* name-value pair function prototypes */ 262da2e3ebdSchin extern int nv_adddisc(Namval_t*, const char**, Namval_t**); 263da2e3ebdSchin extern int nv_clone(Namval_t*, Namval_t*, int); 264da2e3ebdSchin extern void nv_close(Namval_t*); 265da2e3ebdSchin extern void *nv_context(Namval_t*); 266da2e3ebdSchin extern Namval_t *nv_create(const char*, Dt_t*, int,Namfun_t*); 2677c2fbfb3SApril Chin extern void nv_delete(Namval_t*, Dt_t*, int); 268da2e3ebdSchin extern Dt_t *nv_dict(Namval_t*); 269da2e3ebdSchin extern Sfdouble_t nv_getn(Namval_t*, Namfun_t*); 270da2e3ebdSchin extern Sfdouble_t nv_getnum(Namval_t*); 271da2e3ebdSchin extern char *nv_getv(Namval_t*, Namfun_t*); 272da2e3ebdSchin extern char *nv_getval(Namval_t*); 273da2e3ebdSchin extern Namfun_t *nv_hasdisc(Namval_t*, const Namdisc_t*); 274da2e3ebdSchin extern int nv_isnull(Namval_t*); 2757c2fbfb3SApril Chin extern Namfun_t *nv_isvtree(Namval_t*); 276da2e3ebdSchin extern Namval_t *nv_lastdict(void); 2777c2fbfb3SApril Chin extern Namval_t *nv_mkinttype(char*, size_t, int, const char*, Namdisc_t*); 278da2e3ebdSchin extern void nv_newattr(Namval_t*,unsigned,int); 27934f9b3eeSRoland Mainz extern void nv_newtype(Namval_t*); 280da2e3ebdSchin extern Namval_t *nv_open(const char*,Dt_t*,int); 281da2e3ebdSchin extern void nv_putval(Namval_t*,const char*,int); 282da2e3ebdSchin extern void nv_putv(Namval_t*,const char*,int,Namfun_t*); 2837c2fbfb3SApril Chin extern int nv_rename(Namval_t*,int); 284da2e3ebdSchin extern int nv_scan(Dt_t*,void(*)(Namval_t*,void*),void*,int,int); 285da2e3ebdSchin extern char *nv_setdisc(Namval_t*,const char*,Namval_t*,Namfun_t*); 286da2e3ebdSchin extern void nv_setref(Namval_t*, Dt_t*,int); 287da2e3ebdSchin extern int nv_settype(Namval_t*, Namval_t*, int); 288da2e3ebdSchin extern void nv_setvec(Namval_t*,int,int,char*[]); 289da2e3ebdSchin extern void nv_setvtree(Namval_t*); 290da2e3ebdSchin extern int nv_setsize(Namval_t*,int); 291da2e3ebdSchin extern Namfun_t *nv_disc(Namval_t*,Namfun_t*,int); 2927c2fbfb3SApril Chin extern void nv_unset(Namval_t*); /*obsolete */ 2937c2fbfb3SApril Chin extern void _nv_unset(Namval_t*,int); 294da2e3ebdSchin extern Namval_t *nv_search(const char *, Dt_t*, int); 295da2e3ebdSchin extern char *nv_name(Namval_t*); 296da2e3ebdSchin extern Namval_t *nv_type(Namval_t*); 2977c2fbfb3SApril Chin extern void nv_addtype(Namval_t*,const char*, Optdisc_t*, size_t); 298da2e3ebdSchin extern const Namdisc_t *nv_discfun(int); 299da2e3ebdSchin 300da2e3ebdSchin #ifdef _DLL 301da2e3ebdSchin # undef extern 302da2e3ebdSchin #endif /* _DLL */ 303da2e3ebdSchin 3047c2fbfb3SApril Chin #define nv_unset(np) _nv_unset(np,0) 305da2e3ebdSchin #define nv_size(np) nv_setsize((np),-1) 306da2e3ebdSchin #define nv_stack(np,nf) nv_disc(np,nf,0) 307da2e3ebdSchin 308da2e3ebdSchin #if 0 309da2e3ebdSchin /* 310da2e3ebdSchin * The names of many functions were changed in early '95 311da2e3ebdSchin * Here is a mapping to the old names 312da2e3ebdSchin */ 313da2e3ebdSchin # define nv_istype(np) nv_isattr(np) 314da2e3ebdSchin # define nv_newtype(np) nv_newattr(np) 315da2e3ebdSchin # define nv_namset(np,a,b) nv_open(np,a,b) 3167c2fbfb3SApril Chin # define nv_free(np) nv_unset(np,0) 317da2e3ebdSchin # define nv_settype(np,a,b,c) nv_setdisc(np,a,b,c) 318da2e3ebdSchin # define nv_search(np,a,b) nv_open(np,a,((b)?0:NV_NOADD)) 319da2e3ebdSchin # define settype setdisc 320da2e3ebdSchin #endif 321da2e3ebdSchin 322da2e3ebdSchin #endif /* NV_DEFAULT */ 323