2021-10-11 19:38:01 -03:00

254 lines
8.0 KiB
C
Executable File

#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;