Blob


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