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 a47fbb16 2005-10-31 devnull escchar(int 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 6c7ed6b0 2005-11-29 devnull bqsymbol(void)
348 6c7ed6b0 2005-11-29 devnull char *p;
349 6c7ed6b0 2005-11-29 devnull Lsym *s;
351 6c7ed6b0 2005-11-29 devnull p = symbol;
352 6c7ed6b0 2005-11-29 devnull while((c = lexc()) != '`'){
353 6c7ed6b0 2005-11-29 devnull if(c == Eof)
354 6c7ed6b0 2005-11-29 devnull error("eof in backquote");
355 6c7ed6b0 2005-11-29 devnull if(c == '\n')
356 6c7ed6b0 2005-11-29 devnull error("newline in backquote");
357 6c7ed6b0 2005-11-29 devnull *p++ = c;
359 6c7ed6b0 2005-11-29 devnull if(p >= symbol+sizeof symbol)
360 6c7ed6b0 2005-11-29 devnull sysfatal("overflow in bqsymbol");
363 6c7ed6b0 2005-11-29 devnull s = look(symbol);
364 6c7ed6b0 2005-11-29 devnull if(s == 0)
365 6c7ed6b0 2005-11-29 devnull s = enter(symbol, Tid);
366 6c7ed6b0 2005-11-29 devnull yylval.sym = s;
367 6c7ed6b0 2005-11-29 devnull return s->lexval;
371 564ca709 2004-04-19 devnull yylex(void)
374 564ca709 2004-04-19 devnull extern char vfmt[];
377 564ca709 2004-04-19 devnull Bflush(bout);
378 564ca709 2004-04-19 devnull c = lexc();
379 564ca709 2004-04-19 devnull switch(c) {
380 564ca709 2004-04-19 devnull case Eof:
381 564ca709 2004-04-19 devnull if(gotint) {
382 564ca709 2004-04-19 devnull gotint = 0;
383 564ca709 2004-04-19 devnull stacked = 0;
384 564ca709 2004-04-19 devnull Bprint(bout, "\nacid; ");
385 564ca709 2004-04-19 devnull goto loop;
387 564ca709 2004-04-19 devnull return Eof;
389 6c7ed6b0 2005-11-29 devnull case '`':
390 6c7ed6b0 2005-11-29 devnull return bqsymbol();
392 564ca709 2004-04-19 devnull case '"':
393 564ca709 2004-04-19 devnull eatstring();
394 564ca709 2004-04-19 devnull return Tstring;
396 564ca709 2004-04-19 devnull case ' ':
397 564ca709 2004-04-19 devnull case '\t':
398 564ca709 2004-04-19 devnull goto loop;
400 564ca709 2004-04-19 devnull case '\n':
402 564ca709 2004-04-19 devnull if(interactive == 0)
403 564ca709 2004-04-19 devnull goto loop;
404 564ca709 2004-04-19 devnull if(stacked) {
405 564ca709 2004-04-19 devnull print("\t");
406 564ca709 2004-04-19 devnull goto loop;
408 564ca709 2004-04-19 devnull nlcount++;
409 564ca709 2004-04-19 devnull return ';';
411 564ca709 2004-04-19 devnull case '.':
412 564ca709 2004-04-19 devnull c = lexc();
413 564ca709 2004-04-19 devnull unlexc(c);
414 564ca709 2004-04-19 devnull if(isdigit(c))
415 564ca709 2004-04-19 devnull return numsym('.');
417 564ca709 2004-04-19 devnull return '.';
419 564ca709 2004-04-19 devnull case '(':
420 564ca709 2004-04-19 devnull case ')':
421 564ca709 2004-04-19 devnull case '[':
422 564ca709 2004-04-19 devnull case ']':
423 564ca709 2004-04-19 devnull case ';':
424 564ca709 2004-04-19 devnull case ':':
425 564ca709 2004-04-19 devnull case ',':
426 564ca709 2004-04-19 devnull case '~':
427 564ca709 2004-04-19 devnull case '?':
428 564ca709 2004-04-19 devnull case '*':
429 564ca709 2004-04-19 devnull case '@':
430 564ca709 2004-04-19 devnull case '^':
431 564ca709 2004-04-19 devnull case '%':
432 564ca709 2004-04-19 devnull return c;
433 564ca709 2004-04-19 devnull case '{':
434 564ca709 2004-04-19 devnull stacked++;
435 564ca709 2004-04-19 devnull return c;
436 564ca709 2004-04-19 devnull case '}':
437 564ca709 2004-04-19 devnull stacked--;
438 564ca709 2004-04-19 devnull return c;
440 564ca709 2004-04-19 devnull case '\\':
441 564ca709 2004-04-19 devnull c = lexc();
442 564ca709 2004-04-19 devnull if(strchr(vfmt, c) == 0) {
443 564ca709 2004-04-19 devnull unlexc(c);
444 564ca709 2004-04-19 devnull return '\\';
446 564ca709 2004-04-19 devnull yylval.ival = c;
447 564ca709 2004-04-19 devnull return Tfmt;
449 564ca709 2004-04-19 devnull case '!':
450 564ca709 2004-04-19 devnull c = lexc();
451 564ca709 2004-04-19 devnull if(c == '=')
452 564ca709 2004-04-19 devnull return Tneq;
453 564ca709 2004-04-19 devnull unlexc(c);
454 564ca709 2004-04-19 devnull return '!';
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 Tinc;
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 eatnl();
467 564ca709 2004-04-19 devnull goto loop;
469 564ca709 2004-04-19 devnull unlexc(c);
470 564ca709 2004-04-19 devnull return '/';
472 564ca709 2004-04-19 devnull case '\'':
473 564ca709 2004-04-19 devnull c = lexc();
474 564ca709 2004-04-19 devnull if(c == '\\')
475 564ca709 2004-04-19 devnull yylval.ival = escchar(lexc());
477 564ca709 2004-04-19 devnull yylval.ival = c;
478 564ca709 2004-04-19 devnull c = lexc();
479 564ca709 2004-04-19 devnull if(c != '\'') {
480 564ca709 2004-04-19 devnull error("missing '");
481 564ca709 2004-04-19 devnull unlexc(c);
483 564ca709 2004-04-19 devnull return Tconst;
485 564ca709 2004-04-19 devnull case '&':
486 564ca709 2004-04-19 devnull c = lexc();
487 564ca709 2004-04-19 devnull if(c == '&')
488 564ca709 2004-04-19 devnull return Tandand;
489 564ca709 2004-04-19 devnull unlexc(c);
490 564ca709 2004-04-19 devnull return '&';
492 564ca709 2004-04-19 devnull case '=':
493 564ca709 2004-04-19 devnull c = lexc();
494 564ca709 2004-04-19 devnull if(c == '=')
495 564ca709 2004-04-19 devnull return Teq;
496 564ca709 2004-04-19 devnull unlexc(c);
497 564ca709 2004-04-19 devnull return '=';
499 564ca709 2004-04-19 devnull case '|':
500 564ca709 2004-04-19 devnull c = lexc();
501 564ca709 2004-04-19 devnull if(c == '|')
502 564ca709 2004-04-19 devnull return Toror;
503 564ca709 2004-04-19 devnull unlexc(c);
504 564ca709 2004-04-19 devnull return '|';
506 564ca709 2004-04-19 devnull case '<':
507 564ca709 2004-04-19 devnull c = lexc();
508 564ca709 2004-04-19 devnull if(c == '=')
509 564ca709 2004-04-19 devnull return Tleq;
510 564ca709 2004-04-19 devnull if(c == '<')
511 564ca709 2004-04-19 devnull return Tlsh;
512 564ca709 2004-04-19 devnull unlexc(c);
513 564ca709 2004-04-19 devnull return '<';
515 564ca709 2004-04-19 devnull case '>':
516 564ca709 2004-04-19 devnull c = lexc();
517 564ca709 2004-04-19 devnull if(c == '=')
518 564ca709 2004-04-19 devnull return Tgeq;
519 564ca709 2004-04-19 devnull if(c == '>')
520 564ca709 2004-04-19 devnull return Trsh;
521 564ca709 2004-04-19 devnull unlexc(c);
522 564ca709 2004-04-19 devnull return '>';
524 564ca709 2004-04-19 devnull case '-':
525 564ca709 2004-04-19 devnull c = lexc();
527 564ca709 2004-04-19 devnull if(c == '>')
528 564ca709 2004-04-19 devnull return Tindir;
530 564ca709 2004-04-19 devnull if(c == '-')
531 564ca709 2004-04-19 devnull return Tdec;
532 564ca709 2004-04-19 devnull unlexc(c);
533 564ca709 2004-04-19 devnull return '-';
535 564ca709 2004-04-19 devnull default:
536 564ca709 2004-04-19 devnull return numsym(c);
541 564ca709 2004-04-19 devnull numsym(char first)
543 564ca709 2004-04-19 devnull int c, isbin, isfloat, ishex;
544 564ca709 2004-04-19 devnull char *sel, *p;
545 564ca709 2004-04-19 devnull Lsym *s;
547 564ca709 2004-04-19 devnull symbol[0] = first;
548 564ca709 2004-04-19 devnull p = symbol;
550 564ca709 2004-04-19 devnull ishex = 0;
551 564ca709 2004-04-19 devnull isbin = 0;
552 564ca709 2004-04-19 devnull isfloat = 0;
553 564ca709 2004-04-19 devnull if(first == '.')
554 564ca709 2004-04-19 devnull isfloat = 1;
556 3bd56b04 2005-09-09 devnull if(isdigit((uchar)*p++) || isfloat) {
557 564ca709 2004-04-19 devnull for(;;) {
558 564ca709 2004-04-19 devnull c = lexc();
559 564ca709 2004-04-19 devnull if(c < 0)
560 564ca709 2004-04-19 devnull error("%d: <eof> eating symbols", line);
562 564ca709 2004-04-19 devnull if(c == '\n')
564 564ca709 2004-04-19 devnull sel = "01234567890.xb";
565 564ca709 2004-04-19 devnull if(ishex)
566 564ca709 2004-04-19 devnull sel = "01234567890abcdefABCDEF";
567 564ca709 2004-04-19 devnull else if(isbin)
568 564ca709 2004-04-19 devnull sel = "01";
569 564ca709 2004-04-19 devnull else if(isfloat)
570 564ca709 2004-04-19 devnull sel = "01234567890eE-+";
572 564ca709 2004-04-19 devnull if(strchr(sel, c) == 0) {
573 564ca709 2004-04-19 devnull unlexc(c);
576 564ca709 2004-04-19 devnull if(c == '.')
577 564ca709 2004-04-19 devnull isfloat = 1;
578 564ca709 2004-04-19 devnull if(!isbin && c == 'x')
579 564ca709 2004-04-19 devnull ishex = 1;
580 564ca709 2004-04-19 devnull if(!ishex && c == 'b')
581 564ca709 2004-04-19 devnull isbin = 1;
582 564ca709 2004-04-19 devnull *p++ = c;
584 564ca709 2004-04-19 devnull *p = '\0';
585 564ca709 2004-04-19 devnull if(isfloat) {
586 564ca709 2004-04-19 devnull yylval.fval = atof(symbol);
587 564ca709 2004-04-19 devnull return Tfconst;
590 564ca709 2004-04-19 devnull if(isbin)
591 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol+2, 0, 2);
593 564ca709 2004-04-19 devnull yylval.ival = strtoul(symbol, 0, 0);
594 564ca709 2004-04-19 devnull return Tconst;
597 564ca709 2004-04-19 devnull for(;;) {
598 564ca709 2004-04-19 devnull c = lexc();
599 564ca709 2004-04-19 devnull if(c < 0)
600 564ca709 2004-04-19 devnull error("%d <eof> eating symbols", line);
601 564ca709 2004-04-19 devnull if(c == '\n')
603 62faed57 2005-11-29 devnull /* allow :: in name */
604 62faed57 2005-11-29 devnull if(c == ':'){
605 62faed57 2005-11-29 devnull c = lexc();
606 62faed57 2005-11-29 devnull if(c == ':'){
607 62faed57 2005-11-29 devnull *p++ = ':';
608 62faed57 2005-11-29 devnull *p++ = ':';
609 62faed57 2005-11-29 devnull continue;
611 564ca709 2004-04-19 devnull unlexc(c);
612 62faed57 2005-11-29 devnull unlexc(':');
615 62faed57 2005-11-29 devnull if(c != '_' && c != '$' && c < Runeself && !isalnum(c)) {
616 62faed57 2005-11-29 devnull unlexc(c);
619 564ca709 2004-04-19 devnull *p++ = c;
622 564ca709 2004-04-19 devnull *p = '\0';
624 564ca709 2004-04-19 devnull s = look(symbol);
625 564ca709 2004-04-19 devnull if(s == 0)
626 564ca709 2004-04-19 devnull s = enter(symbol, Tid);
628 564ca709 2004-04-19 devnull yylval.sym = s;
629 564ca709 2004-04-19 devnull return s->lexval;
633 564ca709 2004-04-19 devnull enter(char *name, int t)
635 564ca709 2004-04-19 devnull Lsym *s;
636 564ca709 2004-04-19 devnull ulong h;
637 564ca709 2004-04-19 devnull char *p;
638 564ca709 2004-04-19 devnull Value *v;
641 564ca709 2004-04-19 devnull for(p = name; *p; p++)
642 564ca709 2004-04-19 devnull h = h*3 + *p;
643 564ca709 2004-04-19 devnull h %= Hashsize;
645 564ca709 2004-04-19 devnull s = gmalloc(sizeof(Lsym));
646 564ca709 2004-04-19 devnull memset(s, 0, sizeof(Lsym));
647 564ca709 2004-04-19 devnull s->name = strdup(name);
649 564ca709 2004-04-19 devnull s->hash = hash[h];
650 564ca709 2004-04-19 devnull hash[h] = s;
651 564ca709 2004-04-19 devnull s->lexval = t;
653 564ca709 2004-04-19 devnull v = gmalloc(sizeof(Value));
654 564ca709 2004-04-19 devnull s->v = v;
656 564ca709 2004-04-19 devnull v->store.fmt = 'X';
657 564ca709 2004-04-19 devnull v->type = TINT;
658 564ca709 2004-04-19 devnull memset(v, 0, sizeof(Value));
660 564ca709 2004-04-19 devnull return s;
664 564ca709 2004-04-19 devnull delsym(Lsym *s)
666 564ca709 2004-04-19 devnull char *q;
667 564ca709 2004-04-19 devnull ulong h;
668 564ca709 2004-04-19 devnull Lsym *p;
671 564ca709 2004-04-19 devnull for(q = s->name; *q; q++)
672 564ca709 2004-04-19 devnull h = h*3 + *q;
673 564ca709 2004-04-19 devnull h %= Hashsize;
675 564ca709 2004-04-19 devnull if(hash[h] == s)
676 564ca709 2004-04-19 devnull hash[h] = s->hash;
678 564ca709 2004-04-19 devnull for(p=hash[h]; p && p->hash != s; p=p->hash)
681 564ca709 2004-04-19 devnull p->hash = s->hash;
683 564ca709 2004-04-19 devnull s->hash = nil;
687 564ca709 2004-04-19 devnull look(char *name)
689 564ca709 2004-04-19 devnull Lsym *s;
690 564ca709 2004-04-19 devnull ulong h;
691 564ca709 2004-04-19 devnull char *p;
694 564ca709 2004-04-19 devnull for(p = name; *p; p++)
695 564ca709 2004-04-19 devnull h = h*3 + *p;
696 564ca709 2004-04-19 devnull h %= Hashsize;
698 564ca709 2004-04-19 devnull for(s = hash[h]; s; s = s->hash)
699 564ca709 2004-04-19 devnull if(strcmp(name, s->name) == 0)
700 564ca709 2004-04-19 devnull return s;
701 564ca709 2004-04-19 devnull return 0;
705 564ca709 2004-04-19 devnull mkvar(char *s)
707 564ca709 2004-04-19 devnull Lsym *l;
709 564ca709 2004-04-19 devnull l = look(s);
710 564ca709 2004-04-19 devnull if(l == 0)
711 564ca709 2004-04-19 devnull l = enter(s, Tid);
712 564ca709 2004-04-19 devnull return l;