/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1982-2007 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * David Korn * * * ***********************************************************************/ #pragma prototyped #ifndef NV_DEFAULT /* * David Korn * AT&T Labs * * Interface definitions of structures for name-value pairs * These structures are used for named variables, functions and aliases * */ #include #include /* for compatibility with old hash library */ #define Hashtab_t Dt_t #define HASH_BUCKET 1 #define HASH_NOSCOPE 2 #define HASH_SCOPE 4 #define hashscope(x) dtvnext(x) typedef struct Namval Namval_t; typedef struct Namfun Namfun_t; typedef struct Namdisc Namdisc_t; typedef struct Nambfun Nambfun_t; typedef struct Namarray Namarr_t; typedef struct Nambltin Nambltin_t; typedef struct Namtype Namtype_t; /* * This defines the template for nodes that have their own assignment * and or lookup functions */ struct Namdisc { size_t dsize; void (*putval)(Namval_t*, const char*, int, Namfun_t*); char *(*getval)(Namval_t*, Namfun_t*); Sfdouble_t (*getnum)(Namval_t*, Namfun_t*); char *(*setdisc)(Namval_t*, const char*, Namval_t*, Namfun_t*); Namval_t *(*createf)(Namval_t*, const char*, int, Namfun_t*); Namfun_t *(*clonef)(Namval_t*, Namval_t*, int, Namfun_t*); char *(*namef)(Namval_t*, Namfun_t*); Namval_t *(*nextf)(Namval_t*, Dt_t*, Namfun_t*); Namval_t *(*typef)(Namval_t*, Namfun_t*); int (*readf)(Namval_t*, Sfio_t*, int, Namfun_t*); }; struct Namfun { const Namdisc_t *disc; char nofree; char funs; unsigned short dsize; Namfun_t *next; char *last; Namval_t *type; }; struct Nambfun { Namfun_t fun; int num; const char **bnames; Namval_t *bltins[1]; }; /* This is an array template header */ struct Namarray { Namfun_t hdr; long nelem; /* number of elements */ void *(*fun)(Namval_t*,const char*,int); /* associative arrays */ Namval_t *parent; /* for multi-dimensional */ }; /* Passed as third argument to a builtin when NV_BLTINOPT is set on node */ struct Nambltin { void *shp; Namval_t *np; void *ptr; void *data; int flags; }; struct Namtype { void *shp; Namval_t *np; const char *optstring; void *optinfof; }; /* attributes of name-value node attribute flags */ #define NV_DEFAULT 0 /* This defines the attributes for an attributed name-value pair node */ struct Namval { Dtlink_t nvlink; /* space for cdt links */ char *nvname; /* pointer to name of the node */ unsigned short nvflag; /* attributes */ unsigned short nvsize; /* size or base */ #ifdef _NV_PRIVATE _NV_PRIVATE #else Namfun_t *nvfun; char *nvalue; char *nvprivate; #endif /* _NV_PRIVATE */ }; #define NV_CLASS ".sh.type" #define NV_MINSZ (sizeof(struct Namval)-sizeof(Dtlink_t)-sizeof(char*)) #define nv_namptr(p,n) ((Namval_t*)((char*)(p)+(n)*NV_MINSZ-sizeof(Dtlink_t))) /* The following attributes are for internal use */ #define NV_NOFREE 0x200 /* don't free the space when releasing value */ #define NV_ARRAY 0x400 /* node is an array */ #define NV_REF 0x4000 /* reference bit */ #define NV_TABLE 0x800 /* node is a dictionary table */ #define NV_IMPORT 0x1000 /* value imported from environment */ #define NV_MINIMAL NV_IMPORT /* node does not contain all fields */ #define NV_INTEGER 0x2 /* integer attribute */ /* The following attributes are valid only when NV_INTEGER is off */ #define NV_LTOU 0x4 /* convert to uppercase */ #define NV_UTOL 0x8 /* convert to lowercase */ #define NV_ZFILL 0x10 /* right justify and fill with leading zeros */ #define NV_RJUST 0x20 /* right justify and blank fill */ #define NV_LJUST 0x40 /* left justify and blank fill */ #define NV_BINARY 0x100 /* fixed size data buffer */ #define NV_RAW NV_LJUST /* used only with NV_BINARY */ #define NV_HOST (NV_RJUST|NV_LJUST) /* map to host filename */ /* The following attributes do not effect the value */ #define NV_RDONLY 0x1 /* readonly bit */ #define NV_EXPORT 0x2000 /* export bit */ #define NV_TAGGED 0x8000 /* user define tag bit */ /* The following are used with NV_INTEGER */ #define NV_SHORT (NV_RJUST) /* when integers are not long */ #define NV_LONG (NV_UTOL) /* for long long and long double */ #define NV_UNSIGN (NV_LTOU) /* for unsigned quantities */ #define NV_DOUBLE (NV_ZFILL) /* for floating point */ #define NV_EXPNOTE (NV_LJUST) /* for scientific notation */ /* options for nv_open */ #define NV_APPEND 0x10000 /* append value */ #define NV_MOVE 0x20000 /* for use with nv_clone */ #define NV_ADD 8 /* add node if not found */ #define NV_ASSIGN NV_NOFREE /* assignment is possible */ #define NV_NOASSIGN 0 /* backward compatibility */ #define NV_NOARRAY 0x200000 /* array name not possible */ #define NV_IARRAY 0x400000 /* for indexed array */ #define NV_NOREF NV_REF /* don't follow reference */ #define NV_IDENT 0x80 /* name must be identifier */ #define NV_VARNAME 0x20000 /* name must be ?(.)id*(.id) */ #define NV_NOADD 0x40000 /* do not add node */ #define NV_NOSCOPE 0x80000 /* look only in current scope */ #define NV_NOFAIL 0x100000 /* return 0 on failure, no msg */ #define NV_NODISC NV_IDENT /* ignore disciplines */ #define NV_FUNCT NV_IDENT /* option for nv_create */ #define NV_BLTINOPT NV_ZFILL /* save state for optimization*/ #define NV_PUBLIC (~(NV_NOSCOPE|NV_ASSIGN|NV_IDENT|NV_VARNAME|NV_NOADD)) /* numeric types */ #define NV_INT16 (NV_SHORT|NV_INTEGER) #define NV_UINT16 (NV_UNSIGN|NV_SHORT|NV_INTEGER) #define NV_INT32 (NV_INTEGER) #define NV_UNT32 (NV_UNSIGN|NV_INTEGER) #define NV_INT64 (NV_LONG|NV_INTEGER) #define NV_UINT64 (NV_UNSIGN|NV_LONG|NV_INTEGER) #define NV_FLOAT (NV_SHORT|NV_DOUBLE|NV_INTEGER) #define NV_LDOUBLE (NV_LONG|NV_DOUBLE|NV_INTEGER) /* name-value pair macros */ #define nv_isattr(np,f) ((np)->nvflag & (f)) #define nv_onattr(n,f) ((n)->nvflag |= (f)) #define nv_offattr(n,f) ((n)->nvflag &= ~(f)) #define nv_isarray(np) (nv_isattr((np),NV_ARRAY)) /* The following are operations for associative arrays */ #define NV_AINIT 1 /* initialize */ #define NV_AFREE 2 /* free array */ #define NV_ANEXT 3 /* advance to next subscript */ #define NV_ANAME 4 /* return subscript name */ #define NV_ADELETE 5 /* delete current subscript */ #define NV_AADD 6 /* add subscript if not found */ #define NV_ACURRENT 7 /* return current subscript Namval_t* */ #define NV_ASETSUB 8 /* set current subscript */ /* The following are for nv_disc */ #define NV_FIRST 1 #define NV_LAST 2 #define NV_POP 3 #define NV_CLONE 4 /* The following are operations for nv_putsub() */ #define ARRAY_BITS 24 #define ARRAY_ADD (1L<