|
|
1.1 root 1: /* $Header: table.h,v 3.1 88/11/03 09:13:56 egisin Exp $ */
2:
3: /*
4: * generic hashed associative table for commands and variables.
5: */
6:
7: struct table {
8: Area *areap; /* area to allocate enties */
9: short size, free; /* hash size (always 2^^n), free entries */
10: struct tbl **tbls; /* hashed table items */
11: };
12:
13: struct tbl { /* table item */
14: short flag; /* flags */
15: short type; /* command type or base, see below */
16: union {
17: char *s; /* string */
18: long i; /* integer */
19: int (*f)(); /* int function */
20: struct op *t; /* "function" tree */
21: } val; /* value */
22: char name[4]; /* name -- variable length */
23: };
24:
25: /* flag bits */
26: #define ALLOC BIT(0) /* val.s has been allocated */
27: #define DEFINED BIT(1) /* is defined in block */
28: #define ISSET BIT(2) /* has value, vp->val.[si] */
29: #define SPECIAL BIT(3) /* PATH, IFS, SECONDS, etc */
30: #define INTEGER BIT(4) /* val.i contains integer value */
31: #define RDONLY BIT(8) /* read-only variable */
32: #define EXPORT BIT(9) /* exported variable */
33: #define LOCAL BIT(10) /* for local typeset() */
34: #define TRACE BIT(11) /* trace (-t) */
35: #define FUNCT BIT(12) /* function */
36:
37: /* command types */
38: #define CNONE 0 /* undefined */
39: #define CSHELL 1 /* built-in */
40: #define CFUNC 2 /* function */
41: #define CEXEC 4 /* executable command */
42: #define CALIAS 5 /* alias */
43: #define CKEYWD 6 /* keyword */
44:
45: void tinit ARGS((struct table *, Area *)); /* initialize table */
46: unsigned int hash(); /* name hash function */
47: struct tbl *tsearch(); /* table lookup primative */
48: struct tbl *tenter(); /* table lookup/enter primative */
49: void tdelete(); /* mark tbl entry for deletion */
50: void twalk(); /* initialize walk of table */
51: struct tbl *tnext(); /* walk table returning table time */
52: struct tbl **tsort(); /* sort table entries by name */
53:
54: /*
55: * activation record for function blocks
56: */
57: struct block {
58: Area area; /* area to allocate things */
59: int argc; /* current $# */
60: char ** argv; /* current $* */
61: struct table vars; /* local variables */
62: struct table funs; /* local functions */
63: #if 1
64: char * error; /* error handler */
65: char * exit; /* exit handler */
66: #else
67: struct trap error, exit;
68: #endif
69: struct block *next; /* enclosing block */
70: };
71:
72: Extern struct block globals; /* global variables and functions */
73: Extern struct table commands; /* hashed commands */
74: Extern struct table builtins; /* built-in commands */
75: Extern struct table lexicals; /* keywords and aliases */
76: Extern struct table homedirs; /* homedir() cache */
77:
78: struct builtin {
79: char *name;
80: int (*func)();
81: };
82: Extern Const struct builtin shbuiltins[1], kshbuiltins[1];
83:
84: /* var spec values */
85: #define V_NONE 0
86: #define V_PATH 1
87: #define V_IFS 2
88: #define V_SECONDS 3
89: #define V_OPTIND 4
90:
91: Extern Area *lastarea; /* area of last variable/function looked up */
92: Extern char *path; /* PATH value */
93: Extern char *prompt; /* PS1 or PS2 */
94:
95: void newblock();
96: void popblock();
97: struct tbl *global(/* char *s */);
98: struct tbl *local(/* char *s */);
99: struct tbl *typeset(/* char *var; int set, clr */);
100: struct tbl *setvar(/* struct tbl *vdst, *vsrc */);
101: struct tbl *strint(/* struct tbl *vdst, *vsrc */);
102: long intval(/* struct tbl *vp */);
103: void setint(/* struct tbl *vp; long n */);
104: char *strval(/* struct tbl *vp */);
105: void setstr(/* struct tbl *vp; char *s */);
106: void unset(/* struct tbl *vp */);
107: int import(/* char *s */);
108: char **makenv();
109: int isassign(/* char *s */);
110:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.