13e12c5d1SDavid du Colombier /* 2bad30d5dSDavid du Colombier * Assume plan 9 by default; if Unix is defined, assume unix. 3*c6df1444SDavid du Colombier * Please don't litter the code with ifdefs. The three below should be enough. 43e12c5d1SDavid du Colombier */ 5bad30d5dSDavid du Colombier 63e12c5d1SDavid du Colombier typedef struct tree tree; 73e12c5d1SDavid du Colombier typedef struct word word; 83e12c5d1SDavid du Colombier typedef struct io io; 93e12c5d1SDavid du Colombier typedef union code code; 103e12c5d1SDavid du Colombier typedef struct var var; 113e12c5d1SDavid du Colombier typedef struct list list; 123e12c5d1SDavid du Colombier typedef struct redir redir; 133e12c5d1SDavid du Colombier typedef struct thread thread; 143e12c5d1SDavid du Colombier typedef struct builtin builtin; 153e12c5d1SDavid du Colombier 16*c6df1444SDavid du Colombier #define isdigit(c) ((c) >= '0' && (c) <= '9') /* NB: unsafe macro */ 17*c6df1444SDavid du Colombier 18bad30d5dSDavid du Colombier #ifndef Unix 19*c6df1444SDavid du Colombier /* plan 9 */ 20*c6df1444SDavid du Colombier #include <u.h> 21*c6df1444SDavid du Colombier #include <libc.h> 22*c6df1444SDavid du Colombier 2312fd1c83SDavid du Colombier #pragma incomplete word 2412fd1c83SDavid du Colombier #pragma incomplete io 25*c6df1444SDavid du Colombier 26*c6df1444SDavid du Colombier /* unix compatibility */ 27*c6df1444SDavid du Colombier #define unixclsexec(wdirfd) 28*c6df1444SDavid du Colombier 29*c6df1444SDavid du Colombier #define NSIG 32 30*c6df1444SDavid du Colombier #define SIGINT 2 31*c6df1444SDavid du Colombier #define SIGQUIT 3 32*c6df1444SDavid du Colombier #else 33*c6df1444SDavid du Colombier #include "unix.h" 34*c6df1444SDavid du Colombier #endif 35*c6df1444SDavid du Colombier 36*c6df1444SDavid du Colombier #define YYMAXDEPTH 500 37*c6df1444SDavid du Colombier #ifndef YYPREFIX 38*c6df1444SDavid du Colombier #ifndef PAREN 39*c6df1444SDavid du Colombier #include "x.tab.h" 40*c6df1444SDavid du Colombier #endif 411936bb65SDavid du Colombier #endif 4212fd1c83SDavid du Colombier 433e12c5d1SDavid du Colombier struct tree{ 443e12c5d1SDavid du Colombier int type; 453e12c5d1SDavid du Colombier int rtype, fd0, fd1; /* details of REDIR PIPE DUP tokens */ 463e12c5d1SDavid du Colombier char *str; 473e12c5d1SDavid du Colombier int quoted; 483e12c5d1SDavid du Colombier int iskw; 493e12c5d1SDavid du Colombier tree *child[3]; 503e12c5d1SDavid du Colombier tree *next; 513e12c5d1SDavid du Colombier }; 523e12c5d1SDavid du Colombier tree *newtree(void); 533e12c5d1SDavid du Colombier tree *token(char*, int), *klook(char*), *tree1(int, tree*); 543e12c5d1SDavid du Colombier tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*); 553e12c5d1SDavid du Colombier tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*); 563e12c5d1SDavid du Colombier tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*); 573e12c5d1SDavid du Colombier tree *simplemung(tree*), *heredoc(tree*); 583e12c5d1SDavid du Colombier void freetree(tree*); 593e12c5d1SDavid du Colombier tree *cmdtree; 601936bb65SDavid du Colombier 613e12c5d1SDavid du Colombier /* 623e12c5d1SDavid du Colombier * The first word of any code vector is a reference count. 633e12c5d1SDavid du Colombier * Always create a new reference to a code vector by calling codecopy(.). 643e12c5d1SDavid du Colombier * Always call codefree(.) when deleting a reference. 653e12c5d1SDavid du Colombier */ 663e12c5d1SDavid du Colombier union code{ 673e12c5d1SDavid du Colombier void (*f)(void); 683e12c5d1SDavid du Colombier int i; 693e12c5d1SDavid du Colombier char *s; 703e12c5d1SDavid du Colombier }; 71276e7d6dSDavid du Colombier 723e12c5d1SDavid du Colombier char *promptstr; 733e12c5d1SDavid du Colombier int doprompt; 74276e7d6dSDavid du Colombier 75bad30d5dSDavid du Colombier #define NTOK 8192 /* maximum bytes in a word (token) */ 76276e7d6dSDavid du Colombier 778cc1c73aSDavid du Colombier char tok[NTOK + UTFmax]; 78276e7d6dSDavid du Colombier 793e12c5d1SDavid du Colombier #define APPEND 1 803e12c5d1SDavid du Colombier #define WRITE 2 813e12c5d1SDavid du Colombier #define READ 3 823e12c5d1SDavid du Colombier #define HERE 4 833e12c5d1SDavid du Colombier #define DUPFD 5 843e12c5d1SDavid du Colombier #define CLOSE 6 85119a69faSDavid du Colombier #define RDWR 7 86276e7d6dSDavid du Colombier 873e12c5d1SDavid du Colombier struct var{ 883e12c5d1SDavid du Colombier char *name; /* ascii name */ 893e12c5d1SDavid du Colombier word *val; /* value */ 903e12c5d1SDavid du Colombier int changed; 913e12c5d1SDavid du Colombier code *fn; /* pointer to function's code vector */ 923e12c5d1SDavid du Colombier int fnchanged; 933e12c5d1SDavid du Colombier int pc; /* pc of start of function */ 943e12c5d1SDavid du Colombier var *next; /* next on hash or local list */ 953e12c5d1SDavid du Colombier }; 963e12c5d1SDavid du Colombier var *vlook(char*), *gvlook(char*), *newvar(char*, var*); 97276e7d6dSDavid du Colombier 983e12c5d1SDavid du Colombier #define NVAR 521 99276e7d6dSDavid du Colombier 1003e12c5d1SDavid du Colombier var *gvar[NVAR]; /* hash for globals */ 101276e7d6dSDavid du Colombier 1023e12c5d1SDavid du Colombier #define new(type) ((type *)emalloc(sizeof(type))) 103276e7d6dSDavid du Colombier 104276e7d6dSDavid du Colombier void *emalloc(long); 1053e12c5d1SDavid du Colombier void *Malloc(ulong); 106276e7d6dSDavid du Colombier void efree(void *); 107276e7d6dSDavid du Colombier 1083e12c5d1SDavid du Colombier struct here{ 1093e12c5d1SDavid du Colombier tree *tag; 1103e12c5d1SDavid du Colombier char *name; 1113e12c5d1SDavid du Colombier struct here *next; 1123e12c5d1SDavid du Colombier }; 1133e12c5d1SDavid du Colombier int mypid; 114276e7d6dSDavid du Colombier 1153e12c5d1SDavid du Colombier /* 1163e12c5d1SDavid du Colombier * Glob character escape in strings: 1173e12c5d1SDavid du Colombier * In a string, GLOB must be followed by *?[ or GLOB. 1183e12c5d1SDavid du Colombier * GLOB* matches any string 1193e12c5d1SDavid du Colombier * GLOB? matches any single character 1203e12c5d1SDavid du Colombier * GLOB[...] matches anything in the brackets 1213e12c5d1SDavid du Colombier * GLOBGLOB matches GLOB 1223e12c5d1SDavid du Colombier */ 1234e3613abSDavid du Colombier #define GLOB '\001' 12482726826SDavid du Colombier 1253e12c5d1SDavid du Colombier char **argp; 1263e12c5d1SDavid du Colombier char **args; 1273e12c5d1SDavid du Colombier int nerror; /* number of errors encountered during compilation */ 1283e12c5d1SDavid du Colombier int doprompt; /* is it time for a prompt? */ 1293e12c5d1SDavid du Colombier /* 1303e12c5d1SDavid du Colombier * Which fds are the reading/writing end of a pipe? 1313e12c5d1SDavid du Colombier * Unfortunately, this can vary from system to system. 1323e12c5d1SDavid du Colombier * 9th edition Unix doesn't care, the following defines 1333e12c5d1SDavid du Colombier * work on plan 9. 1343e12c5d1SDavid du Colombier */ 1353e12c5d1SDavid du Colombier #define PRD 0 1363e12c5d1SDavid du Colombier #define PWR 1 137bad30d5dSDavid du Colombier 138bad30d5dSDavid du Colombier char *Rcmain, *Fdprefix; 1393e12c5d1SDavid du Colombier /* 1403e12c5d1SDavid du Colombier * How many dot commands have we executed? 1413e12c5d1SDavid du Colombier * Used to ensure that -v flag doesn't print rcmain. 1423e12c5d1SDavid du Colombier */ 1433e12c5d1SDavid du Colombier int ndot; 1443e12c5d1SDavid du Colombier char *getstatus(void); 145*c6df1444SDavid du Colombier Rune lastc; 1467dd7cddfSDavid du Colombier int lastword; 147*c6df1444SDavid du Colombier 148*c6df1444SDavid du Colombier #define NFLAG 128 /* limited to ascii */ 149*c6df1444SDavid du Colombier 150*c6df1444SDavid du Colombier extern char *flag[NFLAG]; 151*c6df1444SDavid du Colombier extern char flagset[]; 152