13e12c5d1SDavid du Colombier /* 2bad30d5dSDavid du Colombier * Assume plan 9 by default; if Unix is defined, assume unix. 30591a7c1SDavid du Colombier * Please don't litter the code with ifdefs. The five below should be enough. 43e12c5d1SDavid du Colombier */ 5bad30d5dSDavid du Colombier 6bad30d5dSDavid du Colombier #ifndef Unix 7bad30d5dSDavid du Colombier /* plan 9 */ 83e12c5d1SDavid du Colombier #include <u.h> 93e12c5d1SDavid du Colombier #include <libc.h> 10bad30d5dSDavid du Colombier 113e12c5d1SDavid du Colombier #define NSIG 32 123e12c5d1SDavid du Colombier #define SIGINT 2 133e12c5d1SDavid du Colombier #define SIGQUIT 3 141936bb65SDavid du Colombier 15bad30d5dSDavid du Colombier #define fcntl(fd, op, arg) /* unix compatibility */ 16bad30d5dSDavid du Colombier #define F_SETFD 17bad30d5dSDavid du Colombier #define FD_CLOEXEC 18bad30d5dSDavid du Colombier #else 19bad30d5dSDavid du Colombier #include "unix.h" 203e12c5d1SDavid du Colombier #endif 211936bb65SDavid du Colombier 221936bb65SDavid du Colombier #ifndef ERRMAX 231936bb65SDavid du Colombier #define ERRMAX 128 241936bb65SDavid du Colombier #endif 251936bb65SDavid du Colombier 263e12c5d1SDavid du Colombier #define YYMAXDEPTH 500 27bad30d5dSDavid du Colombier #ifndef YYPREFIX 283e12c5d1SDavid du Colombier #ifndef PAREN 293e12c5d1SDavid du Colombier #include "x.tab.h" 303e12c5d1SDavid du Colombier #endif 31bad30d5dSDavid du Colombier #endif 32bad30d5dSDavid du Colombier 333e12c5d1SDavid du Colombier typedef struct tree tree; 343e12c5d1SDavid du Colombier typedef struct word word; 353e12c5d1SDavid du Colombier typedef struct io io; 363e12c5d1SDavid du Colombier typedef union code code; 373e12c5d1SDavid du Colombier typedef struct var var; 383e12c5d1SDavid du Colombier typedef struct list list; 393e12c5d1SDavid du Colombier typedef struct redir redir; 403e12c5d1SDavid du Colombier typedef struct thread thread; 413e12c5d1SDavid du Colombier typedef struct builtin builtin; 423e12c5d1SDavid du Colombier 43bad30d5dSDavid du Colombier #ifndef Unix 4412fd1c83SDavid du Colombier #pragma incomplete word 4512fd1c83SDavid du Colombier #pragma incomplete io 461936bb65SDavid du Colombier #endif 4712fd1c83SDavid du Colombier 483e12c5d1SDavid du Colombier struct tree{ 493e12c5d1SDavid du Colombier int type; 503e12c5d1SDavid du Colombier int rtype, fd0, fd1; /* details of REDIR PIPE DUP tokens */ 513e12c5d1SDavid du Colombier char *str; 523e12c5d1SDavid du Colombier int quoted; 533e12c5d1SDavid du Colombier int iskw; 543e12c5d1SDavid du Colombier tree *child[3]; 553e12c5d1SDavid du Colombier tree *next; 563e12c5d1SDavid du Colombier }; 573e12c5d1SDavid du Colombier tree *newtree(void); 583e12c5d1SDavid du Colombier tree *token(char*, int), *klook(char*), *tree1(int, tree*); 593e12c5d1SDavid du Colombier tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*); 603e12c5d1SDavid du Colombier tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*); 613e12c5d1SDavid du Colombier tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*); 623e12c5d1SDavid du Colombier tree *simplemung(tree*), *heredoc(tree*); 633e12c5d1SDavid du Colombier void freetree(tree*); 643e12c5d1SDavid du Colombier tree *cmdtree; 651936bb65SDavid du Colombier 663e12c5d1SDavid du Colombier /* 673e12c5d1SDavid du Colombier * The first word of any code vector is a reference count. 683e12c5d1SDavid du Colombier * Always create a new reference to a code vector by calling codecopy(.). 693e12c5d1SDavid du Colombier * Always call codefree(.) when deleting a reference. 703e12c5d1SDavid du Colombier */ 713e12c5d1SDavid du Colombier union code{ 723e12c5d1SDavid du Colombier void (*f)(void); 733e12c5d1SDavid du Colombier int i; 743e12c5d1SDavid du Colombier char *s; 753e12c5d1SDavid du Colombier }; 76276e7d6dSDavid du Colombier 773e12c5d1SDavid du Colombier char *promptstr; 783e12c5d1SDavid du Colombier int doprompt; 79276e7d6dSDavid du Colombier 80bad30d5dSDavid du Colombier #define NTOK 8192 /* maximum bytes in a word (token) */ 81276e7d6dSDavid du Colombier 828cc1c73aSDavid du Colombier char tok[NTOK + UTFmax]; 83276e7d6dSDavid du Colombier 843e12c5d1SDavid du Colombier #define APPEND 1 853e12c5d1SDavid du Colombier #define WRITE 2 863e12c5d1SDavid du Colombier #define READ 3 873e12c5d1SDavid du Colombier #define HERE 4 883e12c5d1SDavid du Colombier #define DUPFD 5 893e12c5d1SDavid du Colombier #define CLOSE 6 90119a69faSDavid du Colombier #define RDWR 7 91276e7d6dSDavid du Colombier 923e12c5d1SDavid du Colombier struct var{ 933e12c5d1SDavid du Colombier char *name; /* ascii name */ 943e12c5d1SDavid du Colombier word *val; /* value */ 953e12c5d1SDavid du Colombier int changed; 963e12c5d1SDavid du Colombier code *fn; /* pointer to function's code vector */ 973e12c5d1SDavid du Colombier int fnchanged; 983e12c5d1SDavid du Colombier int pc; /* pc of start of function */ 993e12c5d1SDavid du Colombier var *next; /* next on hash or local list */ 1003e12c5d1SDavid du Colombier }; 1013e12c5d1SDavid du Colombier var *vlook(char*), *gvlook(char*), *newvar(char*, var*); 102276e7d6dSDavid du Colombier 1033e12c5d1SDavid du Colombier #define NVAR 521 104276e7d6dSDavid du Colombier 1053e12c5d1SDavid du Colombier var *gvar[NVAR]; /* hash for globals */ 106276e7d6dSDavid du Colombier 1073e12c5d1SDavid du Colombier #define new(type) ((type *)emalloc(sizeof(type))) 108276e7d6dSDavid du Colombier 109276e7d6dSDavid du Colombier void *emalloc(long); 1103e12c5d1SDavid du Colombier void *Malloc(ulong); 111276e7d6dSDavid du Colombier void efree(void *); 112276e7d6dSDavid du Colombier 1133e12c5d1SDavid du Colombier struct here{ 1143e12c5d1SDavid du Colombier tree *tag; 1153e12c5d1SDavid du Colombier char *name; 1163e12c5d1SDavid du Colombier struct here *next; 1173e12c5d1SDavid du Colombier }; 1183e12c5d1SDavid du Colombier int mypid; 119276e7d6dSDavid du Colombier 1203e12c5d1SDavid du Colombier /* 1213e12c5d1SDavid du Colombier * Glob character escape in strings: 1223e12c5d1SDavid du Colombier * In a string, GLOB must be followed by *?[ or GLOB. 1233e12c5d1SDavid du Colombier * GLOB* matches any string 1243e12c5d1SDavid du Colombier * GLOB? matches any single character 1253e12c5d1SDavid du Colombier * GLOB[...] matches anything in the brackets 1263e12c5d1SDavid du Colombier * GLOBGLOB matches GLOB 1273e12c5d1SDavid du Colombier */ 128*4e3613abSDavid du Colombier #define GLOB '\001' 12982726826SDavid du Colombier 1303e12c5d1SDavid du Colombier char **argp; 1313e12c5d1SDavid du Colombier char **args; 1323e12c5d1SDavid du Colombier int nerror; /* number of errors encountered during compilation */ 1333e12c5d1SDavid du Colombier int doprompt; /* is it time for a prompt? */ 1343e12c5d1SDavid du Colombier /* 1353e12c5d1SDavid du Colombier * Which fds are the reading/writing end of a pipe? 1363e12c5d1SDavid du Colombier * Unfortunately, this can vary from system to system. 1373e12c5d1SDavid du Colombier * 9th edition Unix doesn't care, the following defines 1383e12c5d1SDavid du Colombier * work on plan 9. 1393e12c5d1SDavid du Colombier */ 1403e12c5d1SDavid du Colombier #define PRD 0 1413e12c5d1SDavid du Colombier #define PWR 1 142bad30d5dSDavid du Colombier 143bad30d5dSDavid du Colombier char *Rcmain, *Fdprefix; 1443e12c5d1SDavid du Colombier /* 1453e12c5d1SDavid du Colombier * How many dot commands have we executed? 1463e12c5d1SDavid du Colombier * Used to ensure that -v flag doesn't print rcmain. 1473e12c5d1SDavid du Colombier */ 1483e12c5d1SDavid du Colombier int ndot; 1493e12c5d1SDavid du Colombier char *getstatus(void); 1503e12c5d1SDavid du Colombier int lastc; 1517dd7cddfSDavid du Colombier int lastword; 152