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"
10 564ca709 2004-04-19 devnull struct keywd
12 564ca709 2004-04-19 devnull char *name;
13 564ca709 2004-04-19 devnull int terminal;
15 564ca709 2004-04-19 devnull keywds[] =
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,
40 e637c944 2004-04-20 devnull char cmap[256];
43 e637c944 2004-04-20 devnull initcmap(void)
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;
58 564ca709 2004-04-19 devnull kinit(void)
62 e637c944 2004-04-20 devnull initcmap();
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);
68 564ca709 2004-04-19 devnull typedef struct IOstack IOstack;
69 564ca709 2004-04-19 devnull struct IOstack
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;
78 564ca709 2004-04-19 devnull IOstack *lexio;
79 a8c15b08 2004-04-21 devnull uint nlexio;
82 564ca709 2004-04-19 devnull setacidfile(void)
84 564ca709 2004-04-19 devnull char *name;
87 564ca709 2004-04-19 devnull if(lexio)
88 564ca709 2004-04-19 devnull name = lexio->name;
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);
99 564ca709 2004-04-19 devnull pushfile(char *file)
101 564ca709 2004-04-19 devnull Biobuf *b;
102 564ca709 2004-04-19 devnull IOstack *io;
104 a8c15b08 2004-04-21 devnull if(nlexio > 64)
105 a8c15b08 2004-04-21 devnull error("too many includes");
107 564ca709 2004-04-19 devnull if(file)
108 564ca709 2004-04-19 devnull b = Bopen(file, OREAD);
110 564ca709 2004-04-19 devnull b = Bopen(unsharp("#d/0"), OREAD);
111 564ca709 2004-04-19 devnull file = "<stdin>";
114 564ca709 2004-04-19 devnull if(b == 0)
115 564ca709 2004-04-19 devnull error("pushfile: %s: %r", file);
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();
134 564ca709 2004-04-19 devnull pushfd(int fd)
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;
144 564ca709 2004-04-19 devnull pushstr(Node *s)
146 564ca709 2004-04-19 devnull IOstack *io;
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();
170 564ca709 2004-04-19 devnull restartio(void)
172 564ca709 2004-04-19 devnull Bflush(lexio->fin);
173 564ca709 2004-04-19 devnull Binit(lexio->fin, 0, OREAD);
177 564ca709 2004-04-19 devnull popio(void)
179 564ca709 2004-04-19 devnull IOstack *s;
181 564ca709 2004-04-19 devnull if(lexio == 0)
182 564ca709 2004-04-19 devnull return 0;
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;
190 564ca709 2004-04-19 devnull if(lexio->fin)
191 564ca709 2004-04-19 devnull Bterm(lexio->fin);
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;
205 564ca709 2004-04-19 devnull Zfmt(Fmt *f)
207 a8c15b08 2004-04-21 devnull char buf[1024], *p;
208 564ca709 2004-04-19 devnull IOstack *e;
210 564ca709 2004-04-19 devnull e = lexio;
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)
217 a8c15b08 2004-04-21 devnull p = seprint(p, buf+sizeof buf, " [%s:%d]", e->name, e->line);
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;
226 564ca709 2004-04-19 devnull unlexc(int s)
228 564ca709 2004-04-19 devnull if(s == '\n')
231 564ca709 2004-04-19 devnull if(lexio->fin)
232 564ca709 2004-04-19 devnull Bungetc(lexio->fin);
234 564ca709 2004-04-19 devnull lexio->ip--;
238 564ca709 2004-04-19 devnull lexc(void)
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;
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;
256 564ca709 2004-04-19 devnull escchar(char c)
259 564ca709 2004-04-19 devnull char buf[Strsize];
261 564ca709 2004-04-19 devnull if(c >= '0' && c <= '9') {
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);
272 564ca709 2004-04-19 devnull buf[n++] = c;
274 564ca709 2004-04-19 devnull buf[n] = '\0';
275 564ca709 2004-04-19 devnull return strtol(buf, 0, 0);
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;
285 564ca709 2004-04-19 devnull eatstring(void)
287 564ca709 2004-04-19 devnull int esc, c, cnt;
288 564ca709 2004-04-19 devnull char buf[Strsize];
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);
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;
301 564ca709 2004-04-19 devnull case '\\':
303 564ca709 2004-04-19 devnull goto Default;
304 564ca709 2004-04-19 devnull esc = 1;
307 564ca709 2004-04-19 devnull case '"':
308 564ca709 2004-04-19 devnull if(esc == 0)
309 564ca709 2004-04-19 devnull goto done;
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;
318 564ca709 2004-04-19 devnull buf[cnt++] = c;
321 564ca709 2004-04-19 devnull if(cnt >= Strsize)
322 564ca709 2004-04-19 devnull error("string token too long");
325 564ca709 2004-04-19 devnull buf[cnt] = '\0';
326 564ca709 2004-04-19 devnull yylval.string = strnode(buf);
330 564ca709 2004-04-19 devnull eatnl(void)
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')
345 564ca709 2004-04-19 devnull yylex(void)
348 564ca709 2004-04-19 devnull extern char vfmt[];
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;
361 564ca709 2004-04-19 devnull return Eof;
363 564ca709 2004-04-19 devnull case '"':
364 564ca709 2004-04-19 devnull eatstring();
365 564ca709 2004-04-19 devnull return Tstring;
367 564ca709 2004-04-19 devnull case ' ':
368 564ca709 2004-04-19 devnull case '\t':
369 564ca709 2004-04-19 devnull goto loop;
371 564ca709 2004-04-19 devnull case '\n':
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;
379 564ca709 2004-04-19 devnull nlcount++;
380 564ca709 2004-04-19 devnull return ';';
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('.');
388 564ca709 2004-04-19 devnull return '.';
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;
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 '\\';
417 564ca709 2004-04-19 devnull yylval.ival = c;
418 564ca709 2004-04-19 devnull return Tfmt;
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 '!';
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 '+';
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;
440 564ca709 2004-04-19 devnull unlexc(c);
441 564ca709 2004-04-19 devnull return '/';
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());
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);
454 564ca709 2004-04-19 devnull return Tconst;
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 '&';
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 '=';
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 '|';
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 '<';
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 '>';
495 564ca709 2004-04-19 devnull case '-':
496 564ca709 2004-04-19 devnull c = lexc();
498 564ca709 2004-04-19 devnull if(c == '>')
499 564ca709 2004-04-19 devnull return Tindir;
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 '-';
506 564ca709 2004-04-19 devnull default:
507 564ca709 2004-04-19 devnull return numsym(c);
512 564ca709 2004-04-19 devnull numsym(char first)
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;
518 564ca709 2004-04-19 devnull symbol[0] = first;
519 564ca709 2004-04-19 devnull p = symbol;
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;
527 564ca709 2004-04-19 devnull if(isdigit(*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);
533 564ca709 2004-04-19 devnull if(c == '\n')
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-+";
543 564ca709 2004-04-19 devnull if(strchr(sel, c) == 0) {
544 564ca709 2004-04-19 devnull unlexc(c);
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;
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;
561 564ca709 2004-04-19 devnull if(isbin)
562 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol+2, 0, 2);
564 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol, 0, 0);
565 564ca709 2004-04-19 devnull return Tconst;
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')
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);
578 564ca709 2004-04-19 devnull *p++ = c;
581 564ca709 2004-04-19 devnull *p = '\0';
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);
587 564ca709 2004-04-19 devnull yylval.sym = s;
588 564ca709 2004-04-19 devnull return s->lexval;
592 564ca709 2004-04-19 devnull enter(char *name, int t)
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;
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;
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);
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;
612 564ca709 2004-04-19 devnull v = gmalloc(sizeof(Value));
613 564ca709 2004-04-19 devnull s->v = v;
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));
619 564ca709 2004-04-19 devnull return s;
623 564ca709 2004-04-19 devnull delsym(Lsym *s)
625 564ca709 2004-04-19 devnull char *q;
626 564ca709 2004-04-19 devnull ulong h;
627 564ca709 2004-04-19 devnull Lsym *p;
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;
634 564ca709 2004-04-19 devnull if(hash[h] == s)
635 564ca709 2004-04-19 devnull hash[h] = s->hash;
637 564ca709 2004-04-19 devnull for(p=hash[h]; p && p->hash != s; p=p->hash)
640 564ca709 2004-04-19 devnull p->hash = s->hash;
642 564ca709 2004-04-19 devnull s->hash = nil;
646 564ca709 2004-04-19 devnull look(char *name)
648 564ca709 2004-04-19 devnull Lsym *s;
649 564ca709 2004-04-19 devnull ulong h;
650 564ca709 2004-04-19 devnull char *p;
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;
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;
664 564ca709 2004-04-19 devnull mkvar(char *s)
666 564ca709 2004-04-19 devnull Lsym *l;
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;