|
|
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.