#ident "@(#)name.h 1.8 95/01/10 SMI" /* From AT&T Toolchest */ /* * Definitions of structures for name-value pairs * These structures are used for named variables, functions and aliases */ #include "sh_config.h" #include "flags.h" /* Nodes can have all kinds of values */ union Namval { char *cp; int *ip; char c; int i; unsigned u; long *lp; double *dp; /* for floating point arithmetic */ struct Namaray *aray; /* for array node */ union Namval *up; /* for indirect node */ struct Bfunction *fp; /* builtin-function like $RANDOM */ struct Ufunction *rp; /* shell user defined functions */ int (*ifp)(); /* integer function pointer */ }; /* each namnod and each array element has one of these */ struct Nodval { unsigned namflg; /* attributes */ union Namval namval; /* value field */ char *namenv; /* pointer to environment name */ short namsz; /* size of item */ }; #ifdef MULTIDIM # define NDIM 7 #else # define NDIM 1 #endif /* MULTIDIM */ /* This is an array template */ struct Namaray { unsigned short cur[NDIM+1]; /* current element */ unsigned short maxi; /* maximum index of array */ unsigned short nelem; /* number of elements */ struct Nodval *val[1]; /* array of value holders */ }; /* this bits are or'd with adot for a[*] and a[@] */ #define ARRAY_STAR 010000 #define ARRAY_AT 020000 #define ARRAY_UNDEF 040000 #define ARRAY_MASK 07777 /* ARRMAX cannot be larger than this */ #define ARRMAX 1024 /* maximum number of elements in an array */ #define ARRINCR 16 /* number of elements to grow when array bound exceeded Must be a power of 2 */ /* These flags are used as options to array_get() */ #define A_ASSIGN 0 #define A_LOOKUP 1 #define A_DELETE 2 /* This is a template for a storage tree */ struct Amemory { struct Amemory *nexttree; /* search trees can be chained */ short memsize; /* number of listheads */ struct namnod *memhead[1]; /* listhead pointers */ }; /* This describes a named node */ struct namnod { struct namnod *namnxt; /* pointer to next namnod */ char *namid; /* pointer to name of item */ struct Nodval value; /* determines value of the item */ }; /* This describes a builtin function node */ struct Bfunction { long (*f_vp)(); /* value function */ int (*f_ap)(); /* assignment function */ }; /* This describes a user defined function node */ struct Ufunction { off_t hoffset; /* offset into history file */ int *ptree; /* address of parse tree */ }; #ifndef NULL # define NULL 0 #endif /* types of namenode items */ #define N_DEFAULT 0 #define N_INTGER I_FLAG /* integer type */ #define N_AVAIL B_FLAG /* node is logically non-existent, blocked */ #define N_CWRIT C_FLAG /* make copy of node on assignment */ #define N_ARRAY F_FLAG /* node is an array */ #define N_INDIRECT P_FLAG /* value is a pointer to a value node */ #define N_ALLOC V_FLAG /* don't allocate space for the value */ #define N_FREE G_FLAG /* don't free the space when releasing value */ #define N_LTOU U_FLAG /* convert to uppercase */ #define N_UTOL L_FLAG /* convert to lowercase */ #define N_ZFILL Z_FLAG /* right justify and fill with leading zeros */ #define N_RJUST W_FLAG /* right justify and blank fill */ #define N_LJUST S_FLAG /* left justify and blank fill */ #define N_HOST M_FLAG /* convert to host file name in non-unix */ #define N_EXPORT X_FLAG /* export bit */ #define N_RDONLY R_FLAG /* readonly bit */ #define N_RESTRICT V_FLAG /* restricted bit */ #define N_IMPORT N_FLAG /* imported from environment */ /* The following are used with INT_FLG */ #define N_BLTNOD S_FLAG /* builtin function flag */ #define N_DOUBLE M_FLAG /* for floating point */ #define N_EXPNOTE L_FLAG /* for scientific notation */ #define NO_LONG L_FLAG /* when integers are not long */ #define N_UNSIGN U_FLAG /* for unsigned quantities */ #define N_CPOINTER W_FLAG /* for pointer */ #define N_FUNCTION (N_INTGER|Z_FLAG)/* for function trees */ #define NO_CHANGE (N_EXPORT|N_IMPORT|N_RDONLY|E_FLAG|T_FLAG|N_FREE) #define NO_PRINT (N_LTOU|N_UTOL) #define NO_ALIAS (NO_PRINT|N_FLAG) #define N_BLTIN (NO_PRINT|N_EXPORT) #define BLT_SPC (R_FLAG) /* errors cause script to terminate */ #define BLT_FSUB (Z_FLAG) /* fork for command subsitution */ #define BLT_ENV (R_FLAG|Z_FLAG|M_FLAG) /* no separate environment */ #define BLT_DCL (S_FLAG) /* declaration command */ #define is_abuiltin(n) (nam_istype(n,N_BLTIN)==N_BLTIN) #define is_afunction(n) (nam_istype(n,N_FUNCTION)==N_FUNCTION) #define is_asbuiltin(n) (nam_istype(n, BLT_SPC) == BLT_SPC) /* XPG4 */ #define funtree(n) ((n)->value.namval.rp->ptree) #define funptr(n) ((n)->value.namval.ifp) /* namnod lookup options */ #define N_ADD 1 /* add node if not found */ #define N_NULL 2 /* null value returns NULL */ #define N_NOSCOPE G_FLAG /* look only in current scope */ /* NAMNOD MACROS */ /* ... for attributes */ #define namflag(n) (n)->value.namflg #define nam_istype(n,f) (namflag(n) & (f)) #ifdef KSHELL # define nam_ontype(n,f) ((n)->value.namflg |= f) # define nam_typeset(n,f) ((n)->value.namflg = f) # define nam_offtype(n,f) ((n)->value.namflg &= f) # ifdef PROTO extern char *nam_fstrval(struct namnod*); # else extern char *nam_fstrval(); # endif /* PROTO */ #else # define nam_ontype(n,f) (nam_newtype (n, namflag(n)|(f))) # define nam_typeset(n,f) (nam_newtype (n, f)) # define nam_offtype(n,f) (nam_newtype (n, namflag(n)&(f))) #endif /* KSHELL */ /* ... etc */ #define isnull(n) ((n)->value.namval.cp == NULL) /* strings only */ #ifdef cray # define _MARK_BIT_ 0x2000000000000000 #else # define _MARK_BIT_ 01 #endif /* cray */ #define freeble(nv) (((int)(nv)) & _MARK_BIT_) #define mrkfree(nv) ((struct Nodval*)(((int)(nv)) | _MARK_BIT_)) #define unmark(nv) ((struct Nodval*)(((int)(nv)) & ~_MARK_BIT_)) /* ... for arrays */ #define array_ptr(n) ((n)->value.namval.aray) #define array_elem(n) array_ptr(n)->nelem #ifdef PROTO extern void array_dotset(struct namnod*,int); extern struct Nodval *array_find(struct namnod*,int); extern struct Namaray *array_grow(struct Namaray*,int); extern char *array_subscript(struct namnod*,char*); extern int array_next(struct namnod*); #else extern void array_dotset(); extern struct Nodval *array_find(); extern struct Namaray *array_grow(); extern char *array_subscript(); extern int array_next(); #endif /* PROTO */ #ifdef NAME_SCOPE extern struct namnod *nam_copy(); #endif /* NAME_SCOPE */ #define new_of(type,x) ((type*)malloc((unsigned)sizeof(type)+(x))) #ifdef PROTO extern char *malloc(unsigned); extern struct namnod *nam_alloc(const char*); extern void nam_free(struct namnod*); extern void nam_fputval(struct namnod*,char*); extern int nam_hash(const char*); extern void nam_init(void); extern void nam_link(struct namnod*,struct Amemory*); extern void nam_longput(struct namnod*,long); extern void nam_newtype(struct namnod*,unsigned,int); extern void nam_putval(struct namnod*,char*); struct argnod; /* struct not declared yet */ extern void nam_scope(struct argnod*); extern struct namnod *nam_search(const char*,struct Amemory*,int); extern char *nam_strval(struct namnod*); extern void nam_unscope(void); #else extern char *malloc(); extern struct namnod *nam_alloc(); extern void nam_free(); extern void nam_fputval(); extern int nam_hash(); extern void nam_init(); extern void nam_link(); extern void nam_longput(); extern void nam_newtype(); extern void nam_putval(); extern void nam_scope(); extern struct namnod *nam_search(); extern char *nam_strval(); extern void nam_unscope(); #endif /* PROTO */ extern const char e_synbad[]; extern const char e_subscript[]; extern const char e_number[]; extern const char e_nullset[]; extern const char e_notset[]; extern const char e_readonly[]; extern const char e_restricted[]; extern const char e_ident[]; extern const char e_intbase[]; extern const char e_format[]; extern const char e_aliname[]; extern int sh_lastbase;