xref: /plan9-contrib/sys/src/ape/cmd/pdksh/table.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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