Blame


1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
8 564ca709 2004-04-19 devnull #include "y.tab.h"
9 564ca709 2004-04-19 devnull
10 564ca709 2004-04-19 devnull struct keywd
11 564ca709 2004-04-19 devnull {
12 564ca709 2004-04-19 devnull char *name;
13 564ca709 2004-04-19 devnull int terminal;
14 564ca709 2004-04-19 devnull }
15 564ca709 2004-04-19 devnull keywds[] =
16 564ca709 2004-04-19 devnull {
17 564ca709 2004-04-19 devnull "do", Tdo,
18 564ca709 2004-04-19 devnull "if", Tif,
19 564ca709 2004-04-19 devnull "then", Tthen,
20 564ca709 2004-04-19 devnull "else", Telse,
21 564ca709 2004-04-19 devnull "while", Twhile,
22 564ca709 2004-04-19 devnull "loop", Tloop,
23 564ca709 2004-04-19 devnull "head", Thead,
24 564ca709 2004-04-19 devnull "tail", Ttail,
25 564ca709 2004-04-19 devnull "append", Tappend,
26 564ca709 2004-04-19 devnull "defn", Tfn,
27 564ca709 2004-04-19 devnull "return", Tret,
28 564ca709 2004-04-19 devnull "local", Tlocal,
29 564ca709 2004-04-19 devnull "aggr", Tcomplex,
30 564ca709 2004-04-19 devnull "union", Tcomplex,
31 564ca709 2004-04-19 devnull "adt", Tcomplex,
32 564ca709 2004-04-19 devnull "complex", Tcomplex,
33 564ca709 2004-04-19 devnull "delete", Tdelete,
34 564ca709 2004-04-19 devnull "whatis", Twhat,
35 564ca709 2004-04-19 devnull "eval", Teval,
36 564ca709 2004-04-19 devnull "builtin", Tbuiltin,
37 564ca709 2004-04-19 devnull 0, 0
38 564ca709 2004-04-19 devnull };
39 564ca709 2004-04-19 devnull
40 e637c944 2004-04-20 devnull char cmap[256];
41 e637c944 2004-04-20 devnull
42 e637c944 2004-04-20 devnull void
43 e637c944 2004-04-20 devnull initcmap(void)
44 564ca709 2004-04-19 devnull {
45 e637c944 2004-04-20 devnull cmap['0']= '\0'+1;
46 e637c944 2004-04-20 devnull cmap['n']= '\n'+1;
47 e637c944 2004-04-20 devnull cmap['r']= '\r'+1;
48 e637c944 2004-04-20 devnull cmap['t']= '\t'+1;
49 e637c944 2004-04-20 devnull cmap['b']= '\b'+1;
50 e637c944 2004-04-20 devnull cmap['f']= '\f'+1;
51 e637c944 2004-04-20 devnull cmap['a']= '\a'+1;
52 e637c944 2004-04-20 devnull cmap['v']= '\v'+1;
53 e637c944 2004-04-20 devnull cmap['\\']= '\\'+1;
54 e637c944 2004-04-20 devnull cmap['"']= '"'+1;
55 a0f1e21f 2004-04-20 devnull }
56 564ca709 2004-04-19 devnull
57 564ca709 2004-04-19 devnull void
58 564ca709 2004-04-19 devnull kinit(void)
59 564ca709 2004-04-19 devnull {
60 564ca709 2004-04-19 devnull int i;
61 e637c944 2004-04-20 devnull
62 e637c944 2004-04-20 devnull initcmap();
63 e637c944 2004-04-20 devnull
64 564ca709 2004-04-19 devnull for(i = 0; keywds[i].name; i++)
65 564ca709 2004-04-19 devnull enter(keywds[i].name, keywds[i].terminal);
66 564ca709 2004-04-19 devnull }
67 564ca709 2004-04-19 devnull
68 564ca709 2004-04-19 devnull typedef struct IOstack IOstack;
69 564ca709 2004-04-19 devnull struct IOstack
70 564ca709 2004-04-19 devnull {
71 564ca709 2004-04-19 devnull char *name;
72 564ca709 2004-04-19 devnull int line;
73 564ca709 2004-04-19 devnull char *text;
74 564ca709 2004-04-19 devnull char *ip;
75 564ca709 2004-04-19 devnull Biobuf *fin;
76 564ca709 2004-04-19 devnull IOstack *prev;
77 564ca709 2004-04-19 devnull };
78 564ca709 2004-04-19 devnull IOstack *lexio;
79 a8c15b08 2004-04-21 devnull uint nlexio;
80 564ca709 2004-04-19 devnull
81 564ca709 2004-04-19 devnull void
82 564ca709 2004-04-19 devnull setacidfile(void)
83 564ca709 2004-04-19 devnull {
84 564ca709 2004-04-19 devnull char *name;
85 564ca709 2004-04-19 devnull Lsym *l;
86 564ca709 2004-04-19 devnull
87 564ca709 2004-04-19 devnull if(lexio)
88 564ca709 2004-04-19 devnull name = lexio->name;
89 564ca709 2004-04-19 devnull else
90 564ca709 2004-04-19 devnull name = "";
91 564ca709 2004-04-19 devnull l = mkvar("acidfile");
92 564ca709 2004-04-19 devnull l->v->set = 1;
93 564ca709 2004-04-19 devnull l->v->store.fmt = 's';
94 564ca709 2004-04-19 devnull l->v->type = TSTRING;
95 564ca709 2004-04-19 devnull l->v->store.u.string = strnode(name);
96 564ca709 2004-04-19 devnull }
97 564ca709 2004-04-19 devnull
98 564ca709 2004-04-19 devnull void
99 564ca709 2004-04-19 devnull pushfile(char *file)
100 564ca709 2004-04-19 devnull {
101 564ca709 2004-04-19 devnull Biobuf *b;
102 564ca709 2004-04-19 devnull IOstack *io;
103 564ca709 2004-04-19 devnull
104 a8c15b08 2004-04-21 devnull if(nlexio > 64)
105 a8c15b08 2004-04-21 devnull error("too many includes");
106 a8c15b08 2004-04-21 devnull
107 564ca709 2004-04-19 devnull if(file)
108 564ca709 2004-04-19 devnull b = Bopen(file, OREAD);
109 564ca709 2004-04-19 devnull else{
110 564ca709 2004-04-19 devnull b = Bopen(unsharp("#d/0"), OREAD);
111 564ca709 2004-04-19 devnull file = "<stdin>";
112 564ca709 2004-04-19 devnull }
113 564ca709 2004-04-19 devnull
114 564ca709 2004-04-19 devnull if(b == 0)
115 564ca709 2004-04-19 devnull error("pushfile: %s: %r", file);
116 564ca709 2004-04-19 devnull
117 564ca709 2004-04-19 devnull io = malloc(sizeof(IOstack));
118 564ca709 2004-04-19 devnull if(io == 0)
119 564ca709 2004-04-19 devnull fatal("no memory");
120 564ca709 2004-04-19 devnull io->name = strdup(file);
121 564ca709 2004-04-19 devnull if(io->name == 0)
122 564ca709 2004-04-19 devnull fatal("no memory");
123 564ca709 2004-04-19 devnull io->line = line;
124 564ca709 2004-04-19 devnull line = 1;
125 564ca709 2004-04-19 devnull io->text = 0;
126 564ca709 2004-04-19 devnull io->fin = b;
127 564ca709 2004-04-19 devnull io->prev = lexio;
128 564ca709 2004-04-19 devnull lexio = io;
129 a8c15b08 2004-04-21 devnull nlexio++;
130 564ca709 2004-04-19 devnull setacidfile();
131 564ca709 2004-04-19 devnull }
132 564ca709 2004-04-19 devnull
133 564ca709 2004-04-19 devnull void
134 564ca709 2004-04-19 devnull pushfd(int fd)
135 564ca709 2004-04-19 devnull {
136 564ca709 2004-04-19 devnull pushfile("/dev/null");
137 564ca709 2004-04-19 devnull close(lexio->fin->fid);
138 564ca709 2004-04-19 devnull free(lexio->name);
139 564ca709 2004-04-19 devnull lexio->name = smprint("<fd#d>", fd);
140 564ca709 2004-04-19 devnull lexio->fin->fid = fd;
141 564ca709 2004-04-19 devnull }
142 564ca709 2004-04-19 devnull
143 564ca709 2004-04-19 devnull void
144 564ca709 2004-04-19 devnull pushstr(Node *s)
145 564ca709 2004-04-19 devnull {
146 564ca709 2004-04-19 devnull IOstack *io;
147 564ca709 2004-04-19 devnull
148 564ca709 2004-04-19 devnull io = malloc(sizeof(IOstack));
149 564ca709 2004-04-19 devnull if(io == 0)
150 564ca709 2004-04-19 devnull fatal("no memory");
151 564ca709 2004-04-19 devnull io->line = line;
152 564ca709 2004-04-19 devnull line = 1;
153 564ca709 2004-04-19 devnull io->name = strdup("<string>");
154 564ca709 2004-04-19 devnull if(io->name == 0)
155 564ca709 2004-04-19 devnull fatal("no memory");
156 564ca709 2004-04-19 devnull io->line = line;
157 564ca709 2004-04-19 devnull line = 1;
158 564ca709 2004-04-19 devnull io->text = strdup(s->store.u.string->string);
159 564ca709 2004-04-19 devnull if(io->text == 0)
160 564ca709 2004-04-19 devnull fatal("no memory");
161 564ca709 2004-04-19 devnull io->ip = io->text;
162 564ca709 2004-04-19 devnull io->fin = 0;
163 564ca709 2004-04-19 devnull io->prev = lexio;
164 a8c15b08 2004-04-21 devnull nlexio++;
165 564ca709 2004-04-19 devnull lexio = io;
166 564ca709 2004-04-19 devnull setacidfile();
167 564ca709 2004-04-19 devnull }
168 564ca709 2004-04-19 devnull
169 564ca709 2004-04-19 devnull void
170 564ca709 2004-04-19 devnull restartio(void)
171 564ca709 2004-04-19 devnull {
172 564ca709 2004-04-19 devnull Bflush(lexio->fin);
173 564ca709 2004-04-19 devnull Binit(lexio->fin, 0, OREAD);
174 564ca709 2004-04-19 devnull }
175 564ca709 2004-04-19 devnull
176 564ca709 2004-04-19 devnull int
177 564ca709 2004-04-19 devnull popio(void)
178 564ca709 2004-04-19 devnull {
179 564ca709 2004-04-19 devnull IOstack *s;
180 564ca709 2004-04-19 devnull
181 564ca709 2004-04-19 devnull if(lexio == 0)
182 564ca709 2004-04-19 devnull return 0;
183 564ca709 2004-04-19 devnull
184 564ca709 2004-04-19 devnull if(lexio->prev == 0){
185 564ca709 2004-04-19 devnull if(lexio->fin)
186 564ca709 2004-04-19 devnull restartio();
187 564ca709 2004-04-19 devnull return 0;
188 564ca709 2004-04-19 devnull }
189 564ca709 2004-04-19 devnull
190 564ca709 2004-04-19 devnull if(lexio->fin)
191 564ca709 2004-04-19 devnull Bterm(lexio->fin);
192 564ca709 2004-04-19 devnull else
193 564ca709 2004-04-19 devnull free(lexio->text);
194 564ca709 2004-04-19 devnull free(lexio->name);
195 564ca709 2004-04-19 devnull line = lexio->line;
196 564ca709 2004-04-19 devnull s = lexio;
197 564ca709 2004-04-19 devnull lexio = s->prev;
198 564ca709 2004-04-19 devnull free(s);
199 a8c15b08 2004-04-21 devnull nlexio--;
200 564ca709 2004-04-19 devnull setacidfile();
201 564ca709 2004-04-19 devnull return 1;
202 564ca709 2004-04-19 devnull }
203 564ca709 2004-04-19 devnull
204 564ca709 2004-04-19 devnull int
205 564ca709 2004-04-19 devnull Zfmt(Fmt *f)
206 564ca709 2004-04-19 devnull {
207 a8c15b08 2004-04-21 devnull char buf[1024], *p;
208 564ca709 2004-04-19 devnull IOstack *e;
209 564ca709 2004-04-19 devnull
210 564ca709 2004-04-19 devnull e = lexio;
211 564ca709 2004-04-19 devnull if(e) {
212 a8c15b08 2004-04-21 devnull p = seprint(buf, buf+sizeof buf, "%s:%d", e->name, line);
213 564ca709 2004-04-19 devnull while(e->prev) {
214 564ca709 2004-04-19 devnull e = e->prev;
215 564ca709 2004-04-19 devnull if(initialising && e->prev == 0)
216 564ca709 2004-04-19 devnull break;
217 a8c15b08 2004-04-21 devnull p = seprint(p, buf+sizeof buf, " [%s:%d]", e->name, e->line);
218 564ca709 2004-04-19 devnull }
219 564ca709 2004-04-19 devnull } else
220 564ca709 2004-04-19 devnull sprint(buf, "no file:0");
221 564ca709 2004-04-19 devnull fmtstrcpy(f, buf);
222 564ca709 2004-04-19 devnull return 0;
223 564ca709 2004-04-19 devnull }
224 564ca709 2004-04-19 devnull
225 564ca709 2004-04-19 devnull void
226 564ca709 2004-04-19 devnull unlexc(int s)
227 564ca709 2004-04-19 devnull {
228 564ca709 2004-04-19 devnull if(s == '\n')
229 564ca709 2004-04-19 devnull line--;
230 564ca709 2004-04-19 devnull
231 564ca709 2004-04-19 devnull if(lexio->fin)
232 564ca709 2004-04-19 devnull Bungetc(lexio->fin);
233 564ca709 2004-04-19 devnull else
234 564ca709 2004-04-19 devnull lexio->ip--;
235 564ca709 2004-04-19 devnull }
236 564ca709 2004-04-19 devnull
237 564ca709 2004-04-19 devnull int
238 564ca709 2004-04-19 devnull lexc(void)
239 564ca709 2004-04-19 devnull {
240 564ca709 2004-04-19 devnull int c;
241 564ca709 2004-04-19 devnull
242 564ca709 2004-04-19 devnull if(lexio->fin) {
243 564ca709 2004-04-19 devnull c = Bgetc(lexio->fin);
244 564ca709 2004-04-19 devnull if(gotint)
245 564ca709 2004-04-19 devnull error("interrupt");
246 564ca709 2004-04-19 devnull return c;
247 564ca709 2004-04-19 devnull }
248 564ca709 2004-04-19 devnull
249 564ca709 2004-04-19 devnull c = *lexio->ip++;
250 564ca709 2004-04-19 devnull if(c == 0)
251 564ca709 2004-04-19 devnull return -1;
252 564ca709 2004-04-19 devnull return c;
253 564ca709 2004-04-19 devnull }
254 564ca709 2004-04-19 devnull
255 564ca709 2004-04-19 devnull int
256 a47fbb16 2005-10-31 devnull escchar(int c)
257 564ca709 2004-04-19 devnull {
258 564ca709 2004-04-19 devnull int n;
259 564ca709 2004-04-19 devnull char buf[Strsize];
260 564ca709 2004-04-19 devnull
261 564ca709 2004-04-19 devnull if(c >= '0' && c <= '9') {
262 564ca709 2004-04-19 devnull n = 1;
263 564ca709 2004-04-19 devnull buf[0] = c;
264 564ca709 2004-04-19 devnull for(;;) {
265 564ca709 2004-04-19 devnull c = lexc();
266 564ca709 2004-04-19 devnull if(c == Eof)
267 564ca709 2004-04-19 devnull error("%d: <eof> in escape sequence", line);
268 564ca709 2004-04-19 devnull if(strchr("0123456789xX", c) == 0) {
269 564ca709 2004-04-19 devnull unlexc(c);
270 564ca709 2004-04-19 devnull break;
271 564ca709 2004-04-19 devnull }
272 564ca709 2004-04-19 devnull buf[n++] = c;
273 564ca709 2004-04-19 devnull }
274 564ca709 2004-04-19 devnull buf[n] = '\0';
275 564ca709 2004-04-19 devnull return strtol(buf, 0, 0);
276 564ca709 2004-04-19 devnull }
277 564ca709 2004-04-19 devnull
278 564ca709 2004-04-19 devnull n = cmap[(unsigned char)c];
279 564ca709 2004-04-19 devnull if(n == 0)
280 564ca709 2004-04-19 devnull return c;
281 564ca709 2004-04-19 devnull return n-1;
282 564ca709 2004-04-19 devnull }
283 564ca709 2004-04-19 devnull
284 564ca709 2004-04-19 devnull void
285 564ca709 2004-04-19 devnull eatstring(void)
286 564ca709 2004-04-19 devnull {
287 564ca709 2004-04-19 devnull int esc, c, cnt;
288 564ca709 2004-04-19 devnull char buf[Strsize];
289 564ca709 2004-04-19 devnull
290 564ca709 2004-04-19 devnull esc = 0;
291 564ca709 2004-04-19 devnull for(cnt = 0;;) {
292 564ca709 2004-04-19 devnull c = lexc();
293 564ca709 2004-04-19 devnull switch(c) {
294 564ca709 2004-04-19 devnull case Eof:
295 564ca709 2004-04-19 devnull error("%d: <eof> in string constant", line);
296 564ca709 2004-04-19 devnull
297 564ca709 2004-04-19 devnull case '\n':
298 564ca709 2004-04-19 devnull error("newline in string constant");
299 564ca709 2004-04-19 devnull goto done;
300 564ca709 2004-04-19 devnull
301 564ca709 2004-04-19 devnull case '\\':
302 564ca709 2004-04-19 devnull if(esc)
303 564ca709 2004-04-19 devnull goto Default;
304 564ca709 2004-04-19 devnull esc = 1;
305 564ca709 2004-04-19 devnull break;
306 564ca709 2004-04-19 devnull
307 564ca709 2004-04-19 devnull case '"':
308 564ca709 2004-04-19 devnull if(esc == 0)
309 564ca709 2004-04-19 devnull goto done;
310 564ca709 2004-04-19 devnull
311 564ca709 2004-04-19 devnull /* Fall through */
312 564ca709 2004-04-19 devnull default:
313 564ca709 2004-04-19 devnull Default:
314 564ca709 2004-04-19 devnull if(esc) {
315 564ca709 2004-04-19 devnull c = escchar(c);
316 564ca709 2004-04-19 devnull esc = 0;
317 564ca709 2004-04-19 devnull }
318 564ca709 2004-04-19 devnull buf[cnt++] = c;
319 564ca709 2004-04-19 devnull break;
320 564ca709 2004-04-19 devnull }
321 564ca709 2004-04-19 devnull if(cnt >= Strsize)
322 564ca709 2004-04-19 devnull error("string token too long");
323 564ca709 2004-04-19 devnull }
324 564ca709 2004-04-19 devnull done:
325 564ca709 2004-04-19 devnull buf[cnt] = '\0';
326 564ca709 2004-04-19 devnull yylval.string = strnode(buf);
327 564ca709 2004-04-19 devnull }
328 564ca709 2004-04-19 devnull
329 564ca709 2004-04-19 devnull void
330 564ca709 2004-04-19 devnull eatnl(void)
331 564ca709 2004-04-19 devnull {
332 564ca709 2004-04-19 devnull int c;
333 564ca709 2004-04-19 devnull
334 564ca709 2004-04-19 devnull line++;
335 564ca709 2004-04-19 devnull for(;;) {
336 564ca709 2004-04-19 devnull c = lexc();
337 564ca709 2004-04-19 devnull if(c == Eof)
338 564ca709 2004-04-19 devnull error("eof in comment");
339 564ca709 2004-04-19 devnull if(c == '\n')
340 564ca709 2004-04-19 devnull return;
341 564ca709 2004-04-19 devnull }
342 564ca709 2004-04-19 devnull }
343 564ca709 2004-04-19 devnull
344 564ca709 2004-04-19 devnull int
345 564ca709 2004-04-19 devnull yylex(void)
346 564ca709 2004-04-19 devnull {
347 564ca709 2004-04-19 devnull int c;
348 564ca709 2004-04-19 devnull extern char vfmt[];
349 564ca709 2004-04-19 devnull
350 564ca709 2004-04-19 devnull loop:
351 564ca709 2004-04-19 devnull Bflush(bout);
352 564ca709 2004-04-19 devnull c = lexc();
353 564ca709 2004-04-19 devnull switch(c) {
354 564ca709 2004-04-19 devnull case Eof:
355 564ca709 2004-04-19 devnull if(gotint) {
356 564ca709 2004-04-19 devnull gotint = 0;
357 564ca709 2004-04-19 devnull stacked = 0;
358 564ca709 2004-04-19 devnull Bprint(bout, "\nacid; ");
359 564ca709 2004-04-19 devnull goto loop;
360 564ca709 2004-04-19 devnull }
361 564ca709 2004-04-19 devnull return Eof;
362 564ca709 2004-04-19 devnull
363 564ca709 2004-04-19 devnull case '"':
364 564ca709 2004-04-19 devnull eatstring();
365 564ca709 2004-04-19 devnull return Tstring;
366 564ca709 2004-04-19 devnull
367 564ca709 2004-04-19 devnull case ' ':
368 564ca709 2004-04-19 devnull case '\t':
369 564ca709 2004-04-19 devnull goto loop;
370 564ca709 2004-04-19 devnull
371 564ca709 2004-04-19 devnull case '\n':
372 564ca709 2004-04-19 devnull line++;
373 564ca709 2004-04-19 devnull if(interactive == 0)
374 564ca709 2004-04-19 devnull goto loop;
375 564ca709 2004-04-19 devnull if(stacked) {
376 564ca709 2004-04-19 devnull print("\t");
377 564ca709 2004-04-19 devnull goto loop;
378 564ca709 2004-04-19 devnull }
379 564ca709 2004-04-19 devnull nlcount++;
380 564ca709 2004-04-19 devnull return ';';
381 564ca709 2004-04-19 devnull
382 564ca709 2004-04-19 devnull case '.':
383 564ca709 2004-04-19 devnull c = lexc();
384 564ca709 2004-04-19 devnull unlexc(c);
385 564ca709 2004-04-19 devnull if(isdigit(c))
386 564ca709 2004-04-19 devnull return numsym('.');
387 564ca709 2004-04-19 devnull
388 564ca709 2004-04-19 devnull return '.';
389 564ca709 2004-04-19 devnull
390 564ca709 2004-04-19 devnull case '(':
391 564ca709 2004-04-19 devnull case ')':
392 564ca709 2004-04-19 devnull case '[':
393 564ca709 2004-04-19 devnull case ']':
394 564ca709 2004-04-19 devnull case ';':
395 564ca709 2004-04-19 devnull case ':':
396 564ca709 2004-04-19 devnull case ',':
397 564ca709 2004-04-19 devnull case '~':
398 564ca709 2004-04-19 devnull case '?':
399 564ca709 2004-04-19 devnull case '*':
400 564ca709 2004-04-19 devnull case '@':
401 564ca709 2004-04-19 devnull case '^':
402 564ca709 2004-04-19 devnull case '%':
403 564ca709 2004-04-19 devnull return c;
404 564ca709 2004-04-19 devnull case '{':
405 564ca709 2004-04-19 devnull stacked++;
406 564ca709 2004-04-19 devnull return c;
407 564ca709 2004-04-19 devnull case '}':
408 564ca709 2004-04-19 devnull stacked--;
409 564ca709 2004-04-19 devnull return c;
410 564ca709 2004-04-19 devnull
411 564ca709 2004-04-19 devnull case '\\':
412 564ca709 2004-04-19 devnull c = lexc();
413 564ca709 2004-04-19 devnull if(strchr(vfmt, c) == 0) {
414 564ca709 2004-04-19 devnull unlexc(c);
415 564ca709 2004-04-19 devnull return '\\';
416 564ca709 2004-04-19 devnull }
417 564ca709 2004-04-19 devnull yylval.ival = c;
418 564ca709 2004-04-19 devnull return Tfmt;
419 564ca709 2004-04-19 devnull
420 564ca709 2004-04-19 devnull case '!':
421 564ca709 2004-04-19 devnull c = lexc();
422 564ca709 2004-04-19 devnull if(c == '=')
423 564ca709 2004-04-19 devnull return Tneq;
424 564ca709 2004-04-19 devnull unlexc(c);
425 564ca709 2004-04-19 devnull return '!';
426 564ca709 2004-04-19 devnull
427 564ca709 2004-04-19 devnull case '+':
428 564ca709 2004-04-19 devnull c = lexc();
429 564ca709 2004-04-19 devnull if(c == '+')
430 564ca709 2004-04-19 devnull return Tinc;
431 564ca709 2004-04-19 devnull unlexc(c);
432 564ca709 2004-04-19 devnull return '+';
433 564ca709 2004-04-19 devnull
434 564ca709 2004-04-19 devnull case '/':
435 564ca709 2004-04-19 devnull c = lexc();
436 564ca709 2004-04-19 devnull if(c == '/') {
437 564ca709 2004-04-19 devnull eatnl();
438 564ca709 2004-04-19 devnull goto loop;
439 564ca709 2004-04-19 devnull }
440 564ca709 2004-04-19 devnull unlexc(c);
441 564ca709 2004-04-19 devnull return '/';
442 564ca709 2004-04-19 devnull
443 564ca709 2004-04-19 devnull case '\'':
444 564ca709 2004-04-19 devnull c = lexc();
445 564ca709 2004-04-19 devnull if(c == '\\')
446 564ca709 2004-04-19 devnull yylval.ival = escchar(lexc());
447 564ca709 2004-04-19 devnull else
448 564ca709 2004-04-19 devnull yylval.ival = c;
449 564ca709 2004-04-19 devnull c = lexc();
450 564ca709 2004-04-19 devnull if(c != '\'') {
451 564ca709 2004-04-19 devnull error("missing '");
452 564ca709 2004-04-19 devnull unlexc(c);
453 564ca709 2004-04-19 devnull }
454 564ca709 2004-04-19 devnull return Tconst;
455 564ca709 2004-04-19 devnull
456 564ca709 2004-04-19 devnull case '&':
457 564ca709 2004-04-19 devnull c = lexc();
458 564ca709 2004-04-19 devnull if(c == '&')
459 564ca709 2004-04-19 devnull return Tandand;
460 564ca709 2004-04-19 devnull unlexc(c);
461 564ca709 2004-04-19 devnull return '&';
462 564ca709 2004-04-19 devnull
463 564ca709 2004-04-19 devnull case '=':
464 564ca709 2004-04-19 devnull c = lexc();
465 564ca709 2004-04-19 devnull if(c == '=')
466 564ca709 2004-04-19 devnull return Teq;
467 564ca709 2004-04-19 devnull unlexc(c);
468 564ca709 2004-04-19 devnull return '=';
469 564ca709 2004-04-19 devnull
470 564ca709 2004-04-19 devnull case '|':
471 564ca709 2004-04-19 devnull c = lexc();
472 564ca709 2004-04-19 devnull if(c == '|')
473 564ca709 2004-04-19 devnull return Toror;
474 564ca709 2004-04-19 devnull unlexc(c);
475 564ca709 2004-04-19 devnull return '|';
476 564ca709 2004-04-19 devnull
477 564ca709 2004-04-19 devnull case '<':
478 564ca709 2004-04-19 devnull c = lexc();
479 564ca709 2004-04-19 devnull if(c == '=')
480 564ca709 2004-04-19 devnull return Tleq;
481 564ca709 2004-04-19 devnull if(c == '<')
482 564ca709 2004-04-19 devnull return Tlsh;
483 564ca709 2004-04-19 devnull unlexc(c);
484 564ca709 2004-04-19 devnull return '<';
485 564ca709 2004-04-19 devnull
486 564ca709 2004-04-19 devnull case '>':
487 564ca709 2004-04-19 devnull c = lexc();
488 564ca709 2004-04-19 devnull if(c == '=')
489 564ca709 2004-04-19 devnull return Tgeq;
490 564ca709 2004-04-19 devnull if(c == '>')
491 564ca709 2004-04-19 devnull return Trsh;
492 564ca709 2004-04-19 devnull unlexc(c);
493 564ca709 2004-04-19 devnull return '>';
494 564ca709 2004-04-19 devnull
495 564ca709 2004-04-19 devnull case '-':
496 564ca709 2004-04-19 devnull c = lexc();
497 564ca709 2004-04-19 devnull
498 564ca709 2004-04-19 devnull if(c == '>')
499 564ca709 2004-04-19 devnull return Tindir;
500 564ca709 2004-04-19 devnull
501 564ca709 2004-04-19 devnull if(c == '-')
502 564ca709 2004-04-19 devnull return Tdec;
503 564ca709 2004-04-19 devnull unlexc(c);
504 564ca709 2004-04-19 devnull return '-';
505 564ca709 2004-04-19 devnull
506 564ca709 2004-04-19 devnull default:
507 564ca709 2004-04-19 devnull return numsym(c);
508 564ca709 2004-04-19 devnull }
509 564ca709 2004-04-19 devnull }
510 564ca709 2004-04-19 devnull
511 564ca709 2004-04-19 devnull int
512 564ca709 2004-04-19 devnull numsym(char first)
513 564ca709 2004-04-19 devnull {
514 564ca709 2004-04-19 devnull int c, isbin, isfloat, ishex;
515 564ca709 2004-04-19 devnull char *sel, *p;
516 564ca709 2004-04-19 devnull Lsym *s;
517 564ca709 2004-04-19 devnull
518 564ca709 2004-04-19 devnull symbol[0] = first;
519 564ca709 2004-04-19 devnull p = symbol;
520 564ca709 2004-04-19 devnull
521 564ca709 2004-04-19 devnull ishex = 0;
522 564ca709 2004-04-19 devnull isbin = 0;
523 564ca709 2004-04-19 devnull isfloat = 0;
524 564ca709 2004-04-19 devnull if(first == '.')
525 564ca709 2004-04-19 devnull isfloat = 1;
526 564ca709 2004-04-19 devnull
527 3bd56b04 2005-09-09 devnull if(isdigit((uchar)*p++) || isfloat) {
528 564ca709 2004-04-19 devnull for(;;) {
529 564ca709 2004-04-19 devnull c = lexc();
530 564ca709 2004-04-19 devnull if(c < 0)
531 564ca709 2004-04-19 devnull error("%d: <eof> eating symbols", line);
532 564ca709 2004-04-19 devnull
533 564ca709 2004-04-19 devnull if(c == '\n')
534 564ca709 2004-04-19 devnull line++;
535 564ca709 2004-04-19 devnull sel = "01234567890.xb";
536 564ca709 2004-04-19 devnull if(ishex)
537 564ca709 2004-04-19 devnull sel = "01234567890abcdefABCDEF";
538 564ca709 2004-04-19 devnull else if(isbin)
539 564ca709 2004-04-19 devnull sel = "01";
540 564ca709 2004-04-19 devnull else if(isfloat)
541 564ca709 2004-04-19 devnull sel = "01234567890eE-+";
542 564ca709 2004-04-19 devnull
543 564ca709 2004-04-19 devnull if(strchr(sel, c) == 0) {
544 564ca709 2004-04-19 devnull unlexc(c);
545 564ca709 2004-04-19 devnull break;
546 564ca709 2004-04-19 devnull }
547 564ca709 2004-04-19 devnull if(c == '.')
548 564ca709 2004-04-19 devnull isfloat = 1;
549 564ca709 2004-04-19 devnull if(!isbin && c == 'x')
550 564ca709 2004-04-19 devnull ishex = 1;
551 564ca709 2004-04-19 devnull if(!ishex && c == 'b')
552 564ca709 2004-04-19 devnull isbin = 1;
553 564ca709 2004-04-19 devnull *p++ = c;
554 564ca709 2004-04-19 devnull }
555 564ca709 2004-04-19 devnull *p = '\0';
556 564ca709 2004-04-19 devnull if(isfloat) {
557 564ca709 2004-04-19 devnull yylval.fval = atof(symbol);
558 564ca709 2004-04-19 devnull return Tfconst;
559 564ca709 2004-04-19 devnull }
560 564ca709 2004-04-19 devnull
561 564ca709 2004-04-19 devnull if(isbin)
562 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol+2, 0, 2);
563 564ca709 2004-04-19 devnull else
564 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol, 0, 0);
565 564ca709 2004-04-19 devnull return Tconst;
566 564ca709 2004-04-19 devnull }
567 564ca709 2004-04-19 devnull
568 564ca709 2004-04-19 devnull for(;;) {
569 564ca709 2004-04-19 devnull c = lexc();
570 564ca709 2004-04-19 devnull if(c < 0)
571 564ca709 2004-04-19 devnull error("%d <eof> eating symbols", line);
572 564ca709 2004-04-19 devnull if(c == '\n')
573 564ca709 2004-04-19 devnull line++;
574 564ca709 2004-04-19 devnull if(c != '_' && c != '$' && c <= '~' && !isalnum(c)) { /* checking against ~ lets UTF names through */
575 564ca709 2004-04-19 devnull unlexc(c);
576 564ca709 2004-04-19 devnull break;
577 564ca709 2004-04-19 devnull }
578 564ca709 2004-04-19 devnull *p++ = c;
579 564ca709 2004-04-19 devnull }
580 564ca709 2004-04-19 devnull
581 564ca709 2004-04-19 devnull *p = '\0';
582 564ca709 2004-04-19 devnull
583 564ca709 2004-04-19 devnull s = look(symbol);
584 564ca709 2004-04-19 devnull if(s == 0)
585 564ca709 2004-04-19 devnull s = enter(symbol, Tid);
586 564ca709 2004-04-19 devnull
587 564ca709 2004-04-19 devnull yylval.sym = s;
588 564ca709 2004-04-19 devnull return s->lexval;
589 564ca709 2004-04-19 devnull }
590 564ca709 2004-04-19 devnull
591 564ca709 2004-04-19 devnull Lsym*
592 564ca709 2004-04-19 devnull enter(char *name, int t)
593 564ca709 2004-04-19 devnull {
594 564ca709 2004-04-19 devnull Lsym *s;
595 564ca709 2004-04-19 devnull ulong h;
596 564ca709 2004-04-19 devnull char *p;
597 564ca709 2004-04-19 devnull Value *v;
598 564ca709 2004-04-19 devnull
599 564ca709 2004-04-19 devnull h = 0;
600 564ca709 2004-04-19 devnull for(p = name; *p; p++)
601 564ca709 2004-04-19 devnull h = h*3 + *p;
602 564ca709 2004-04-19 devnull h %= Hashsize;
603 564ca709 2004-04-19 devnull
604 564ca709 2004-04-19 devnull s = gmalloc(sizeof(Lsym));
605 564ca709 2004-04-19 devnull memset(s, 0, sizeof(Lsym));
606 564ca709 2004-04-19 devnull s->name = strdup(name);
607 564ca709 2004-04-19 devnull
608 564ca709 2004-04-19 devnull s->hash = hash[h];
609 564ca709 2004-04-19 devnull hash[h] = s;
610 564ca709 2004-04-19 devnull s->lexval = t;
611 564ca709 2004-04-19 devnull
612 564ca709 2004-04-19 devnull v = gmalloc(sizeof(Value));
613 564ca709 2004-04-19 devnull s->v = v;
614 564ca709 2004-04-19 devnull
615 564ca709 2004-04-19 devnull v->store.fmt = 'X';
616 564ca709 2004-04-19 devnull v->type = TINT;
617 564ca709 2004-04-19 devnull memset(v, 0, sizeof(Value));
618 564ca709 2004-04-19 devnull
619 564ca709 2004-04-19 devnull return s;
620 564ca709 2004-04-19 devnull }
621 564ca709 2004-04-19 devnull
622 564ca709 2004-04-19 devnull void
623 564ca709 2004-04-19 devnull delsym(Lsym *s)
624 564ca709 2004-04-19 devnull {
625 564ca709 2004-04-19 devnull char *q;
626 564ca709 2004-04-19 devnull ulong h;
627 564ca709 2004-04-19 devnull Lsym *p;
628 564ca709 2004-04-19 devnull
629 564ca709 2004-04-19 devnull h = 0;
630 564ca709 2004-04-19 devnull for(q = s->name; *q; q++)
631 564ca709 2004-04-19 devnull h = h*3 + *q;
632 564ca709 2004-04-19 devnull h %= Hashsize;
633 564ca709 2004-04-19 devnull
634 564ca709 2004-04-19 devnull if(hash[h] == s)
635 564ca709 2004-04-19 devnull hash[h] = s->hash;
636 564ca709 2004-04-19 devnull else{
637 564ca709 2004-04-19 devnull for(p=hash[h]; p && p->hash != s; p=p->hash)
638 564ca709 2004-04-19 devnull ;
639 564ca709 2004-04-19 devnull if(p)
640 564ca709 2004-04-19 devnull p->hash = s->hash;
641 564ca709 2004-04-19 devnull }
642 564ca709 2004-04-19 devnull s->hash = nil;
643 564ca709 2004-04-19 devnull }
644 564ca709 2004-04-19 devnull
645 564ca709 2004-04-19 devnull Lsym*
646 564ca709 2004-04-19 devnull look(char *name)
647 564ca709 2004-04-19 devnull {
648 564ca709 2004-04-19 devnull Lsym *s;
649 564ca709 2004-04-19 devnull ulong h;
650 564ca709 2004-04-19 devnull char *p;
651 564ca709 2004-04-19 devnull
652 564ca709 2004-04-19 devnull h = 0;
653 564ca709 2004-04-19 devnull for(p = name; *p; p++)
654 564ca709 2004-04-19 devnull h = h*3 + *p;
655 564ca709 2004-04-19 devnull h %= Hashsize;
656 564ca709 2004-04-19 devnull
657 564ca709 2004-04-19 devnull for(s = hash[h]; s; s = s->hash)
658 564ca709 2004-04-19 devnull if(strcmp(name, s->name) == 0)
659 564ca709 2004-04-19 devnull return s;
660 564ca709 2004-04-19 devnull return 0;
661 564ca709 2004-04-19 devnull }
662 564ca709 2004-04-19 devnull
663 564ca709 2004-04-19 devnull Lsym*
664 564ca709 2004-04-19 devnull mkvar(char *s)
665 564ca709 2004-04-19 devnull {
666 564ca709 2004-04-19 devnull Lsym *l;
667 564ca709 2004-04-19 devnull
668 564ca709 2004-04-19 devnull l = look(s);
669 564ca709 2004-04-19 devnull if(l == 0)
670 564ca709 2004-04-19 devnull l = enter(s, Tid);
671 564ca709 2004-04-19 devnull return l;
672 564ca709 2004-04-19 devnull }