1 /* 2 * Plan9 is defined for plan 9 3 * V9 is defined for 9th edition 4 * Sun is defined for sun-os 5 * Please don't litter the code with ifdefs. The three below (and one in 6 * getflags) should be enough. 7 */ 8 #define Plan9 9 #ifdef Plan9 10 #include <u.h> 11 #include <libc.h> 12 #define NSIG 32 13 #define SIGINT 2 14 #define SIGQUIT 3 15 #endif 16 #ifdef V9 17 #include <signal.h> 18 #include <libc.h> 19 #endif 20 #ifdef Sun 21 #include <signal.h> 22 #endif 23 #define YYMAXDEPTH 500 24 #ifndef PAREN 25 #include "x.tab.h" 26 #endif 27 typedef struct tree tree; 28 typedef struct word word; 29 typedef struct io io; 30 typedef union code code; 31 typedef struct var var; 32 typedef struct list list; 33 typedef struct redir redir; 34 typedef struct thread thread; 35 typedef struct builtin builtin; 36 37 #pragma incomplete word 38 #pragma incomplete io 39 40 struct tree{ 41 int type; 42 int rtype, fd0, fd1; /* details of REDIR PIPE DUP tokens */ 43 char *str; 44 int quoted; 45 int iskw; 46 tree *child[3]; 47 tree *next; 48 }; 49 tree *newtree(void); 50 tree *token(char*, int), *klook(char*), *tree1(int, tree*); 51 tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*); 52 tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*); 53 tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*); 54 tree *simplemung(tree*), *heredoc(tree*); 55 void freetree(tree*); 56 tree *cmdtree; 57 /* 58 * The first word of any code vector is a reference count. 59 * Always create a new reference to a code vector by calling codecopy(.). 60 * Always call codefree(.) when deleting a reference. 61 */ 62 union code{ 63 void (*f)(void); 64 int i; 65 char *s; 66 }; 67 char *promptstr; 68 int doprompt; 69 #define NTOK 8192 70 char tok[NTOK]; 71 #define APPEND 1 72 #define WRITE 2 73 #define READ 3 74 #define HERE 4 75 #define DUPFD 5 76 #define CLOSE 6 77 #define RDWR 7 78 struct var{ 79 char *name; /* ascii name */ 80 word *val; /* value */ 81 int changed; 82 code *fn; /* pointer to function's code vector */ 83 int fnchanged; 84 int pc; /* pc of start of function */ 85 var *next; /* next on hash or local list */ 86 }; 87 var *vlook(char*), *gvlook(char*), *newvar(char*, var*); 88 #define NVAR 521 89 var *gvar[NVAR]; /* hash for globals */ 90 #define new(type) ((type *)emalloc(sizeof(type))) 91 char *emalloc(long); 92 void *Malloc(ulong); 93 void efree(char*); 94 #define NOFILE 128 /* should come from <param.h> */ 95 struct here{ 96 tree *tag; 97 char *name; 98 struct here *next; 99 }; 100 int mypid; 101 /* 102 * Glob character escape in strings: 103 * In a string, GLOB must be followed by *?[ or GLOB. 104 * GLOB* matches any string 105 * GLOB? matches any single character 106 * GLOB[...] matches anything in the brackets 107 * GLOBGLOB matches GLOB 108 */ 109 #define GLOB ((char)0x01) 110 /* 111 * onebyte(c), twobyte(c), threebyte(c) 112 * Is c the first character of a one- two- or three-byte utf sequence? 113 */ 114 #define onebyte(c) ((c&0x80)==0x00) 115 #define twobyte(c) ((c&0xe0)==0xc0) 116 #define threebyte(c) ((c&0xf0)==0xe0) 117 char **argp; 118 char **args; 119 int nerror; /* number of errors encountered during compilation */ 120 int doprompt; /* is it time for a prompt? */ 121 /* 122 * Which fds are the reading/writing end of a pipe? 123 * Unfortunately, this can vary from system to system. 124 * 9th edition Unix doesn't care, the following defines 125 * work on plan 9. 126 */ 127 #define PRD 0 128 #define PWR 1 129 char Rcmain[], Fdprefix[]; 130 #define register 131 /* 132 * How many dot commands have we executed? 133 * Used to ensure that -v flag doesn't print rcmain. 134 */ 135 int ndot; 136 char *getstatus(void); 137 int lastc; 138 int lastword; 139