|
|
1.1 root 1: /*
2: * sh/sh.h
3: * Bourne shell.
4: * Header file.
5: */
6:
7: #include <stdio.h>
8: #include <setjmp.h>
9: #include <string.h>
10:
11: #define STRSIZE 2000 /* Maximum length of single token */
12: #define IALSIZE 8 /* Initial argument list size */
13: #define DSTACKN 30 /* Directory stack depth */
14: #define NOTREACHED return
15:
16: /*
17: * Masks for looking up lextab.
18: */
19: #define MNQUO 0001 /* Special in argument */
20: #define MDQUO 0002 /* Special in double quotes */
21: #define MHERE 0004 /* Special in here document */
22: #define MRVAR (MBVAR|MDIGI) /* Valid in regular variable name */
23: #define MSVAR 0010 /* Valid in special variable name */
24: #define MDIGI 0020 /* Is an ascii digit */
25: #define MBVAR 0040 /* Valid 1st char in regular var name */
26: #define MNAME 0100 /* Does not start a name */
27: #define MGLOB 0200 /* Must call glob */
28:
29: /*
30: * Determine if a character is a member of the given class.
31: * (This depends of the fact that EOF == -1).
32: */
33: #define class(c, m) (c>=EOF && c<=0177 && (lextab[1+c]&m))
34:
35: /*
36: * Types of nodes.
37: */
38: #define NNULL 0 /* Null */
39: #define NFOR 1 /* For */
40: #define NCASE 2 /* Case */
41: #define NWHILE 3 /* While */
42: #define NUNTIL 4 /* Until */
43: #define NIF 5 /* If */
44: #define NELSE 6 /* Else */
45: #define NCOMS 7 /* Command sequence */
46: #define NLIST 8 /* Command list */
47: #define NBACK 9 /* Background process */
48: #define NPIPE 10 /* Pipe */
49: #define NPARN 11 /* New shell */
50: #define NBRAC 12 /* Command group */
51: #define NANDF 13 /* Logical and operator */
52: #define NORF 14 /* Logical or operator */
53: #define NARGS 15 /* Argument string */
54: #define NIORS 16 /* Redirection of io */
55: #define NASSG 17 /* Assignment keyword */
56: #define NFOR2 18 /* Second part for, in list scan */
57: #define NCASE2 19 /* Second part case, command */
58: #define NCASE3 20 /* Third part case, pattern */
59: #define NCTRL 21 /* Control statement in list */
60: #define NRPIPE 22 /* Named pipe for read */
61: #define NWPIPE 23 /* Named pipe for write */
62:
63: /*
64: * Node.
65: */
66: typedef struct node {
67: int n_type; /* Type of node */
68: struct node *n_next; /* Pointer to next */
69: union {
70: struct node *nu_auxp; /* Auxiliary pointer */
71: char *nu_strp; /* Pointer to string */
72: } n_u;
73: } NODE;
74: #define n_auxp n_u.nu_auxp
75: #define n_strp n_u.nu_strp
76:
77: /*
78: * Flags in variables.
79: */
80: #define VEXP 001 /* Variable is exported */
81: #define VRDO 002 /* Read only */
82: #define VSET 004 /* Variable is used by shell */
83:
84: /*
85: * Enviroment list and variable structure.
86: */
87: typedef struct var {
88: int v_flag; /* Flags */
89: struct var *v_next; /* Pointer to next entry */
90: char *v_strp; /* Pointer to string */
91: } VAR;
92:
93: /*
94: * Buffer structure.
95: */
96: typedef struct buf {
97: struct buf *b_next; /* Pointer to next */
98: int b_size; /* Size of buffer */
99: } BUF;
100:
101: /*
102: * Per executing command data structure.
103: * Used for break/continue.
104: */
105: typedef struct con {
106: struct con *c_next; /* Pointer to next */
107: NODE *c_node; /* Node which created this control */
108: BUF **c_bpp; /* Current free buffer */
109: jmp_buf c_envl; /* Enviroment list */
110: } CON;
111:
112: /*
113: * Session types.
114: */
115: #define SINIT 0 /* Initial session */
116: #define SARGS 1 /* String */
117: #define SARGV 2 /* Vector of strings */
118: #define SFILE 3 /* File name */
119: #define SSTR 4 /* Open stream */
120:
121: /*
122: * Per session information structure.
123: */
124: typedef struct ses {
125: struct ses *s_next;
126: int s_type;
127: int s_flag;
128: NODE *s_node;
129: CON *s_con;
130: BUF **s_bpp;
131: jmp_buf s_envl;
132: char *s_strp;
133: char **s_argv;
134: FILE *s_ifp;
135: } SES;
136:
137: /*
138: * Session long jump codes
139: */
140: #define RSET 0 /* Initial setjmp call */
141: #define REOF 1 /* parse matched start */
142: #define RCMD 2 /* parse matched command line */
143: #define RERR 3 /* parse matched error */
144: #define RINT 4 /* Interrupt recovery */
145: #define RNOSBRK 5 /* no more memory from alloc */
146: #define RSYSER 6 /* system returned -1 */
147: #define RUABORT 7 /* user requested error abort */
148: #define RUEXITS 8 /* user requested exit command */
149: #define RBRKCON 9 /* break or continue beyond program */
150: #define RNOWAY 10 /* Shell assertion failed */
151:
152: /*
153: * Interrupt recovery and set contexts.
154: * Used to determine recovery action and default signals.
155: */
156: #define IRDY 0 /* In session */
157: #define ILEX 1 /* Parse in progress */
158: #define ICMD 2 /* Prior to next command execution */
159: #define IEVAL 3 /* Command evaluation in progress */
160: #define IBACK 4 /* Background process */
161: #define IFORK 5 /* Child after fork */
162: #define IPROF 6 /* Reading /etc/profile for login */
163:
164: /*
165: * Evaluation contexts.
166: */
167: #define EWORD 0 /* Evaluate $N, `cmd`, strip quotes */
168: #define EHERE 1 /* Evaluate $N, `cmd`, ignore quotes */
169: #define EARGS 2 /* Evaluete $N, `cmd`, strip quotes, *?[, blanks */
170: #define EPATT 3 /* Evaluate for pattern match */
171:
172: /*
173: * Global variables.
174: * Run time and set time flags.
175: */
176: extern char shflags[]; /* Flag array */
177: extern char shfnams[]; /* Flag name array */
178:
179: #define eflag shflags[0] /* Exit on non-zero status */
180: #define kflag shflags[1] /* All assignments into environ */
181: #define nflag shflags[2] /* Do not execute commands */
182: #define pflag shflags[3] /* Unknown */
183: #define tflag shflags[4] /* Exit after read/exec one command */
184: #define uflag shflags[5] /* Unset variables are errors */
185: #define vflag shflags[6] /* Print input as read */
186: #define xflag shflags[7] /* Print commands as executed */
187:
188: #define cflag shflags[8] /* Execute argument as command */
189: #define iflag shflags[9] /* Be interactive shell */
190: #define rflag shflags[10] /* Restricted shell */
191: #define sflag shflags[11] /* input<&0, output>&2 */
192:
193: #define lgnflag shflags[12] /* Login shell */
194: #define no1flag shflags[13] /* Invoked shell */
195: #define bckflag shflags[14] /* Background process */
196: #define nllflag shflags[15] /* Forked shell */
197: #define cmdflag shflags[16] /* Command file processor */
198:
199: /* Shell status housekeeping */
200: extern jmp_buf restart; /* Restart execution context */
201: extern int sargc; /* Argument count to shell */
202: extern char *sarg0; /* Name shell called with */
203: extern char **sargv; /* Argument vector to shell */
204: extern char **senvp; /* Environment vector to shell */
205: extern char **sargp; /* Current argument to shell */
206: extern char *scmdp; /* Path/filename of command file */
207: extern int nargc; /* New argument count, for command */
208: extern char **nargv; /* New argument vector, for command */
209: extern char **nenvp; /* New environment, for command */
210: extern char **niovp; /* Io redirection, for command */
211: extern NODE *nctlp; /* Control node, for command */
212: extern SES *sesp; /* Current session structure */
213: extern int yyline; /* Yacc command line counter */
214: extern int shpid; /* Shell's process id */
215: extern int slret; /* Exit status of last command */
216: extern int sback; /* Pid of last background command */
217: extern int spipe; /* Pid of last pipe process */
218: extern int ufmask; /* File creation mask */
219: /* Other internal flags. */
220: extern int comflag; /* Command line is complete?? */
221: extern int errflag; /* Set by call to printe */
222: extern int keyflag; /* Look for keyword in next word */
223: extern int noeflag; /* Turn off errors */
224: extern int prpflag; /* Do prompt before next read */
225: extern int readflag; /* Doing read command? */
226: /* Parameters used by shell. */
227: extern char *vhome; /* Home directory */
228: extern char *vpath; /* Search pathname */
229: extern char *vmail; /* Mail file */
230: extern char *vps1; /* Prompt string 1 */
231: extern char *vps2; /* Prompt string 2 */
232: extern char *vifs; /* Internal field seperators */
233: extern char *vshell; /* Shell to use */
234: /* Shell data */
235: extern char strt[STRSIZE]; /* String buffer */
236: extern char *strp; /* Pointer in string buffer */
237: extern VAR *varp; /* Pointer to shell variables */
238: extern char *dstack[DSTACKN]; /* Directory stack */
239: extern int dstkp; /* Directory stack pointer */
240:
241: /* Tables */
242: extern char lextab[]; /* Character type table */
243: /* Data external to shell */
244: extern int errno; /* System call error number */
245: extern char *signame[]; /* Wait status message table */
246:
247: /*
248: * Functions.
249: */
250: extern char *shtmp(); /* in main.c */
251: extern char *salloc(); /* in alloc.c */
252: extern char *balloc(); /* in alloc.c */
253: extern char *duplstr(); /* in alloc.c */
254: extern char **makargl(); /* in alloc.c */
255: extern char **addargl(); /* in alloc.c */
256: extern BUF **savebuf(); /* in alloc.c */
257: extern char **vdupl(); /* in alloc.c */
258: extern char *gany(); /* in glob.c */
259: extern int sigintr(); /* in trap.c */
260: extern VAR *findvar(); /* in var.c */
261: extern VAR *setsvar(); /* in var.c */
262: extern VAR *flagvar(); /* in var.c */
263: extern VAR *assnvar(); /* in var.c */
264: extern char *convvar(); /* in var.c */
265: extern char **envlvar(); /* in var.c */
266: extern char *_getwd(); /* in /lib/libc.a */
267: #define index(cp, c) strchr((cp), (c))
268: #define rindex(cp, c) strrchr((cp), (c))
269:
270: /* end of sh/sh.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.