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