2 17e5fb89 2004-04-21 devnull #include <u.h>
3 17e5fb89 2004-04-21 devnull #include <libc.h>
4 17e5fb89 2004-04-21 devnull #include <bio.h>
6 17e5fb89 2004-04-21 devnull #define bsp_max 5000
8 17e5fb89 2004-04-21 devnull Biobuf *in;
9 e2713e92 2004-04-24 devnull #define stdin bstdin
10 e2713e92 2004-04-24 devnull #define stdout bstdout
11 17e5fb89 2004-04-21 devnull Biobuf stdin;
12 17e5fb89 2004-04-21 devnull Biobuf stdout;
13 17e5fb89 2004-04-21 devnull char cary[1000];
14 17e5fb89 2004-04-21 devnull char* cp = { cary };
15 17e5fb89 2004-04-21 devnull char string[1000];
16 17e5fb89 2004-04-21 devnull char* str = { string };
17 17e5fb89 2004-04-21 devnull int crs = 128;
18 17e5fb89 2004-04-21 devnull int rcrs = 128; /* reset crs */
19 17e5fb89 2004-04-21 devnull int bindx = 0;
20 17e5fb89 2004-04-21 devnull int lev = 0;
22 17e5fb89 2004-04-21 devnull int* ttp;
23 17e5fb89 2004-04-21 devnull char* ss = "";
24 17e5fb89 2004-04-21 devnull int bstack[10] = { 0 };
25 17e5fb89 2004-04-21 devnull char* numb[15] =
27 17e5fb89 2004-04-21 devnull " 0", " 1", " 2", " 3", " 4", " 5",
28 17e5fb89 2004-04-21 devnull " 6", " 7", " 8", " 9", " 10", " 11",
29 17e5fb89 2004-04-21 devnull " 12", " 13", " 14"
31 17e5fb89 2004-04-21 devnull int* pre;
32 17e5fb89 2004-04-21 devnull int* post;
34 17e5fb89 2004-04-21 devnull long peekc = -1;
35 17e5fb89 2004-04-21 devnull int sargc;
36 17e5fb89 2004-04-21 devnull int ifile;
37 17e5fb89 2004-04-21 devnull char** sargv;
39 17e5fb89 2004-04-21 devnull char *funtab[] =
41 17e5fb89 2004-04-21 devnull "<1>","<2>","<3>","<4>","<5>",
42 17e5fb89 2004-04-21 devnull "<6>","<7>","<8>","<9>","<10>",
43 17e5fb89 2004-04-21 devnull "<11>","<12>","<13>","<14>","<15>",
44 17e5fb89 2004-04-21 devnull "<16>","<17>","<18>","<19>","<20>",
45 17e5fb89 2004-04-21 devnull "<21>","<22>","<23>","<24>","<25>",
48 17e5fb89 2004-04-21 devnull char *atab[] =
50 17e5fb89 2004-04-21 devnull "<221>","<222>","<223>","<224>","<225>",
51 17e5fb89 2004-04-21 devnull "<226>","<227>","<228>","<229>","<230>",
52 17e5fb89 2004-04-21 devnull "<231>","<232>","<233>","<234>","<235>",
53 17e5fb89 2004-04-21 devnull "<236>","<237>","<238>","<239>","<240>",
54 17e5fb89 2004-04-21 devnull "<241>","<242>","<243>","<244>","<245>",
57 17e5fb89 2004-04-21 devnull char* letr[26] =
59 17e5fb89 2004-04-21 devnull "a","b","c","d","e","f","g","h","i","j",
60 17e5fb89 2004-04-21 devnull "k","l","m","n","o","p","q","r","s","t",
61 17e5fb89 2004-04-21 devnull "u","v","w","x","y","z"
63 17e5fb89 2004-04-21 devnull char* dot = { "." };
64 17e5fb89 2004-04-21 devnull int bspace[bsp_max];
65 17e5fb89 2004-04-21 devnull int* bsp_nxt = { bspace };
66 17e5fb89 2004-04-21 devnull int bdebug = 0;
67 17e5fb89 2004-04-21 devnull int lflag;
68 17e5fb89 2004-04-21 devnull int cflag;
69 17e5fb89 2004-04-21 devnull int sflag;
71 17e5fb89 2004-04-21 devnull int* bundle(int, ...);
72 17e5fb89 2004-04-21 devnull void conout(int*, char*);
73 17e5fb89 2004-04-21 devnull int cpeek(int, int, int);
74 17e5fb89 2004-04-21 devnull int getch(void);
75 17e5fb89 2004-04-21 devnull int* geta(char*);
76 17e5fb89 2004-04-21 devnull int* getf(char*);
77 17e5fb89 2004-04-21 devnull void getout(void);
78 17e5fb89 2004-04-21 devnull void output(int*);
79 17e5fb89 2004-04-21 devnull void pp(char*);
80 17e5fb89 2004-04-21 devnull void routput(int*);
81 17e5fb89 2004-04-21 devnull void tp(char*);
82 17e5fb89 2004-04-21 devnull void yyerror(char*, ...);
83 17e5fb89 2004-04-21 devnull int yyparse(void);
85 17e5fb89 2004-04-21 devnull typedef void* pointer;
86 17e5fb89 2004-04-21 devnull /* #pragma varargck type "lx" pointer */
91 17e5fb89 2004-04-21 devnull int* iptr;
92 17e5fb89 2004-04-21 devnull char* cptr;
96 17e5fb89 2004-04-21 devnull %type <iptr> pstat stat stat1 def slist dlets e ase nase
97 17e5fb89 2004-04-21 devnull %type <iptr> slist re fprefix cargs eora cons constant lora
98 17e5fb89 2004-04-21 devnull %type <cptr> crs
100 17e5fb89 2004-04-21 devnull %token <cptr> LETTER EQOP _AUTO DOT
101 17e5fb89 2004-04-21 devnull %token <cc> DIGIT SQRT LENGTH _IF FFF EQ
102 17e5fb89 2004-04-21 devnull %token <cc> _PRINT _WHILE _FOR NE LE GE INCR DECR
103 17e5fb89 2004-04-21 devnull %token <cc> _RETURN _BREAK _DEFINE BASE OBASE SCALE
104 17e5fb89 2004-04-21 devnull %token <cc> QSTR ERROR
106 17e5fb89 2004-04-21 devnull %right '=' EQOP
107 17e5fb89 2004-04-21 devnull %left '+' '-'
108 17e5fb89 2004-04-21 devnull %left '*' '/' '%'
109 17e5fb89 2004-04-21 devnull %right '^'
110 17e5fb89 2004-04-21 devnull %left UMINUS
114 17e5fb89 2004-04-21 devnull start stuff
118 17e5fb89 2004-04-21 devnull pstat tail
120 17e5fb89 2004-04-21 devnull output($1);
122 17e5fb89 2004-04-21 devnull | def dargs ')' '{' dlist slist '}'
124 17e5fb89 2004-04-21 devnull ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q");
125 17e5fb89 2004-04-21 devnull conout(ttp, (char*)$1);
126 17e5fb89 2004-04-21 devnull rcrs = crs;
127 17e5fb89 2004-04-21 devnull output((int*)""); /* this is horse puk!! */
128 17e5fb89 2004-04-21 devnull lev = bindx = 0;
133 17e5fb89 2004-04-21 devnull | dlist _AUTO dlets tail
139 17e5fb89 2004-04-21 devnull if(sflag)
140 17e5fb89 2004-04-21 devnull bundle(2, $1, "s.");
146 17e5fb89 2004-04-21 devnull if(sflag)
147 17e5fb89 2004-04-21 devnull bundle(2, $1, "0");
151 17e5fb89 2004-04-21 devnull if(!sflag)
152 17e5fb89 2004-04-21 devnull bundle(2, $1, "ps.");
157 17e5fb89 2004-04-21 devnull bundle(1, "");
161 17e5fb89 2004-04-21 devnull bundle(2, $1, "s.");
163 17e5fb89 2004-04-21 devnull | SCALE '=' e
165 17e5fb89 2004-04-21 devnull bundle(2, $3, "k");
167 17e5fb89 2004-04-21 devnull | SCALE EQOP e
169 17e5fb89 2004-04-21 devnull bundle(4, "K", $3, $2, "k");
171 17e5fb89 2004-04-21 devnull | BASE '=' e
173 17e5fb89 2004-04-21 devnull bundle(2, $3, "i");
175 17e5fb89 2004-04-21 devnull | BASE EQOP e
177 17e5fb89 2004-04-21 devnull bundle(4, "I", $3, $2, "i");
179 17e5fb89 2004-04-21 devnull | OBASE '=' e
181 17e5fb89 2004-04-21 devnull bundle(2, $3, "o");
183 17e5fb89 2004-04-21 devnull | OBASE EQOP e
185 17e5fb89 2004-04-21 devnull bundle(4, "O", $3, $2, "o");
189 17e5fb89 2004-04-21 devnull bundle(3, "[", $1, "]P");
191 17e5fb89 2004-04-21 devnull | _BREAK
193 17e5fb89 2004-04-21 devnull bundle(2, numb[lev-bstack[bindx-1]], "Q");
195 17e5fb89 2004-04-21 devnull | _PRINT e
197 17e5fb89 2004-04-21 devnull bundle(2, $2, "ps.");
199 17e5fb89 2004-04-21 devnull | _RETURN e
201 17e5fb89 2004-04-21 devnull bundle(4, $2, post, numb[lev], "Q");
203 17e5fb89 2004-04-21 devnull | _RETURN
205 17e5fb89 2004-04-21 devnull bundle(4, "0", post, numb[lev], "Q");
207 17e5fb89 2004-04-21 devnull | '{' slist '}'
209 17e5fb89 2004-04-21 devnull $$ = $2;
213 17e5fb89 2004-04-21 devnull bundle(1, "fY");
215 17e5fb89 2004-04-21 devnull | _IF crs BLEV '(' re ')' stat
217 17e5fb89 2004-04-21 devnull conout($7, $2);
218 17e5fb89 2004-04-21 devnull bundle(3, $5, $2, " ");
220 17e5fb89 2004-04-21 devnull | _WHILE crs '(' re ')' stat BLEV
222 17e5fb89 2004-04-21 devnull bundle(3, $6, $4, $2);
223 17e5fb89 2004-04-21 devnull conout($$, $2);
224 17e5fb89 2004-04-21 devnull bundle(3, $4, $2, " ");
226 17e5fb89 2004-04-21 devnull | fprefix crs re ';' e ')' stat BLEV
228 17e5fb89 2004-04-21 devnull bundle(5, $7, $5, "s.", $3, $2);
229 17e5fb89 2004-04-21 devnull conout($$, $2);
230 17e5fb89 2004-04-21 devnull bundle(5, $1, "s.", $3, $2, " ");
232 17e5fb89 2004-04-21 devnull | '~' LETTER '=' e
234 17e5fb89 2004-04-21 devnull bundle(3, $4, "S", $2);
237 17e5fb89 2004-04-21 devnull fprefix:
238 17e5fb89 2004-04-21 devnull _FOR '(' e ';'
240 17e5fb89 2004-04-21 devnull $$ = $3;
246 17e5fb89 2004-04-21 devnull --bindx;
251 17e5fb89 2004-04-21 devnull | slist tail stat
253 17e5fb89 2004-04-21 devnull bundle(2, $1, $3);
266 17e5fb89 2004-04-21 devnull $$ = bundle(3, $1, $3, "=");
268 17e5fb89 2004-04-21 devnull | e '<' e
270 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, ">");
272 17e5fb89 2004-04-21 devnull | e '>' e
274 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "<");
276 17e5fb89 2004-04-21 devnull | e NE e
278 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!=");
280 17e5fb89 2004-04-21 devnull | e GE e
282 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!>");
284 17e5fb89 2004-04-21 devnull | e LE e
286 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!<");
290 17e5fb89 2004-04-21 devnull bundle(2, $1, " 0!=");
294 17e5fb89 2004-04-21 devnull '(' e ')'
296 17e5fb89 2004-04-21 devnull $$ = $2;
300 17e5fb89 2004-04-21 devnull bundle(3, " ", $1, " ");
302 17e5fb89 2004-04-21 devnull | DOT cons
304 17e5fb89 2004-04-21 devnull bundle(3, " .", $2, " ");
306 17e5fb89 2004-04-21 devnull | cons DOT cons
308 17e5fb89 2004-04-21 devnull bundle(5, " ", $1, ".", $3, " ");
310 17e5fb89 2004-04-21 devnull | cons DOT
312 17e5fb89 2004-04-21 devnull bundle(4, " ", $1, ".", " ");
316 17e5fb89 2004-04-21 devnull $<cptr>$ = "l.";
318 17e5fb89 2004-04-21 devnull | LETTER '[' e ']'
320 17e5fb89 2004-04-21 devnull bundle(3, $3, ";", geta($1));
322 17e5fb89 2004-04-21 devnull | LETTER INCR
324 17e5fb89 2004-04-21 devnull bundle(4, "l", $1, "d1+s", $1);
326 17e5fb89 2004-04-21 devnull | INCR LETTER
328 17e5fb89 2004-04-21 devnull bundle(4, "l", $2, "1+ds", $2);
330 17e5fb89 2004-04-21 devnull | DECR LETTER
332 17e5fb89 2004-04-21 devnull bundle(4, "l", $2, "1-ds", $2);
334 17e5fb89 2004-04-21 devnull | LETTER DECR
336 17e5fb89 2004-04-21 devnull bundle(4, "l", $1, "d1-s", $1);
338 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' INCR
340 17e5fb89 2004-04-21 devnull bundle(7, $3, ";", geta($1), "d1+" ,$3, ":" ,geta($1));
342 17e5fb89 2004-04-21 devnull | INCR LETTER '[' e ']'
344 17e5fb89 2004-04-21 devnull bundle(7, $4, ";", geta($2), "1+d", $4, ":", geta($2));
346 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' DECR
348 17e5fb89 2004-04-21 devnull bundle(7, $3, ";", geta($1), "d1-", $3, ":", geta($1));
350 17e5fb89 2004-04-21 devnull | DECR LETTER '[' e ']'
352 17e5fb89 2004-04-21 devnull bundle(7, $4, ";", geta($2), "1-d", $4, ":" ,geta($2));
354 17e5fb89 2004-04-21 devnull | SCALE INCR
356 17e5fb89 2004-04-21 devnull bundle(1, "Kd1+k");
358 17e5fb89 2004-04-21 devnull | INCR SCALE
360 17e5fb89 2004-04-21 devnull bundle(1, "K1+dk");
362 17e5fb89 2004-04-21 devnull | SCALE DECR
364 17e5fb89 2004-04-21 devnull bundle(1, "Kd1-k");
366 17e5fb89 2004-04-21 devnull | DECR SCALE
368 17e5fb89 2004-04-21 devnull bundle(1, "K1-dk");
370 17e5fb89 2004-04-21 devnull | BASE INCR
372 17e5fb89 2004-04-21 devnull bundle(1, "Id1+i");
374 17e5fb89 2004-04-21 devnull | INCR BASE
376 17e5fb89 2004-04-21 devnull bundle(1, "I1+di");
378 17e5fb89 2004-04-21 devnull | BASE DECR
380 17e5fb89 2004-04-21 devnull bundle(1, "Id1-i");
382 17e5fb89 2004-04-21 devnull | DECR BASE
384 17e5fb89 2004-04-21 devnull bundle(1, "I1-di");
386 17e5fb89 2004-04-21 devnull | OBASE INCR
388 17e5fb89 2004-04-21 devnull bundle(1, "Od1+o");
390 17e5fb89 2004-04-21 devnull | INCR OBASE
392 17e5fb89 2004-04-21 devnull bundle(1, "O1+do");
394 17e5fb89 2004-04-21 devnull | OBASE DECR
396 17e5fb89 2004-04-21 devnull bundle(1, "Od1-o");
398 17e5fb89 2004-04-21 devnull | DECR OBASE
400 17e5fb89 2004-04-21 devnull bundle(1, "O1-do");
402 17e5fb89 2004-04-21 devnull | LETTER '(' cargs ')'
404 17e5fb89 2004-04-21 devnull bundle(4, $3, "l", getf($1), "x");
406 17e5fb89 2004-04-21 devnull | LETTER '(' ')'
408 17e5fb89 2004-04-21 devnull bundle(3, "l", getf($1), "x");
410 17e5fb89 2004-04-21 devnull | LETTER = {
411 17e5fb89 2004-04-21 devnull bundle(2, "l", $1);
413 17e5fb89 2004-04-21 devnull | LENGTH '(' e ')'
415 17e5fb89 2004-04-21 devnull bundle(2, $3, "Z");
417 17e5fb89 2004-04-21 devnull | SCALE '(' e ')'
419 17e5fb89 2004-04-21 devnull bundle(2, $3, "X");
423 17e5fb89 2004-04-21 devnull bundle(1, "?");
425 17e5fb89 2004-04-21 devnull | SQRT '(' e ')'
427 17e5fb89 2004-04-21 devnull bundle(2, $3, "v");
429 17e5fb89 2004-04-21 devnull | '~' LETTER
431 17e5fb89 2004-04-21 devnull bundle(2, "L", $2);
435 17e5fb89 2004-04-21 devnull bundle(1, "K");
439 17e5fb89 2004-04-21 devnull bundle(1, "I");
443 17e5fb89 2004-04-21 devnull bundle(1, "O");
447 17e5fb89 2004-04-21 devnull bundle(3, " 0", $2, "-");
449 17e5fb89 2004-04-21 devnull | e '+' e
451 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "+");
453 17e5fb89 2004-04-21 devnull | e '-' e
455 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "-");
457 17e5fb89 2004-04-21 devnull | e '*' e
459 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "*");
461 17e5fb89 2004-04-21 devnull | e '/' e
463 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "/");
465 17e5fb89 2004-04-21 devnull | e '%' e
467 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "%%");
469 17e5fb89 2004-04-21 devnull | e '^' e
471 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "^");
475 17e5fb89 2004-04-21 devnull LETTER '=' e
477 17e5fb89 2004-04-21 devnull bundle(3, $3, "ds", $1);
479 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' '=' e
481 17e5fb89 2004-04-21 devnull bundle(5, $6, "d", $3, ":", geta($1));
483 17e5fb89 2004-04-21 devnull | LETTER EQOP e
485 17e5fb89 2004-04-21 devnull bundle(6, "l", $1, $3, $2, "ds", $1);
487 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' EQOP e
489 17e5fb89 2004-04-21 devnull bundle(9, $3, ";", geta($1), $6, $5, "d", $3, ":", geta($1));
498 17e5fb89 2004-04-21 devnull | cargs ',' eora
500 17e5fb89 2004-04-21 devnull bundle(2, $1, $3);
505 17e5fb89 2004-04-21 devnull | LETTER '[' ']'
507 17e5fb89 2004-04-21 devnull bundle(2, "l", geta($1));
511 17e5fb89 2004-04-21 devnull constant
513 17e5fb89 2004-04-21 devnull *cp++ = 0;
516 17e5fb89 2004-04-21 devnull constant:
519 17e5fb89 2004-04-21 devnull $<cptr>$ = cp;
520 17e5fb89 2004-04-21 devnull *cp++ = '_';
524 17e5fb89 2004-04-21 devnull $<cptr>$ = cp;
525 17e5fb89 2004-04-21 devnull *cp++ = $1;
527 17e5fb89 2004-04-21 devnull | constant DIGIT
529 17e5fb89 2004-04-21 devnull *cp++ = $2;
535 17e5fb89 2004-04-21 devnull $$ = cp;
536 17e5fb89 2004-04-21 devnull *cp++ = '<';
537 17e5fb89 2004-04-21 devnull *cp++ = crs/100+'0';
538 17e5fb89 2004-04-21 devnull *cp++ = (crs%100)/10+'0';
539 17e5fb89 2004-04-21 devnull *cp++ = crs%10+'0';
540 17e5fb89 2004-04-21 devnull *cp++ = '>';
541 17e5fb89 2004-04-21 devnull *cp++ = '\0';
542 17e5fb89 2004-04-21 devnull if(crs++ >= 220) {
543 17e5fb89 2004-04-21 devnull yyerror("program too big");
544 17e5fb89 2004-04-21 devnull getout();
546 17e5fb89 2004-04-21 devnull bstack[bindx++] = lev++;
550 17e5fb89 2004-04-21 devnull _DEFINE LETTER '('
552 17e5fb89 2004-04-21 devnull $$ = getf($2);
553 17e5fb89 2004-04-21 devnull pre = (int*)"";
554 17e5fb89 2004-04-21 devnull post = (int*)"";
555 17e5fb89 2004-04-21 devnull lev = 1;
556 17e5fb89 2004-04-21 devnull bindx = 0;
557 17e5fb89 2004-04-21 devnull bstack[bindx] = 0;
563 17e5fb89 2004-04-21 devnull pp((char*)$1);
565 17e5fb89 2004-04-21 devnull | dargs ',' lora
567 17e5fb89 2004-04-21 devnull pp((char*)$3);
573 17e5fb89 2004-04-21 devnull tp((char*)$1);
575 17e5fb89 2004-04-21 devnull | dlets ',' lora
577 17e5fb89 2004-04-21 devnull tp((char*)$3);
583 17e5fb89 2004-04-21 devnull $<cptr>$=$1;
585 17e5fb89 2004-04-21 devnull | LETTER '[' ']'
587 17e5fb89 2004-04-21 devnull $$ = geta($1);
593 17e5fb89 2004-04-21 devnull yylex(void)
595 17e5fb89 2004-04-21 devnull int c, ch;
597 17e5fb89 2004-04-21 devnull restart:
598 17e5fb89 2004-04-21 devnull c = getch();
599 17e5fb89 2004-04-21 devnull peekc = -1;
600 17e5fb89 2004-04-21 devnull while(c == ' ' || c == '\t')
601 17e5fb89 2004-04-21 devnull c = getch();
602 17e5fb89 2004-04-21 devnull if(c == '\\') {
603 17e5fb89 2004-04-21 devnull getch();
604 17e5fb89 2004-04-21 devnull goto restart;
606 17e5fb89 2004-04-21 devnull if(c >= 'a' && c <= 'z') {
607 17e5fb89 2004-04-21 devnull /* look ahead to look for reserved words */
608 17e5fb89 2004-04-21 devnull peekc = getch();
609 17e5fb89 2004-04-21 devnull if(peekc >= 'a' && peekc <= 'z') { /* must be reserved word */
610 17e5fb89 2004-04-21 devnull if(c=='p' && peekc=='r') {
611 17e5fb89 2004-04-21 devnull c = _PRINT;
612 17e5fb89 2004-04-21 devnull goto skip;
614 17e5fb89 2004-04-21 devnull if(c=='i' && peekc=='f') {
615 17e5fb89 2004-04-21 devnull c = _IF;
616 17e5fb89 2004-04-21 devnull goto skip;
618 17e5fb89 2004-04-21 devnull if(c=='w' && peekc=='h') {
619 17e5fb89 2004-04-21 devnull c = _WHILE;
620 17e5fb89 2004-04-21 devnull goto skip;
622 17e5fb89 2004-04-21 devnull if(c=='f' && peekc=='o') {
623 17e5fb89 2004-04-21 devnull c = _FOR;
624 17e5fb89 2004-04-21 devnull goto skip;
626 17e5fb89 2004-04-21 devnull if(c=='s' && peekc=='q') {
627 17e5fb89 2004-04-21 devnull c = SQRT;
628 17e5fb89 2004-04-21 devnull goto skip;
630 17e5fb89 2004-04-21 devnull if(c=='r' && peekc=='e') {
631 17e5fb89 2004-04-21 devnull c = _RETURN;
632 17e5fb89 2004-04-21 devnull goto skip;
634 17e5fb89 2004-04-21 devnull if(c=='b' && peekc=='r') {
635 17e5fb89 2004-04-21 devnull c = _BREAK;
636 17e5fb89 2004-04-21 devnull goto skip;
638 17e5fb89 2004-04-21 devnull if(c=='d' && peekc=='e') {
639 17e5fb89 2004-04-21 devnull c = _DEFINE;
640 17e5fb89 2004-04-21 devnull goto skip;
642 17e5fb89 2004-04-21 devnull if(c=='s' && peekc=='c') {
643 17e5fb89 2004-04-21 devnull c = SCALE;
644 17e5fb89 2004-04-21 devnull goto skip;
646 17e5fb89 2004-04-21 devnull if(c=='b' && peekc=='a') {
647 17e5fb89 2004-04-21 devnull c = BASE;
648 17e5fb89 2004-04-21 devnull goto skip;
650 17e5fb89 2004-04-21 devnull if(c=='i' && peekc=='b') {
651 17e5fb89 2004-04-21 devnull c = BASE;
652 17e5fb89 2004-04-21 devnull goto skip;
654 17e5fb89 2004-04-21 devnull if(c=='o' && peekc=='b') {
655 17e5fb89 2004-04-21 devnull c = OBASE;
656 17e5fb89 2004-04-21 devnull goto skip;
658 17e5fb89 2004-04-21 devnull if(c=='d' && peekc=='i') {
659 17e5fb89 2004-04-21 devnull c = FFF;
660 17e5fb89 2004-04-21 devnull goto skip;
662 17e5fb89 2004-04-21 devnull if(c=='a' && peekc=='u') {
663 17e5fb89 2004-04-21 devnull c = _AUTO;
664 17e5fb89 2004-04-21 devnull goto skip;
666 17e5fb89 2004-04-21 devnull if(c=='l' && peekc=='e') {
667 17e5fb89 2004-04-21 devnull c = LENGTH;
668 17e5fb89 2004-04-21 devnull goto skip;
670 17e5fb89 2004-04-21 devnull if(c=='q' && peekc=='u')
671 17e5fb89 2004-04-21 devnull getout();
672 17e5fb89 2004-04-21 devnull /* could not be found */
673 17e5fb89 2004-04-21 devnull return ERROR;
675 17e5fb89 2004-04-21 devnull skip: /* skip over rest of word */
676 17e5fb89 2004-04-21 devnull peekc = -1;
677 17e5fb89 2004-04-21 devnull for(;;) {
678 17e5fb89 2004-04-21 devnull ch = getch();
679 17e5fb89 2004-04-21 devnull if(ch < 'a' || ch > 'z')
682 17e5fb89 2004-04-21 devnull peekc = ch;
683 17e5fb89 2004-04-21 devnull return c;
686 17e5fb89 2004-04-21 devnull /* usual case; just one single letter */
687 17e5fb89 2004-04-21 devnull yylval.cptr = letr[c-'a'];
688 17e5fb89 2004-04-21 devnull return LETTER;
690 17e5fb89 2004-04-21 devnull if((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
691 17e5fb89 2004-04-21 devnull yylval.cc = c;
692 17e5fb89 2004-04-21 devnull return DIGIT;
694 17e5fb89 2004-04-21 devnull switch(c) {
695 17e5fb89 2004-04-21 devnull case '.':
696 17e5fb89 2004-04-21 devnull return DOT;
697 17e5fb89 2004-04-21 devnull case '*':
698 17e5fb89 2004-04-21 devnull yylval.cptr = "*";
699 17e5fb89 2004-04-21 devnull return cpeek('=', EQOP, c);
700 17e5fb89 2004-04-21 devnull case '%':
701 17e5fb89 2004-04-21 devnull yylval.cptr = "%%";
702 17e5fb89 2004-04-21 devnull return cpeek('=', EQOP, c);
703 17e5fb89 2004-04-21 devnull case '^':
704 17e5fb89 2004-04-21 devnull yylval.cptr = "^";
705 17e5fb89 2004-04-21 devnull return cpeek('=', EQOP, c);
706 17e5fb89 2004-04-21 devnull case '+':
707 17e5fb89 2004-04-21 devnull ch = cpeek('=', EQOP, c);
708 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
709 17e5fb89 2004-04-21 devnull yylval.cptr = "+";
710 17e5fb89 2004-04-21 devnull return ch;
712 17e5fb89 2004-04-21 devnull return cpeek('+', INCR, c);
713 17e5fb89 2004-04-21 devnull case '-':
714 17e5fb89 2004-04-21 devnull ch = cpeek('=', EQOP, c);
715 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
716 17e5fb89 2004-04-21 devnull yylval.cptr = "-";
717 17e5fb89 2004-04-21 devnull return ch;
719 17e5fb89 2004-04-21 devnull return cpeek('-', DECR, c);
720 17e5fb89 2004-04-21 devnull case '=':
721 17e5fb89 2004-04-21 devnull return cpeek('=', EQ, '=');
722 17e5fb89 2004-04-21 devnull case '<':
723 17e5fb89 2004-04-21 devnull return cpeek('=', LE, '<');
724 17e5fb89 2004-04-21 devnull case '>':
725 17e5fb89 2004-04-21 devnull return cpeek('=', GE, '>');
726 17e5fb89 2004-04-21 devnull case '!':
727 17e5fb89 2004-04-21 devnull return cpeek('=', NE, '!');
728 17e5fb89 2004-04-21 devnull case '/':
729 17e5fb89 2004-04-21 devnull ch = cpeek('=', EQOP, c);
730 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
731 17e5fb89 2004-04-21 devnull yylval.cptr = "/";
732 17e5fb89 2004-04-21 devnull return ch;
734 17e5fb89 2004-04-21 devnull if(peekc == '*') {
735 17e5fb89 2004-04-21 devnull peekc = -1;
736 17e5fb89 2004-04-21 devnull for(;;) {
737 17e5fb89 2004-04-21 devnull ch = getch();
738 17e5fb89 2004-04-21 devnull if(ch == '*') {
739 17e5fb89 2004-04-21 devnull peekc = getch();
740 17e5fb89 2004-04-21 devnull if(peekc == '/') {
741 17e5fb89 2004-04-21 devnull peekc = -1;
742 17e5fb89 2004-04-21 devnull goto restart;
747 17e5fb89 2004-04-21 devnull return c;
748 17e5fb89 2004-04-21 devnull case '"':
749 17e5fb89 2004-04-21 devnull yylval.cptr = str;
750 17e5fb89 2004-04-21 devnull while((c=getch()) != '"'){
751 17e5fb89 2004-04-21 devnull *str++ = c;
752 17e5fb89 2004-04-21 devnull if(str >= &string[999]){
753 17e5fb89 2004-04-21 devnull yyerror("string space exceeded");
754 17e5fb89 2004-04-21 devnull getout();
757 17e5fb89 2004-04-21 devnull *str++ = 0;
758 17e5fb89 2004-04-21 devnull return QSTR;
759 17e5fb89 2004-04-21 devnull default:
760 17e5fb89 2004-04-21 devnull return c;
765 17e5fb89 2004-04-21 devnull cpeek(int c, int yes, int no)
768 17e5fb89 2004-04-21 devnull peekc = getch();
769 17e5fb89 2004-04-21 devnull if(peekc == c) {
770 17e5fb89 2004-04-21 devnull peekc = -1;
771 17e5fb89 2004-04-21 devnull return yes;
773 17e5fb89 2004-04-21 devnull return no;
777 17e5fb89 2004-04-21 devnull getch(void)
779 17e5fb89 2004-04-21 devnull long ch;
782 17e5fb89 2004-04-21 devnull ch = peekc;
783 17e5fb89 2004-04-21 devnull if(ch < 0){
784 17e5fb89 2004-04-21 devnull if(in == 0)
785 17e5fb89 2004-04-21 devnull ch = -1;
787 17e5fb89 2004-04-21 devnull ch = Bgetc(in);
789 17e5fb89 2004-04-21 devnull peekc = -1;
790 17e5fb89 2004-04-21 devnull if(ch >= 0)
791 17e5fb89 2004-04-21 devnull return ch;
792 17e5fb89 2004-04-21 devnull ifile++;
793 17e5fb89 2004-04-21 devnull if(ifile > sargc) {
794 17e5fb89 2004-04-21 devnull if(ifile >= sargc+2)
795 17e5fb89 2004-04-21 devnull getout();
796 17e5fb89 2004-04-21 devnull in = &stdin;
797 17e5fb89 2004-04-21 devnull Binit(in, 0, OREAD);
799 17e5fb89 2004-04-21 devnull goto loop;
801 17e5fb89 2004-04-21 devnull Bterm(in);
802 17e5fb89 2004-04-21 devnull if((in = Bopen(sargv[ifile], OREAD)) != 0){
804 17e5fb89 2004-04-21 devnull ss = sargv[ifile];
805 17e5fb89 2004-04-21 devnull goto loop;
807 17e5fb89 2004-04-21 devnull yyerror("cannot open input file");
808 17e5fb89 2004-04-21 devnull return 0; /* shut up ken */
812 17e5fb89 2004-04-21 devnull bundle(int a, ...)
814 17e5fb89 2004-04-21 devnull int i, *p, *q;
817 17e5fb89 2004-04-21 devnull i = *p++;
818 17e5fb89 2004-04-21 devnull q = bsp_nxt;
819 17e5fb89 2004-04-21 devnull if(bdebug)
820 17e5fb89 2004-04-21 devnull fprint(2, "bundle %d elements at %lx\n", i, q);
821 17e5fb89 2004-04-21 devnull while(i-- > 0) {
822 17e5fb89 2004-04-21 devnull if(bsp_nxt >= &bspace[bsp_max])
823 17e5fb89 2004-04-21 devnull yyerror("bundling space exceeded");
824 17e5fb89 2004-04-21 devnull *bsp_nxt++ = *p++;
826 17e5fb89 2004-04-21 devnull *bsp_nxt++ = 0;
827 17e5fb89 2004-04-21 devnull yyval.iptr = q;
828 17e5fb89 2004-04-21 devnull return q;
832 17e5fb89 2004-04-21 devnull routput(int *p)
834 17e5fb89 2004-04-21 devnull if(bdebug)
835 17e5fb89 2004-04-21 devnull fprint(2, "routput(%lx)\n", p);
836 17e5fb89 2004-04-21 devnull if(p >= &bspace[0] && p < &bspace[bsp_max]) {
837 17e5fb89 2004-04-21 devnull /* part of a bundle */
838 17e5fb89 2004-04-21 devnull while(*p != 0)
839 17e5fb89 2004-04-21 devnull routput((int*)(*p++));
841 17e5fb89 2004-04-21 devnull Bprint(&stdout, (char*)p); /* character string */
845 17e5fb89 2004-04-21 devnull output(int *p)
847 17e5fb89 2004-04-21 devnull routput(p);
848 17e5fb89 2004-04-21 devnull bsp_nxt = &bspace[0];
849 17e5fb89 2004-04-21 devnull Bprint(&stdout, "\n");
850 17e5fb89 2004-04-21 devnull Bflush(&stdout);
851 17e5fb89 2004-04-21 devnull cp = cary;
852 17e5fb89 2004-04-21 devnull crs = rcrs;
856 17e5fb89 2004-04-21 devnull conout(int *p, char *s)
858 17e5fb89 2004-04-21 devnull Bprint(&stdout, "[");
859 17e5fb89 2004-04-21 devnull routput(p);
860 17e5fb89 2004-04-21 devnull Bprint(&stdout, "]s%s\n", s);
861 17e5fb89 2004-04-21 devnull Bflush(&stdout);
866 17e5fb89 2004-04-21 devnull yyerror(char *s, ...)
868 17e5fb89 2004-04-21 devnull if(ifile > sargc)
869 17e5fb89 2004-04-21 devnull ss = "teletype";
870 17e5fb89 2004-04-21 devnull Bprint(&stdout, "c[%s on line %d, %s]pc\n", s, ln+1, ss);
871 17e5fb89 2004-04-21 devnull Bflush(&stdout);
872 17e5fb89 2004-04-21 devnull cp = cary;
873 17e5fb89 2004-04-21 devnull crs = rcrs;
874 17e5fb89 2004-04-21 devnull bindx = 0;
875 17e5fb89 2004-04-21 devnull lev = 0;
876 17e5fb89 2004-04-21 devnull bsp_nxt = &bspace[0];
880 17e5fb89 2004-04-21 devnull pp(char *s)
882 17e5fb89 2004-04-21 devnull /* puts the relevant stuff on pre and post for the letter s */
883 17e5fb89 2004-04-21 devnull bundle(3, "S", s, pre);
884 17e5fb89 2004-04-21 devnull pre = yyval.iptr;
885 17e5fb89 2004-04-21 devnull bundle(4, post, "L", s, "s.");
886 17e5fb89 2004-04-21 devnull post = yyval.iptr;
890 17e5fb89 2004-04-21 devnull tp(char *s)
892 17e5fb89 2004-04-21 devnull /* same as pp, but for temps */
893 17e5fb89 2004-04-21 devnull bundle(3, "0S", s, pre);
894 17e5fb89 2004-04-21 devnull pre = yyval.iptr;
895 17e5fb89 2004-04-21 devnull bundle(4, post, "L", s, "s.");
896 17e5fb89 2004-04-21 devnull post = yyval.iptr;
900 17e5fb89 2004-04-21 devnull yyinit(int argc, char **argv)
902 17e5fb89 2004-04-21 devnull Binit(&stdout, 1, OWRITE);
903 17e5fb89 2004-04-21 devnull sargv = argv;
904 17e5fb89 2004-04-21 devnull sargc = argc - 1;
905 17e5fb89 2004-04-21 devnull if(sargc == 0) {
906 17e5fb89 2004-04-21 devnull in = &stdin;
907 17e5fb89 2004-04-21 devnull Binit(in, 0, OREAD);
908 17e5fb89 2004-04-21 devnull } else if((in = Bopen(sargv[1], OREAD)) == 0)
909 17e5fb89 2004-04-21 devnull yyerror("cannot open input file");
910 17e5fb89 2004-04-21 devnull ifile = 1;
912 17e5fb89 2004-04-21 devnull ss = sargv[1];
916 17e5fb89 2004-04-21 devnull getout(void)
918 17e5fb89 2004-04-21 devnull Bprint(&stdout, "q");
919 17e5fb89 2004-04-21 devnull Bflush(&stdout);
920 17e5fb89 2004-04-21 devnull exits(0);
924 17e5fb89 2004-04-21 devnull getf(char *p)
926 17e5fb89 2004-04-21 devnull return (int*)funtab[*p - 'a'];
930 17e5fb89 2004-04-21 devnull geta(char *p)
932 17e5fb89 2004-04-21 devnull return (int*)atab[*p - 'a'];
936 17e5fb89 2004-04-21 devnull main(int argc, char **argv)
938 17e5fb89 2004-04-21 devnull int p[2];
940 17e5fb89 2004-04-21 devnull while(argc > 1 && *argv[1] == '-') {
941 17e5fb89 2004-04-21 devnull switch(argv[1][1]) {
942 17e5fb89 2004-04-21 devnull case 'd':
943 17e5fb89 2004-04-21 devnull bdebug++;
945 17e5fb89 2004-04-21 devnull case 'c':
946 17e5fb89 2004-04-21 devnull cflag++;
948 17e5fb89 2004-04-21 devnull case 'l':
949 17e5fb89 2004-04-21 devnull lflag++;
951 17e5fb89 2004-04-21 devnull case 's':
952 17e5fb89 2004-04-21 devnull sflag++;
954 17e5fb89 2004-04-21 devnull default:
955 17e5fb89 2004-04-21 devnull fprint(2, "Usage: bc [-l] [-c] [file ...]\n");
956 17e5fb89 2004-04-21 devnull exits("usage");
961 17e5fb89 2004-04-21 devnull if(lflag) {
964 c8b6342d 2005-01-13 devnull argv[1] = unsharp("#9/lib/bclib");
966 17e5fb89 2004-04-21 devnull if(cflag) {
967 17e5fb89 2004-04-21 devnull yyinit(argc, argv);
969 17e5fb89 2004-04-21 devnull yyparse();
970 9268e33d 2005-01-14 devnull /* exits(0); */
972 17e5fb89 2004-04-21 devnull pipe(p);
973 17e5fb89 2004-04-21 devnull if(fork() == 0) {
974 17e5fb89 2004-04-21 devnull dup(p[1], 1);
975 17e5fb89 2004-04-21 devnull close(p[0]);
976 17e5fb89 2004-04-21 devnull close(p[1]);
977 17e5fb89 2004-04-21 devnull yyinit(argc, argv);
979 17e5fb89 2004-04-21 devnull yyparse();
981 17e5fb89 2004-04-21 devnull dup(p[0], 0);
982 17e5fb89 2004-04-21 devnull close(p[0]);
983 17e5fb89 2004-04-21 devnull close(p[1]);
984 e2713e92 2004-04-24 devnull execlp("dc", "dc", 0);