1*7dd7cddfSDavid du Colombier /* $Id: table.h,v 1.3 1994/05/31 13:34:34 michael Exp $ */ 2*7dd7cddfSDavid du Colombier 3*7dd7cddfSDavid du Colombier /* 4*7dd7cddfSDavid du Colombier * generic hashed associative table for commands and variables. 5*7dd7cddfSDavid du Colombier */ 6*7dd7cddfSDavid du Colombier 7*7dd7cddfSDavid du Colombier struct table { 8*7dd7cddfSDavid du Colombier Area *areap; /* area to allocate entries */ 9*7dd7cddfSDavid du Colombier short size, nfree; /* hash size (always 2^^n), free entries */ 10*7dd7cddfSDavid du Colombier struct tbl **tbls; /* hashed table items */ 11*7dd7cddfSDavid du Colombier }; 12*7dd7cddfSDavid du Colombier 13*7dd7cddfSDavid du Colombier struct tbl { /* table item */ 14*7dd7cddfSDavid du Colombier Tflag flag; /* flags */ 15*7dd7cddfSDavid du Colombier int type; /* command type (see below), base (if INTEGER), 16*7dd7cddfSDavid du Colombier * or offset from val.s of value (if EXPORT) */ 17*7dd7cddfSDavid du Colombier Area *areap; /* area to allocate from */ 18*7dd7cddfSDavid du Colombier union { 19*7dd7cddfSDavid du Colombier char *s; /* string */ 20*7dd7cddfSDavid du Colombier long i; /* integer */ 21*7dd7cddfSDavid du Colombier int (*f) ARGS((char **)); /* int function */ 22*7dd7cddfSDavid du Colombier struct op *t; /* "function" tree */ 23*7dd7cddfSDavid du Colombier } val; /* value */ 24*7dd7cddfSDavid du Colombier int index; /* index for an array */ 25*7dd7cddfSDavid du Colombier union { 26*7dd7cddfSDavid du Colombier int field; /* field with for -L/-R/-Z */ 27*7dd7cddfSDavid du Colombier int errno_; /* CEXEC/CTALIAS */ 28*7dd7cddfSDavid du Colombier } u2; 29*7dd7cddfSDavid du Colombier union { 30*7dd7cddfSDavid du Colombier struct tbl *array; /* array values */ 31*7dd7cddfSDavid du Colombier char *fpath; /* temporary path to undef function */ 32*7dd7cddfSDavid du Colombier } u; 33*7dd7cddfSDavid du Colombier char name[4]; /* name -- variable length */ 34*7dd7cddfSDavid du Colombier }; 35*7dd7cddfSDavid du Colombier 36*7dd7cddfSDavid du Colombier /* common flag bits */ 37*7dd7cddfSDavid du Colombier #define ALLOC BIT(0) /* val.s has been allocated */ 38*7dd7cddfSDavid du Colombier #define DEFINED BIT(1) /* is defined in block */ 39*7dd7cddfSDavid du Colombier #define ISSET BIT(2) /* has value, vp->val.[si] */ 40*7dd7cddfSDavid du Colombier #define EXPORT BIT(3) /* exported variable/function */ 41*7dd7cddfSDavid du Colombier #define TRACE BIT(4) /* var: user flagged, func: execution tracing */ 42*7dd7cddfSDavid du Colombier /* (start non-common flags at 8) */ 43*7dd7cddfSDavid du Colombier /* flag bits used for variables */ 44*7dd7cddfSDavid du Colombier #define SPECIAL BIT(8) /* PATH, IFS, SECONDS, etc */ 45*7dd7cddfSDavid du Colombier #define INTEGER BIT(9) /* val.i contains integer value */ 46*7dd7cddfSDavid du Colombier #define RDONLY BIT(10) /* read-only variable */ 47*7dd7cddfSDavid du Colombier #define LOCAL BIT(11) /* for local typeset() */ 48*7dd7cddfSDavid du Colombier #define ARRAY BIT(13) /* array */ 49*7dd7cddfSDavid du Colombier #define LJUST BIT(14) /* left justify */ 50*7dd7cddfSDavid du Colombier #define RJUST BIT(15) /* right justify */ 51*7dd7cddfSDavid du Colombier #define ZEROFIL BIT(16) /* 0 filled if RJUSTIFY, strip 0s if LJUSTIFY */ 52*7dd7cddfSDavid du Colombier #define LCASEV BIT(17) /* convert to lower case */ 53*7dd7cddfSDavid du Colombier #define UCASEV_AL BIT(18)/* convert to upper case / autoload function */ 54*7dd7cddfSDavid du Colombier #define INT_U BIT(19) /* unsigned integer */ 55*7dd7cddfSDavid du Colombier #define INT_L BIT(20) /* long integer (no-op) */ 56*7dd7cddfSDavid du Colombier #define IMPORT BIT(21) /* flag to typeset(): no arrays, must have = */ 57*7dd7cddfSDavid du Colombier #define LOCAL_COPY BIT(22) /* with LOCAL - copy attrs from existing var */ 58*7dd7cddfSDavid du Colombier #define EXPRINEVAL BIT(23) /* contents currently being evaluated */ 59*7dd7cddfSDavid du Colombier #define EXPRLVALUE BIT(24) /* useable as lvalue (temp flag) */ 60*7dd7cddfSDavid du Colombier /* flag bits used for taliases/builtins/aliases/keywords/functions */ 61*7dd7cddfSDavid du Colombier #define KEEPASN BIT(8) /* keep command assignments (eg, var=x cmd) */ 62*7dd7cddfSDavid du Colombier #define FINUSE BIT(9) /* function being executed */ 63*7dd7cddfSDavid du Colombier #define FDELETE BIT(10) /* function deleted while it was executing */ 64*7dd7cddfSDavid du Colombier #define FKSH BIT(11) /* function defined with function x (vs x()) */ 65*7dd7cddfSDavid du Colombier #define SPEC_BI BIT(12) /* a POSIX special builtin */ 66*7dd7cddfSDavid du Colombier #define REG_BI BIT(13) /* a POSIX regular builtin */ 67*7dd7cddfSDavid du Colombier /* Attributes that can be set by the user (used to decide if an unset param 68*7dd7cddfSDavid du Colombier * should be repoted by set/typeset). Does not include ARRAY or LOCAL. 69*7dd7cddfSDavid du Colombier */ 70*7dd7cddfSDavid du Colombier #define USERATTRIB (EXPORT|INTEGER|RDONLY|LJUST|RJUST|ZEROFIL\ 71*7dd7cddfSDavid du Colombier |LCASEV|UCASEV_AL|INT_U|INT_L) 72*7dd7cddfSDavid du Colombier 73*7dd7cddfSDavid du Colombier /* command types */ 74*7dd7cddfSDavid du Colombier #define CNONE 0 /* undefined */ 75*7dd7cddfSDavid du Colombier #define CSHELL 1 /* built-in */ 76*7dd7cddfSDavid du Colombier #define CFUNC 2 /* function */ 77*7dd7cddfSDavid du Colombier #define CEXEC 4 /* executable command */ 78*7dd7cddfSDavid du Colombier #define CALIAS 5 /* alias */ 79*7dd7cddfSDavid du Colombier #define CKEYWD 6 /* keyword */ 80*7dd7cddfSDavid du Colombier #define CTALIAS 7 /* tracked alias */ 81*7dd7cddfSDavid du Colombier 82*7dd7cddfSDavid du Colombier /* Flags for findcom()/comexec() */ 83*7dd7cddfSDavid du Colombier #define FC_SPECBI BIT(0) /* special builtin */ 84*7dd7cddfSDavid du Colombier #define FC_FUNC BIT(1) /* function builtin */ 85*7dd7cddfSDavid du Colombier #define FC_REGBI BIT(2) /* regular builtin */ 86*7dd7cddfSDavid du Colombier #define FC_UNREGBI BIT(3) /* un-regular builtin (!special,!regular) */ 87*7dd7cddfSDavid du Colombier #define FC_BI (FC_SPECBI|FC_REGBI|FC_UNREGBI) 88*7dd7cddfSDavid du Colombier #define FC_PATH BIT(4) /* do path search */ 89*7dd7cddfSDavid du Colombier #define FC_DEFPATH BIT(5) /* use default path in path search */ 90*7dd7cddfSDavid du Colombier 91*7dd7cddfSDavid du Colombier 92*7dd7cddfSDavid du Colombier #define AF_ARGV_ALLOC 0x1 /* argv[] array allocated */ 93*7dd7cddfSDavid du Colombier #define AF_ARGS_ALLOCED 0x2 /* argument strings allocated */ 94*7dd7cddfSDavid du Colombier #define AI_ARGV(a, i) ((i) == 0 ? (a).argv[0] : (a).argv[(i) - (a).skip]) 95*7dd7cddfSDavid du Colombier #define AI_ARGC(a) ((a).argc_ - (a).skip) 96*7dd7cddfSDavid du Colombier 97*7dd7cddfSDavid du Colombier /* Argument info. Used for $#, $* for shell, functions, includes, etc. */ 98*7dd7cddfSDavid du Colombier struct arg_info { 99*7dd7cddfSDavid du Colombier int flags; /* AF_* */ 100*7dd7cddfSDavid du Colombier char **argv; 101*7dd7cddfSDavid du Colombier int argc_; 102*7dd7cddfSDavid du Colombier int skip; /* first arg is argv[0], second is argv[1 + skip] */ 103*7dd7cddfSDavid du Colombier }; 104*7dd7cddfSDavid du Colombier 105*7dd7cddfSDavid du Colombier /* 106*7dd7cddfSDavid du Colombier * activation record for function blocks 107*7dd7cddfSDavid du Colombier */ 108*7dd7cddfSDavid du Colombier struct block { 109*7dd7cddfSDavid du Colombier Area area; /* area to allocate things */ 110*7dd7cddfSDavid du Colombier /*struct arg_info argi;*/ 111*7dd7cddfSDavid du Colombier char **argv; 112*7dd7cddfSDavid du Colombier int argc; 113*7dd7cddfSDavid du Colombier int flags; /* see BF_* */ 114*7dd7cddfSDavid du Colombier struct table vars; /* local variables */ 115*7dd7cddfSDavid du Colombier struct table funs; /* local functions */ 116*7dd7cddfSDavid du Colombier Getopt getopts_state; 117*7dd7cddfSDavid du Colombier #if 1 118*7dd7cddfSDavid du Colombier char * error; /* error handler */ 119*7dd7cddfSDavid du Colombier char * exit; /* exit handler */ 120*7dd7cddfSDavid du Colombier #else 121*7dd7cddfSDavid du Colombier Trap error, exit; 122*7dd7cddfSDavid du Colombier #endif 123*7dd7cddfSDavid du Colombier struct block *next; /* enclosing block */ 124*7dd7cddfSDavid du Colombier }; 125*7dd7cddfSDavid du Colombier 126*7dd7cddfSDavid du Colombier /* Values for struct block.flags */ 127*7dd7cddfSDavid du Colombier #define BF_DOGETOPTS BIT(0) /* save/restore getopts state */ 128*7dd7cddfSDavid du Colombier 129*7dd7cddfSDavid du Colombier /* 130*7dd7cddfSDavid du Colombier * Used by twalk() and tnext() routines. 131*7dd7cddfSDavid du Colombier */ 132*7dd7cddfSDavid du Colombier struct tstate { 133*7dd7cddfSDavid du Colombier int left; 134*7dd7cddfSDavid du Colombier struct tbl **next; 135*7dd7cddfSDavid du Colombier }; 136*7dd7cddfSDavid du Colombier 137*7dd7cddfSDavid du Colombier 138*7dd7cddfSDavid du Colombier EXTERN struct table taliases; /* tracked aliases */ 139*7dd7cddfSDavid du Colombier EXTERN struct table builtins; /* built-in commands */ 140*7dd7cddfSDavid du Colombier EXTERN struct table aliases; /* aliases */ 141*7dd7cddfSDavid du Colombier EXTERN struct table keywords; /* keywords */ 142*7dd7cddfSDavid du Colombier EXTERN struct table homedirs; /* homedir() cache */ 143*7dd7cddfSDavid du Colombier 144*7dd7cddfSDavid du Colombier struct builtin { 145*7dd7cddfSDavid du Colombier const char *name; 146*7dd7cddfSDavid du Colombier int (*func) ARGS((char **)); 147*7dd7cddfSDavid du Colombier }; 148*7dd7cddfSDavid du Colombier 149*7dd7cddfSDavid du Colombier /* these really are externs! Look in table.c for them */ 150*7dd7cddfSDavid du Colombier extern const struct builtin shbuiltins [], kshbuiltins []; 151*7dd7cddfSDavid du Colombier 152*7dd7cddfSDavid du Colombier /* var spec values */ 153*7dd7cddfSDavid du Colombier #define V_NONE 0 154*7dd7cddfSDavid du Colombier #define V_PATH 1 155*7dd7cddfSDavid du Colombier #define V_IFS 2 156*7dd7cddfSDavid du Colombier #define V_SECONDS 3 157*7dd7cddfSDavid du Colombier #define V_OPTIND 4 158*7dd7cddfSDavid du Colombier #define V_MAIL 5 159*7dd7cddfSDavid du Colombier #define V_MAILPATH 6 160*7dd7cddfSDavid du Colombier #define V_MAILCHECK 7 161*7dd7cddfSDavid du Colombier #define V_RANDOM 8 162*7dd7cddfSDavid du Colombier #define V_HISTSIZE 9 163*7dd7cddfSDavid du Colombier #define V_HISTFILE 10 164*7dd7cddfSDavid du Colombier #define V_VISUAL 11 165*7dd7cddfSDavid du Colombier #define V_EDITOR 12 166*7dd7cddfSDavid du Colombier #define V_COLUMNS 13 167*7dd7cddfSDavid du Colombier #define V_POSIXLY_CORRECT 14 168*7dd7cddfSDavid du Colombier #define V_TMOUT 15 169*7dd7cddfSDavid du Colombier #define V_TMPDIR 16 170*7dd7cddfSDavid du Colombier #define V_LINENO 17 171*7dd7cddfSDavid du Colombier 172*7dd7cddfSDavid du Colombier /* values for set_prompt() */ 173*7dd7cddfSDavid du Colombier #define PS1 0 /* command */ 174*7dd7cddfSDavid du Colombier #define PS2 1 /* command continuation */ 175*7dd7cddfSDavid du Colombier 176*7dd7cddfSDavid du Colombier EXTERN char *path; /* copy of either PATH or def_path */ 177*7dd7cddfSDavid du Colombier EXTERN const char *def_path; /* path to use if PATH not set */ 178*7dd7cddfSDavid du Colombier EXTERN char *tmpdir; /* TMPDIR value */ 179*7dd7cddfSDavid du Colombier EXTERN const char *prompt; 180*7dd7cddfSDavid du Colombier EXTERN int cur_prompt; /* PS1 or PS2 */ 181*7dd7cddfSDavid du Colombier EXTERN int current_lineno; /* LINENO value */ 182