Blame


1 17e5fb89 2004-04-21 devnull %{
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>
5 17e5fb89 2004-04-21 devnull
6 17e5fb89 2004-04-21 devnull #define bsp_max 5000
7 17e5fb89 2004-04-21 devnull
8 17e5fb89 2004-04-21 devnull Biobuf *in;
9 0aae8d3d 2005-10-31 devnull Biobuf bstdin;
10 0aae8d3d 2005-10-31 devnull Biobuf bstdout;
11 17e5fb89 2004-04-21 devnull char cary[1000];
12 17e5fb89 2004-04-21 devnull char* cp = { cary };
13 17e5fb89 2004-04-21 devnull char string[1000];
14 17e5fb89 2004-04-21 devnull char* str = { string };
15 17e5fb89 2004-04-21 devnull int crs = 128;
16 17e5fb89 2004-04-21 devnull int rcrs = 128; /* reset crs */
17 17e5fb89 2004-04-21 devnull int bindx = 0;
18 17e5fb89 2004-04-21 devnull int lev = 0;
19 17e5fb89 2004-04-21 devnull int ln;
20 0aae8d3d 2005-10-31 devnull char* ttp;
21 17e5fb89 2004-04-21 devnull char* ss = "";
22 17e5fb89 2004-04-21 devnull int bstack[10] = { 0 };
23 17e5fb89 2004-04-21 devnull char* numb[15] =
24 17e5fb89 2004-04-21 devnull {
25 17e5fb89 2004-04-21 devnull " 0", " 1", " 2", " 3", " 4", " 5",
26 17e5fb89 2004-04-21 devnull " 6", " 7", " 8", " 9", " 10", " 11",
27 17e5fb89 2004-04-21 devnull " 12", " 13", " 14"
28 17e5fb89 2004-04-21 devnull };
29 0aae8d3d 2005-10-31 devnull char* pre;
30 0aae8d3d 2005-10-31 devnull char* post;
31 17e5fb89 2004-04-21 devnull
32 17e5fb89 2004-04-21 devnull long peekc = -1;
33 17e5fb89 2004-04-21 devnull int sargc;
34 17e5fb89 2004-04-21 devnull int ifile;
35 17e5fb89 2004-04-21 devnull char** sargv;
36 17e5fb89 2004-04-21 devnull
37 17e5fb89 2004-04-21 devnull char *funtab[] =
38 17e5fb89 2004-04-21 devnull {
39 17e5fb89 2004-04-21 devnull "<1>","<2>","<3>","<4>","<5>",
40 17e5fb89 2004-04-21 devnull "<6>","<7>","<8>","<9>","<10>",
41 17e5fb89 2004-04-21 devnull "<11>","<12>","<13>","<14>","<15>",
42 17e5fb89 2004-04-21 devnull "<16>","<17>","<18>","<19>","<20>",
43 17e5fb89 2004-04-21 devnull "<21>","<22>","<23>","<24>","<25>",
44 17e5fb89 2004-04-21 devnull "<26>"
45 17e5fb89 2004-04-21 devnull };
46 17e5fb89 2004-04-21 devnull char *atab[] =
47 17e5fb89 2004-04-21 devnull {
48 17e5fb89 2004-04-21 devnull "<221>","<222>","<223>","<224>","<225>",
49 17e5fb89 2004-04-21 devnull "<226>","<227>","<228>","<229>","<230>",
50 17e5fb89 2004-04-21 devnull "<231>","<232>","<233>","<234>","<235>",
51 17e5fb89 2004-04-21 devnull "<236>","<237>","<238>","<239>","<240>",
52 17e5fb89 2004-04-21 devnull "<241>","<242>","<243>","<244>","<245>",
53 17e5fb89 2004-04-21 devnull "<246>"
54 17e5fb89 2004-04-21 devnull };
55 17e5fb89 2004-04-21 devnull char* letr[26] =
56 17e5fb89 2004-04-21 devnull {
57 17e5fb89 2004-04-21 devnull "a","b","c","d","e","f","g","h","i","j",
58 17e5fb89 2004-04-21 devnull "k","l","m","n","o","p","q","r","s","t",
59 17e5fb89 2004-04-21 devnull "u","v","w","x","y","z"
60 17e5fb89 2004-04-21 devnull };
61 17e5fb89 2004-04-21 devnull char* dot = { "." };
62 0aae8d3d 2005-10-31 devnull char* bspace[bsp_max];
63 0aae8d3d 2005-10-31 devnull char** bsp_nxt = bspace;
64 17e5fb89 2004-04-21 devnull int bdebug = 0;
65 17e5fb89 2004-04-21 devnull int lflag;
66 17e5fb89 2004-04-21 devnull int cflag;
67 17e5fb89 2004-04-21 devnull int sflag;
68 17e5fb89 2004-04-21 devnull
69 0aae8d3d 2005-10-31 devnull char* bundle(int, ...);
70 0aae8d3d 2005-10-31 devnull void conout(char*, char*);
71 17e5fb89 2004-04-21 devnull int cpeek(int, int, int);
72 17e5fb89 2004-04-21 devnull int getch(void);
73 0aae8d3d 2005-10-31 devnull char* geta(char*);
74 0aae8d3d 2005-10-31 devnull char* getf(char*);
75 17e5fb89 2004-04-21 devnull void getout(void);
76 0aae8d3d 2005-10-31 devnull void output(char*);
77 17e5fb89 2004-04-21 devnull void pp(char*);
78 0aae8d3d 2005-10-31 devnull void routput(char*);
79 17e5fb89 2004-04-21 devnull void tp(char*);
80 17e5fb89 2004-04-21 devnull void yyerror(char*, ...);
81 17e5fb89 2004-04-21 devnull int yyparse(void);
82 17e5fb89 2004-04-21 devnull
83 17e5fb89 2004-04-21 devnull typedef void* pointer;
84 0aae8d3d 2005-10-31 devnull #pragma varargck type "lx" pointer
85 17e5fb89 2004-04-21 devnull
86 17e5fb89 2004-04-21 devnull %}
87 17e5fb89 2004-04-21 devnull %union
88 17e5fb89 2004-04-21 devnull {
89 17e5fb89 2004-04-21 devnull char* cptr;
90 17e5fb89 2004-04-21 devnull int cc;
91 17e5fb89 2004-04-21 devnull }
92 17e5fb89 2004-04-21 devnull
93 0aae8d3d 2005-10-31 devnull %type <cptr> pstat stat stat1 def slist dlets e ase nase
94 0aae8d3d 2005-10-31 devnull %type <cptr> slist re fprefix cargs eora cons constant lora
95 17e5fb89 2004-04-21 devnull %type <cptr> crs
96 17e5fb89 2004-04-21 devnull
97 17e5fb89 2004-04-21 devnull %token <cptr> LETTER EQOP _AUTO DOT
98 17e5fb89 2004-04-21 devnull %token <cc> DIGIT SQRT LENGTH _IF FFF EQ
99 17e5fb89 2004-04-21 devnull %token <cc> _PRINT _WHILE _FOR NE LE GE INCR DECR
100 17e5fb89 2004-04-21 devnull %token <cc> _RETURN _BREAK _DEFINE BASE OBASE SCALE
101 17e5fb89 2004-04-21 devnull %token <cc> QSTR ERROR
102 17e5fb89 2004-04-21 devnull
103 17e5fb89 2004-04-21 devnull %right '=' EQOP
104 17e5fb89 2004-04-21 devnull %left '+' '-'
105 17e5fb89 2004-04-21 devnull %left '*' '/' '%'
106 17e5fb89 2004-04-21 devnull %right '^'
107 17e5fb89 2004-04-21 devnull %left UMINUS
108 17e5fb89 2004-04-21 devnull
109 17e5fb89 2004-04-21 devnull %%
110 17e5fb89 2004-04-21 devnull start:
111 17e5fb89 2004-04-21 devnull start stuff
112 17e5fb89 2004-04-21 devnull | stuff
113 17e5fb89 2004-04-21 devnull
114 17e5fb89 2004-04-21 devnull stuff:
115 17e5fb89 2004-04-21 devnull pstat tail
116 17e5fb89 2004-04-21 devnull {
117 17e5fb89 2004-04-21 devnull output($1);
118 17e5fb89 2004-04-21 devnull }
119 17e5fb89 2004-04-21 devnull | def dargs ')' '{' dlist slist '}'
120 17e5fb89 2004-04-21 devnull {
121 17e5fb89 2004-04-21 devnull ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q");
122 17e5fb89 2004-04-21 devnull conout(ttp, (char*)$1);
123 17e5fb89 2004-04-21 devnull rcrs = crs;
124 0aae8d3d 2005-10-31 devnull output("");
125 17e5fb89 2004-04-21 devnull lev = bindx = 0;
126 17e5fb89 2004-04-21 devnull }
127 17e5fb89 2004-04-21 devnull
128 17e5fb89 2004-04-21 devnull dlist:
129 17e5fb89 2004-04-21 devnull tail
130 17e5fb89 2004-04-21 devnull | dlist _AUTO dlets tail
131 17e5fb89 2004-04-21 devnull
132 17e5fb89 2004-04-21 devnull stat:
133 17e5fb89 2004-04-21 devnull stat1
134 17e5fb89 2004-04-21 devnull | nase
135 17e5fb89 2004-04-21 devnull {
136 17e5fb89 2004-04-21 devnull if(sflag)
137 17e5fb89 2004-04-21 devnull bundle(2, $1, "s.");
138 17e5fb89 2004-04-21 devnull }
139 17e5fb89 2004-04-21 devnull
140 17e5fb89 2004-04-21 devnull pstat:
141 17e5fb89 2004-04-21 devnull stat1
142 17e5fb89 2004-04-21 devnull {
143 17e5fb89 2004-04-21 devnull if(sflag)
144 17e5fb89 2004-04-21 devnull bundle(2, $1, "0");
145 17e5fb89 2004-04-21 devnull }
146 17e5fb89 2004-04-21 devnull | nase
147 17e5fb89 2004-04-21 devnull {
148 17e5fb89 2004-04-21 devnull if(!sflag)
149 17e5fb89 2004-04-21 devnull bundle(2, $1, "ps.");
150 17e5fb89 2004-04-21 devnull }
151 17e5fb89 2004-04-21 devnull
152 17e5fb89 2004-04-21 devnull stat1:
153 17e5fb89 2004-04-21 devnull {
154 17e5fb89 2004-04-21 devnull bundle(1, "");
155 17e5fb89 2004-04-21 devnull }
156 17e5fb89 2004-04-21 devnull | ase
157 17e5fb89 2004-04-21 devnull {
158 17e5fb89 2004-04-21 devnull bundle(2, $1, "s.");
159 17e5fb89 2004-04-21 devnull }
160 17e5fb89 2004-04-21 devnull | SCALE '=' e
161 17e5fb89 2004-04-21 devnull {
162 17e5fb89 2004-04-21 devnull bundle(2, $3, "k");
163 17e5fb89 2004-04-21 devnull }
164 17e5fb89 2004-04-21 devnull | SCALE EQOP e
165 17e5fb89 2004-04-21 devnull {
166 17e5fb89 2004-04-21 devnull bundle(4, "K", $3, $2, "k");
167 17e5fb89 2004-04-21 devnull }
168 17e5fb89 2004-04-21 devnull | BASE '=' e
169 17e5fb89 2004-04-21 devnull {
170 17e5fb89 2004-04-21 devnull bundle(2, $3, "i");
171 17e5fb89 2004-04-21 devnull }
172 17e5fb89 2004-04-21 devnull | BASE EQOP e
173 17e5fb89 2004-04-21 devnull {
174 17e5fb89 2004-04-21 devnull bundle(4, "I", $3, $2, "i");
175 17e5fb89 2004-04-21 devnull }
176 17e5fb89 2004-04-21 devnull | OBASE '=' e
177 17e5fb89 2004-04-21 devnull {
178 17e5fb89 2004-04-21 devnull bundle(2, $3, "o");
179 17e5fb89 2004-04-21 devnull }
180 17e5fb89 2004-04-21 devnull | OBASE EQOP e
181 17e5fb89 2004-04-21 devnull {
182 17e5fb89 2004-04-21 devnull bundle(4, "O", $3, $2, "o");
183 17e5fb89 2004-04-21 devnull }
184 17e5fb89 2004-04-21 devnull | QSTR
185 17e5fb89 2004-04-21 devnull {
186 17e5fb89 2004-04-21 devnull bundle(3, "[", $1, "]P");
187 17e5fb89 2004-04-21 devnull }
188 17e5fb89 2004-04-21 devnull | _BREAK
189 17e5fb89 2004-04-21 devnull {
190 17e5fb89 2004-04-21 devnull bundle(2, numb[lev-bstack[bindx-1]], "Q");
191 17e5fb89 2004-04-21 devnull }
192 17e5fb89 2004-04-21 devnull | _PRINT e
193 17e5fb89 2004-04-21 devnull {
194 17e5fb89 2004-04-21 devnull bundle(2, $2, "ps.");
195 17e5fb89 2004-04-21 devnull }
196 17e5fb89 2004-04-21 devnull | _RETURN e
197 17e5fb89 2004-04-21 devnull {
198 17e5fb89 2004-04-21 devnull bundle(4, $2, post, numb[lev], "Q");
199 17e5fb89 2004-04-21 devnull }
200 17e5fb89 2004-04-21 devnull | _RETURN
201 17e5fb89 2004-04-21 devnull {
202 17e5fb89 2004-04-21 devnull bundle(4, "0", post, numb[lev], "Q");
203 17e5fb89 2004-04-21 devnull }
204 17e5fb89 2004-04-21 devnull | '{' slist '}'
205 17e5fb89 2004-04-21 devnull {
206 17e5fb89 2004-04-21 devnull $$ = $2;
207 17e5fb89 2004-04-21 devnull }
208 17e5fb89 2004-04-21 devnull | FFF
209 17e5fb89 2004-04-21 devnull {
210 17e5fb89 2004-04-21 devnull bundle(1, "fY");
211 17e5fb89 2004-04-21 devnull }
212 17e5fb89 2004-04-21 devnull | _IF crs BLEV '(' re ')' stat
213 17e5fb89 2004-04-21 devnull {
214 17e5fb89 2004-04-21 devnull conout($7, $2);
215 17e5fb89 2004-04-21 devnull bundle(3, $5, $2, " ");
216 17e5fb89 2004-04-21 devnull }
217 17e5fb89 2004-04-21 devnull | _WHILE crs '(' re ')' stat BLEV
218 17e5fb89 2004-04-21 devnull {
219 17e5fb89 2004-04-21 devnull bundle(3, $6, $4, $2);
220 17e5fb89 2004-04-21 devnull conout($$, $2);
221 17e5fb89 2004-04-21 devnull bundle(3, $4, $2, " ");
222 17e5fb89 2004-04-21 devnull }
223 17e5fb89 2004-04-21 devnull | fprefix crs re ';' e ')' stat BLEV
224 17e5fb89 2004-04-21 devnull {
225 17e5fb89 2004-04-21 devnull bundle(5, $7, $5, "s.", $3, $2);
226 17e5fb89 2004-04-21 devnull conout($$, $2);
227 17e5fb89 2004-04-21 devnull bundle(5, $1, "s.", $3, $2, " ");
228 17e5fb89 2004-04-21 devnull }
229 17e5fb89 2004-04-21 devnull | '~' LETTER '=' e
230 17e5fb89 2004-04-21 devnull {
231 17e5fb89 2004-04-21 devnull bundle(3, $4, "S", $2);
232 17e5fb89 2004-04-21 devnull }
233 17e5fb89 2004-04-21 devnull
234 17e5fb89 2004-04-21 devnull fprefix:
235 17e5fb89 2004-04-21 devnull _FOR '(' e ';'
236 17e5fb89 2004-04-21 devnull {
237 17e5fb89 2004-04-21 devnull $$ = $3;
238 17e5fb89 2004-04-21 devnull }
239 17e5fb89 2004-04-21 devnull
240 17e5fb89 2004-04-21 devnull BLEV:
241 17e5fb89 2004-04-21 devnull =
242 17e5fb89 2004-04-21 devnull {
243 17e5fb89 2004-04-21 devnull --bindx;
244 17e5fb89 2004-04-21 devnull }
245 17e5fb89 2004-04-21 devnull
246 17e5fb89 2004-04-21 devnull slist:
247 17e5fb89 2004-04-21 devnull stat
248 17e5fb89 2004-04-21 devnull | slist tail stat
249 17e5fb89 2004-04-21 devnull {
250 17e5fb89 2004-04-21 devnull bundle(2, $1, $3);
251 17e5fb89 2004-04-21 devnull }
252 17e5fb89 2004-04-21 devnull
253 17e5fb89 2004-04-21 devnull tail:
254 17e5fb89 2004-04-21 devnull '\n'
255 17e5fb89 2004-04-21 devnull {
256 17e5fb89 2004-04-21 devnull ln++;
257 17e5fb89 2004-04-21 devnull }
258 17e5fb89 2004-04-21 devnull | ';'
259 17e5fb89 2004-04-21 devnull
260 17e5fb89 2004-04-21 devnull re:
261 17e5fb89 2004-04-21 devnull e EQ e
262 17e5fb89 2004-04-21 devnull {
263 17e5fb89 2004-04-21 devnull $$ = bundle(3, $1, $3, "=");
264 17e5fb89 2004-04-21 devnull }
265 17e5fb89 2004-04-21 devnull | e '<' e
266 17e5fb89 2004-04-21 devnull {
267 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, ">");
268 17e5fb89 2004-04-21 devnull }
269 17e5fb89 2004-04-21 devnull | e '>' e
270 17e5fb89 2004-04-21 devnull {
271 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "<");
272 17e5fb89 2004-04-21 devnull }
273 17e5fb89 2004-04-21 devnull | e NE e
274 17e5fb89 2004-04-21 devnull {
275 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!=");
276 17e5fb89 2004-04-21 devnull }
277 17e5fb89 2004-04-21 devnull | e GE e
278 17e5fb89 2004-04-21 devnull {
279 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!>");
280 17e5fb89 2004-04-21 devnull }
281 17e5fb89 2004-04-21 devnull | e LE e
282 17e5fb89 2004-04-21 devnull {
283 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "!<");
284 17e5fb89 2004-04-21 devnull }
285 17e5fb89 2004-04-21 devnull | e
286 17e5fb89 2004-04-21 devnull {
287 17e5fb89 2004-04-21 devnull bundle(2, $1, " 0!=");
288 17e5fb89 2004-04-21 devnull }
289 17e5fb89 2004-04-21 devnull
290 17e5fb89 2004-04-21 devnull nase:
291 17e5fb89 2004-04-21 devnull '(' e ')'
292 17e5fb89 2004-04-21 devnull {
293 17e5fb89 2004-04-21 devnull $$ = $2;
294 17e5fb89 2004-04-21 devnull }
295 17e5fb89 2004-04-21 devnull | cons
296 17e5fb89 2004-04-21 devnull {
297 17e5fb89 2004-04-21 devnull bundle(3, " ", $1, " ");
298 17e5fb89 2004-04-21 devnull }
299 17e5fb89 2004-04-21 devnull | DOT cons
300 17e5fb89 2004-04-21 devnull {
301 17e5fb89 2004-04-21 devnull bundle(3, " .", $2, " ");
302 17e5fb89 2004-04-21 devnull }
303 17e5fb89 2004-04-21 devnull | cons DOT cons
304 17e5fb89 2004-04-21 devnull {
305 17e5fb89 2004-04-21 devnull bundle(5, " ", $1, ".", $3, " ");
306 17e5fb89 2004-04-21 devnull }
307 17e5fb89 2004-04-21 devnull | cons DOT
308 17e5fb89 2004-04-21 devnull {
309 17e5fb89 2004-04-21 devnull bundle(4, " ", $1, ".", " ");
310 17e5fb89 2004-04-21 devnull }
311 17e5fb89 2004-04-21 devnull | DOT
312 17e5fb89 2004-04-21 devnull {
313 17e5fb89 2004-04-21 devnull $<cptr>$ = "l.";
314 17e5fb89 2004-04-21 devnull }
315 17e5fb89 2004-04-21 devnull | LETTER '[' e ']'
316 17e5fb89 2004-04-21 devnull {
317 17e5fb89 2004-04-21 devnull bundle(3, $3, ";", geta($1));
318 17e5fb89 2004-04-21 devnull }
319 17e5fb89 2004-04-21 devnull | LETTER INCR
320 17e5fb89 2004-04-21 devnull {
321 17e5fb89 2004-04-21 devnull bundle(4, "l", $1, "d1+s", $1);
322 17e5fb89 2004-04-21 devnull }
323 17e5fb89 2004-04-21 devnull | INCR LETTER
324 17e5fb89 2004-04-21 devnull {
325 17e5fb89 2004-04-21 devnull bundle(4, "l", $2, "1+ds", $2);
326 17e5fb89 2004-04-21 devnull }
327 17e5fb89 2004-04-21 devnull | DECR LETTER
328 17e5fb89 2004-04-21 devnull {
329 17e5fb89 2004-04-21 devnull bundle(4, "l", $2, "1-ds", $2);
330 17e5fb89 2004-04-21 devnull }
331 17e5fb89 2004-04-21 devnull | LETTER DECR
332 17e5fb89 2004-04-21 devnull {
333 17e5fb89 2004-04-21 devnull bundle(4, "l", $1, "d1-s", $1);
334 17e5fb89 2004-04-21 devnull }
335 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' INCR
336 17e5fb89 2004-04-21 devnull {
337 17e5fb89 2004-04-21 devnull bundle(7, $3, ";", geta($1), "d1+" ,$3, ":" ,geta($1));
338 17e5fb89 2004-04-21 devnull }
339 17e5fb89 2004-04-21 devnull | INCR LETTER '[' e ']'
340 17e5fb89 2004-04-21 devnull {
341 17e5fb89 2004-04-21 devnull bundle(7, $4, ";", geta($2), "1+d", $4, ":", geta($2));
342 17e5fb89 2004-04-21 devnull }
343 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' DECR
344 17e5fb89 2004-04-21 devnull {
345 17e5fb89 2004-04-21 devnull bundle(7, $3, ";", geta($1), "d1-", $3, ":", geta($1));
346 17e5fb89 2004-04-21 devnull }
347 17e5fb89 2004-04-21 devnull | DECR LETTER '[' e ']'
348 17e5fb89 2004-04-21 devnull {
349 17e5fb89 2004-04-21 devnull bundle(7, $4, ";", geta($2), "1-d", $4, ":" ,geta($2));
350 17e5fb89 2004-04-21 devnull }
351 17e5fb89 2004-04-21 devnull | SCALE INCR
352 17e5fb89 2004-04-21 devnull {
353 17e5fb89 2004-04-21 devnull bundle(1, "Kd1+k");
354 17e5fb89 2004-04-21 devnull }
355 17e5fb89 2004-04-21 devnull | INCR SCALE
356 17e5fb89 2004-04-21 devnull {
357 17e5fb89 2004-04-21 devnull bundle(1, "K1+dk");
358 17e5fb89 2004-04-21 devnull }
359 17e5fb89 2004-04-21 devnull | SCALE DECR
360 17e5fb89 2004-04-21 devnull {
361 17e5fb89 2004-04-21 devnull bundle(1, "Kd1-k");
362 17e5fb89 2004-04-21 devnull }
363 17e5fb89 2004-04-21 devnull | DECR SCALE
364 17e5fb89 2004-04-21 devnull {
365 17e5fb89 2004-04-21 devnull bundle(1, "K1-dk");
366 17e5fb89 2004-04-21 devnull }
367 17e5fb89 2004-04-21 devnull | BASE INCR
368 17e5fb89 2004-04-21 devnull {
369 17e5fb89 2004-04-21 devnull bundle(1, "Id1+i");
370 17e5fb89 2004-04-21 devnull }
371 17e5fb89 2004-04-21 devnull | INCR BASE
372 17e5fb89 2004-04-21 devnull {
373 17e5fb89 2004-04-21 devnull bundle(1, "I1+di");
374 17e5fb89 2004-04-21 devnull }
375 17e5fb89 2004-04-21 devnull | BASE DECR
376 17e5fb89 2004-04-21 devnull {
377 17e5fb89 2004-04-21 devnull bundle(1, "Id1-i");
378 17e5fb89 2004-04-21 devnull }
379 17e5fb89 2004-04-21 devnull | DECR BASE
380 17e5fb89 2004-04-21 devnull {
381 17e5fb89 2004-04-21 devnull bundle(1, "I1-di");
382 17e5fb89 2004-04-21 devnull }
383 17e5fb89 2004-04-21 devnull | OBASE INCR
384 17e5fb89 2004-04-21 devnull {
385 17e5fb89 2004-04-21 devnull bundle(1, "Od1+o");
386 17e5fb89 2004-04-21 devnull }
387 17e5fb89 2004-04-21 devnull | INCR OBASE
388 17e5fb89 2004-04-21 devnull {
389 17e5fb89 2004-04-21 devnull bundle(1, "O1+do");
390 17e5fb89 2004-04-21 devnull }
391 17e5fb89 2004-04-21 devnull | OBASE DECR
392 17e5fb89 2004-04-21 devnull {
393 17e5fb89 2004-04-21 devnull bundle(1, "Od1-o");
394 17e5fb89 2004-04-21 devnull }
395 17e5fb89 2004-04-21 devnull | DECR OBASE
396 17e5fb89 2004-04-21 devnull {
397 17e5fb89 2004-04-21 devnull bundle(1, "O1-do");
398 17e5fb89 2004-04-21 devnull }
399 17e5fb89 2004-04-21 devnull | LETTER '(' cargs ')'
400 17e5fb89 2004-04-21 devnull {
401 17e5fb89 2004-04-21 devnull bundle(4, $3, "l", getf($1), "x");
402 17e5fb89 2004-04-21 devnull }
403 17e5fb89 2004-04-21 devnull | LETTER '(' ')'
404 17e5fb89 2004-04-21 devnull {
405 17e5fb89 2004-04-21 devnull bundle(3, "l", getf($1), "x");
406 17e5fb89 2004-04-21 devnull }
407 17e5fb89 2004-04-21 devnull | LETTER = {
408 17e5fb89 2004-04-21 devnull bundle(2, "l", $1);
409 17e5fb89 2004-04-21 devnull }
410 17e5fb89 2004-04-21 devnull | LENGTH '(' e ')'
411 17e5fb89 2004-04-21 devnull {
412 17e5fb89 2004-04-21 devnull bundle(2, $3, "Z");
413 17e5fb89 2004-04-21 devnull }
414 17e5fb89 2004-04-21 devnull | SCALE '(' e ')'
415 17e5fb89 2004-04-21 devnull {
416 17e5fb89 2004-04-21 devnull bundle(2, $3, "X");
417 17e5fb89 2004-04-21 devnull }
418 17e5fb89 2004-04-21 devnull | '?'
419 17e5fb89 2004-04-21 devnull {
420 17e5fb89 2004-04-21 devnull bundle(1, "?");
421 17e5fb89 2004-04-21 devnull }
422 17e5fb89 2004-04-21 devnull | SQRT '(' e ')'
423 17e5fb89 2004-04-21 devnull {
424 17e5fb89 2004-04-21 devnull bundle(2, $3, "v");
425 17e5fb89 2004-04-21 devnull }
426 17e5fb89 2004-04-21 devnull | '~' LETTER
427 17e5fb89 2004-04-21 devnull {
428 17e5fb89 2004-04-21 devnull bundle(2, "L", $2);
429 17e5fb89 2004-04-21 devnull }
430 17e5fb89 2004-04-21 devnull | SCALE
431 17e5fb89 2004-04-21 devnull {
432 17e5fb89 2004-04-21 devnull bundle(1, "K");
433 17e5fb89 2004-04-21 devnull }
434 17e5fb89 2004-04-21 devnull | BASE
435 17e5fb89 2004-04-21 devnull {
436 17e5fb89 2004-04-21 devnull bundle(1, "I");
437 17e5fb89 2004-04-21 devnull }
438 17e5fb89 2004-04-21 devnull | OBASE
439 17e5fb89 2004-04-21 devnull {
440 17e5fb89 2004-04-21 devnull bundle(1, "O");
441 17e5fb89 2004-04-21 devnull }
442 17e5fb89 2004-04-21 devnull | '-' e
443 17e5fb89 2004-04-21 devnull {
444 17e5fb89 2004-04-21 devnull bundle(3, " 0", $2, "-");
445 17e5fb89 2004-04-21 devnull }
446 17e5fb89 2004-04-21 devnull | e '+' e
447 17e5fb89 2004-04-21 devnull {
448 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "+");
449 17e5fb89 2004-04-21 devnull }
450 17e5fb89 2004-04-21 devnull | e '-' e
451 17e5fb89 2004-04-21 devnull {
452 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "-");
453 17e5fb89 2004-04-21 devnull }
454 17e5fb89 2004-04-21 devnull | e '*' e
455 17e5fb89 2004-04-21 devnull {
456 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "*");
457 17e5fb89 2004-04-21 devnull }
458 17e5fb89 2004-04-21 devnull | e '/' e
459 17e5fb89 2004-04-21 devnull {
460 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "/");
461 17e5fb89 2004-04-21 devnull }
462 17e5fb89 2004-04-21 devnull | e '%' e
463 17e5fb89 2004-04-21 devnull {
464 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "%%");
465 17e5fb89 2004-04-21 devnull }
466 17e5fb89 2004-04-21 devnull | e '^' e
467 17e5fb89 2004-04-21 devnull {
468 17e5fb89 2004-04-21 devnull bundle(3, $1, $3, "^");
469 17e5fb89 2004-04-21 devnull }
470 17e5fb89 2004-04-21 devnull
471 17e5fb89 2004-04-21 devnull ase:
472 17e5fb89 2004-04-21 devnull LETTER '=' e
473 17e5fb89 2004-04-21 devnull {
474 17e5fb89 2004-04-21 devnull bundle(3, $3, "ds", $1);
475 17e5fb89 2004-04-21 devnull }
476 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' '=' e
477 17e5fb89 2004-04-21 devnull {
478 17e5fb89 2004-04-21 devnull bundle(5, $6, "d", $3, ":", geta($1));
479 17e5fb89 2004-04-21 devnull }
480 17e5fb89 2004-04-21 devnull | LETTER EQOP e
481 17e5fb89 2004-04-21 devnull {
482 17e5fb89 2004-04-21 devnull bundle(6, "l", $1, $3, $2, "ds", $1);
483 17e5fb89 2004-04-21 devnull }
484 17e5fb89 2004-04-21 devnull | LETTER '[' e ']' EQOP e
485 17e5fb89 2004-04-21 devnull {
486 17e5fb89 2004-04-21 devnull bundle(9, $3, ";", geta($1), $6, $5, "d", $3, ":", geta($1));
487 17e5fb89 2004-04-21 devnull }
488 17e5fb89 2004-04-21 devnull
489 17e5fb89 2004-04-21 devnull e:
490 17e5fb89 2004-04-21 devnull ase
491 17e5fb89 2004-04-21 devnull | nase
492 17e5fb89 2004-04-21 devnull
493 17e5fb89 2004-04-21 devnull cargs:
494 17e5fb89 2004-04-21 devnull eora
495 17e5fb89 2004-04-21 devnull | cargs ',' eora
496 17e5fb89 2004-04-21 devnull {
497 17e5fb89 2004-04-21 devnull bundle(2, $1, $3);
498 17e5fb89 2004-04-21 devnull }
499 17e5fb89 2004-04-21 devnull
500 17e5fb89 2004-04-21 devnull eora:
501 17e5fb89 2004-04-21 devnull e
502 17e5fb89 2004-04-21 devnull | LETTER '[' ']'
503 17e5fb89 2004-04-21 devnull {
504 17e5fb89 2004-04-21 devnull bundle(2, "l", geta($1));
505 17e5fb89 2004-04-21 devnull }
506 17e5fb89 2004-04-21 devnull
507 17e5fb89 2004-04-21 devnull cons:
508 17e5fb89 2004-04-21 devnull constant
509 17e5fb89 2004-04-21 devnull {
510 17e5fb89 2004-04-21 devnull *cp++ = 0;
511 17e5fb89 2004-04-21 devnull }
512 17e5fb89 2004-04-21 devnull
513 17e5fb89 2004-04-21 devnull constant:
514 17e5fb89 2004-04-21 devnull '_'
515 17e5fb89 2004-04-21 devnull {
516 17e5fb89 2004-04-21 devnull $<cptr>$ = cp;
517 17e5fb89 2004-04-21 devnull *cp++ = '_';
518 17e5fb89 2004-04-21 devnull }
519 17e5fb89 2004-04-21 devnull | DIGIT
520 17e5fb89 2004-04-21 devnull {
521 17e5fb89 2004-04-21 devnull $<cptr>$ = cp;
522 17e5fb89 2004-04-21 devnull *cp++ = $1;
523 17e5fb89 2004-04-21 devnull }
524 17e5fb89 2004-04-21 devnull | constant DIGIT
525 17e5fb89 2004-04-21 devnull {
526 17e5fb89 2004-04-21 devnull *cp++ = $2;
527 17e5fb89 2004-04-21 devnull }
528 17e5fb89 2004-04-21 devnull
529 17e5fb89 2004-04-21 devnull crs:
530 17e5fb89 2004-04-21 devnull =
531 17e5fb89 2004-04-21 devnull {
532 17e5fb89 2004-04-21 devnull $$ = cp;
533 17e5fb89 2004-04-21 devnull *cp++ = '<';
534 17e5fb89 2004-04-21 devnull *cp++ = crs/100+'0';
535 17e5fb89 2004-04-21 devnull *cp++ = (crs%100)/10+'0';
536 17e5fb89 2004-04-21 devnull *cp++ = crs%10+'0';
537 17e5fb89 2004-04-21 devnull *cp++ = '>';
538 17e5fb89 2004-04-21 devnull *cp++ = '\0';
539 17e5fb89 2004-04-21 devnull if(crs++ >= 220) {
540 17e5fb89 2004-04-21 devnull yyerror("program too big");
541 17e5fb89 2004-04-21 devnull getout();
542 17e5fb89 2004-04-21 devnull }
543 17e5fb89 2004-04-21 devnull bstack[bindx++] = lev++;
544 17e5fb89 2004-04-21 devnull }
545 17e5fb89 2004-04-21 devnull
546 17e5fb89 2004-04-21 devnull def:
547 17e5fb89 2004-04-21 devnull _DEFINE LETTER '('
548 17e5fb89 2004-04-21 devnull {
549 17e5fb89 2004-04-21 devnull $$ = getf($2);
550 0aae8d3d 2005-10-31 devnull pre = (char*)"";
551 0aae8d3d 2005-10-31 devnull post = (char*)"";
552 17e5fb89 2004-04-21 devnull lev = 1;
553 17e5fb89 2004-04-21 devnull bindx = 0;
554 17e5fb89 2004-04-21 devnull bstack[bindx] = 0;
555 17e5fb89 2004-04-21 devnull }
556 17e5fb89 2004-04-21 devnull
557 17e5fb89 2004-04-21 devnull dargs:
558 17e5fb89 2004-04-21 devnull | lora
559 17e5fb89 2004-04-21 devnull {
560 17e5fb89 2004-04-21 devnull pp((char*)$1);
561 17e5fb89 2004-04-21 devnull }
562 17e5fb89 2004-04-21 devnull | dargs ',' lora
563 17e5fb89 2004-04-21 devnull {
564 17e5fb89 2004-04-21 devnull pp((char*)$3);
565 17e5fb89 2004-04-21 devnull }
566 17e5fb89 2004-04-21 devnull
567 17e5fb89 2004-04-21 devnull dlets:
568 17e5fb89 2004-04-21 devnull lora
569 17e5fb89 2004-04-21 devnull {
570 17e5fb89 2004-04-21 devnull tp((char*)$1);
571 17e5fb89 2004-04-21 devnull }
572 17e5fb89 2004-04-21 devnull | dlets ',' lora
573 17e5fb89 2004-04-21 devnull {
574 17e5fb89 2004-04-21 devnull tp((char*)$3);
575 17e5fb89 2004-04-21 devnull }
576 17e5fb89 2004-04-21 devnull
577 17e5fb89 2004-04-21 devnull lora:
578 17e5fb89 2004-04-21 devnull LETTER
579 17e5fb89 2004-04-21 devnull {
580 17e5fb89 2004-04-21 devnull $<cptr>$=$1;
581 17e5fb89 2004-04-21 devnull }
582 17e5fb89 2004-04-21 devnull | LETTER '[' ']'
583 17e5fb89 2004-04-21 devnull {
584 17e5fb89 2004-04-21 devnull $$ = geta($1);
585 17e5fb89 2004-04-21 devnull }
586 17e5fb89 2004-04-21 devnull
587 17e5fb89 2004-04-21 devnull %%
588 17e5fb89 2004-04-21 devnull
589 17e5fb89 2004-04-21 devnull int
590 17e5fb89 2004-04-21 devnull yylex(void)
591 17e5fb89 2004-04-21 devnull {
592 17e5fb89 2004-04-21 devnull int c, ch;
593 17e5fb89 2004-04-21 devnull
594 17e5fb89 2004-04-21 devnull restart:
595 17e5fb89 2004-04-21 devnull c = getch();
596 17e5fb89 2004-04-21 devnull peekc = -1;
597 17e5fb89 2004-04-21 devnull while(c == ' ' || c == '\t')
598 17e5fb89 2004-04-21 devnull c = getch();
599 17e5fb89 2004-04-21 devnull if(c == '\\') {
600 17e5fb89 2004-04-21 devnull getch();
601 17e5fb89 2004-04-21 devnull goto restart;
602 17e5fb89 2004-04-21 devnull }
603 17e5fb89 2004-04-21 devnull if(c >= 'a' && c <= 'z') {
604 17e5fb89 2004-04-21 devnull /* look ahead to look for reserved words */
605 17e5fb89 2004-04-21 devnull peekc = getch();
606 17e5fb89 2004-04-21 devnull if(peekc >= 'a' && peekc <= 'z') { /* must be reserved word */
607 17e5fb89 2004-04-21 devnull if(c=='p' && peekc=='r') {
608 17e5fb89 2004-04-21 devnull c = _PRINT;
609 17e5fb89 2004-04-21 devnull goto skip;
610 17e5fb89 2004-04-21 devnull }
611 17e5fb89 2004-04-21 devnull if(c=='i' && peekc=='f') {
612 17e5fb89 2004-04-21 devnull c = _IF;
613 17e5fb89 2004-04-21 devnull goto skip;
614 17e5fb89 2004-04-21 devnull }
615 17e5fb89 2004-04-21 devnull if(c=='w' && peekc=='h') {
616 17e5fb89 2004-04-21 devnull c = _WHILE;
617 17e5fb89 2004-04-21 devnull goto skip;
618 17e5fb89 2004-04-21 devnull }
619 17e5fb89 2004-04-21 devnull if(c=='f' && peekc=='o') {
620 17e5fb89 2004-04-21 devnull c = _FOR;
621 17e5fb89 2004-04-21 devnull goto skip;
622 17e5fb89 2004-04-21 devnull }
623 17e5fb89 2004-04-21 devnull if(c=='s' && peekc=='q') {
624 17e5fb89 2004-04-21 devnull c = SQRT;
625 17e5fb89 2004-04-21 devnull goto skip;
626 17e5fb89 2004-04-21 devnull }
627 17e5fb89 2004-04-21 devnull if(c=='r' && peekc=='e') {
628 17e5fb89 2004-04-21 devnull c = _RETURN;
629 17e5fb89 2004-04-21 devnull goto skip;
630 17e5fb89 2004-04-21 devnull }
631 17e5fb89 2004-04-21 devnull if(c=='b' && peekc=='r') {
632 17e5fb89 2004-04-21 devnull c = _BREAK;
633 17e5fb89 2004-04-21 devnull goto skip;
634 17e5fb89 2004-04-21 devnull }
635 17e5fb89 2004-04-21 devnull if(c=='d' && peekc=='e') {
636 17e5fb89 2004-04-21 devnull c = _DEFINE;
637 17e5fb89 2004-04-21 devnull goto skip;
638 17e5fb89 2004-04-21 devnull }
639 17e5fb89 2004-04-21 devnull if(c=='s' && peekc=='c') {
640 17e5fb89 2004-04-21 devnull c = SCALE;
641 17e5fb89 2004-04-21 devnull goto skip;
642 17e5fb89 2004-04-21 devnull }
643 17e5fb89 2004-04-21 devnull if(c=='b' && peekc=='a') {
644 17e5fb89 2004-04-21 devnull c = BASE;
645 17e5fb89 2004-04-21 devnull goto skip;
646 17e5fb89 2004-04-21 devnull }
647 17e5fb89 2004-04-21 devnull if(c=='i' && peekc=='b') {
648 17e5fb89 2004-04-21 devnull c = BASE;
649 17e5fb89 2004-04-21 devnull goto skip;
650 17e5fb89 2004-04-21 devnull }
651 17e5fb89 2004-04-21 devnull if(c=='o' && peekc=='b') {
652 17e5fb89 2004-04-21 devnull c = OBASE;
653 17e5fb89 2004-04-21 devnull goto skip;
654 17e5fb89 2004-04-21 devnull }
655 17e5fb89 2004-04-21 devnull if(c=='d' && peekc=='i') {
656 17e5fb89 2004-04-21 devnull c = FFF;
657 17e5fb89 2004-04-21 devnull goto skip;
658 17e5fb89 2004-04-21 devnull }
659 17e5fb89 2004-04-21 devnull if(c=='a' && peekc=='u') {
660 17e5fb89 2004-04-21 devnull c = _AUTO;
661 17e5fb89 2004-04-21 devnull goto skip;
662 17e5fb89 2004-04-21 devnull }
663 17e5fb89 2004-04-21 devnull if(c=='l' && peekc=='e') {
664 17e5fb89 2004-04-21 devnull c = LENGTH;
665 17e5fb89 2004-04-21 devnull goto skip;
666 17e5fb89 2004-04-21 devnull }
667 17e5fb89 2004-04-21 devnull if(c=='q' && peekc=='u')
668 17e5fb89 2004-04-21 devnull getout();
669 17e5fb89 2004-04-21 devnull /* could not be found */
670 17e5fb89 2004-04-21 devnull return ERROR;
671 17e5fb89 2004-04-21 devnull
672 17e5fb89 2004-04-21 devnull skip: /* skip over rest of word */
673 17e5fb89 2004-04-21 devnull peekc = -1;
674 17e5fb89 2004-04-21 devnull for(;;) {
675 17e5fb89 2004-04-21 devnull ch = getch();
676 17e5fb89 2004-04-21 devnull if(ch < 'a' || ch > 'z')
677 17e5fb89 2004-04-21 devnull break;
678 17e5fb89 2004-04-21 devnull }
679 17e5fb89 2004-04-21 devnull peekc = ch;
680 17e5fb89 2004-04-21 devnull return c;
681 17e5fb89 2004-04-21 devnull }
682 17e5fb89 2004-04-21 devnull
683 17e5fb89 2004-04-21 devnull /* usual case; just one single letter */
684 17e5fb89 2004-04-21 devnull yylval.cptr = letr[c-'a'];
685 17e5fb89 2004-04-21 devnull return LETTER;
686 17e5fb89 2004-04-21 devnull }
687 17e5fb89 2004-04-21 devnull if((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
688 17e5fb89 2004-04-21 devnull yylval.cc = c;
689 17e5fb89 2004-04-21 devnull return DIGIT;
690 17e5fb89 2004-04-21 devnull }
691 17e5fb89 2004-04-21 devnull switch(c) {
692 17e5fb89 2004-04-21 devnull case '.':
693 17e5fb89 2004-04-21 devnull return DOT;
694 17e5fb89 2004-04-21 devnull case '*':
695 17e5fb89 2004-04-21 devnull yylval.cptr = "*";
696 17e5fb89 2004-04-21 devnull return cpeek('=', EQOP, c);
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 ch = cpeek('=', EQOP, c);
705 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
706 17e5fb89 2004-04-21 devnull yylval.cptr = "+";
707 17e5fb89 2004-04-21 devnull return ch;
708 17e5fb89 2004-04-21 devnull }
709 17e5fb89 2004-04-21 devnull return cpeek('+', INCR, c);
710 17e5fb89 2004-04-21 devnull case '-':
711 17e5fb89 2004-04-21 devnull ch = cpeek('=', EQOP, c);
712 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
713 17e5fb89 2004-04-21 devnull yylval.cptr = "-";
714 17e5fb89 2004-04-21 devnull return ch;
715 17e5fb89 2004-04-21 devnull }
716 17e5fb89 2004-04-21 devnull return cpeek('-', DECR, c);
717 17e5fb89 2004-04-21 devnull case '=':
718 17e5fb89 2004-04-21 devnull return cpeek('=', EQ, '=');
719 17e5fb89 2004-04-21 devnull case '<':
720 17e5fb89 2004-04-21 devnull return cpeek('=', LE, '<');
721 17e5fb89 2004-04-21 devnull case '>':
722 17e5fb89 2004-04-21 devnull return cpeek('=', GE, '>');
723 17e5fb89 2004-04-21 devnull case '!':
724 17e5fb89 2004-04-21 devnull return cpeek('=', NE, '!');
725 17e5fb89 2004-04-21 devnull case '/':
726 17e5fb89 2004-04-21 devnull ch = cpeek('=', EQOP, c);
727 17e5fb89 2004-04-21 devnull if(ch == EQOP) {
728 17e5fb89 2004-04-21 devnull yylval.cptr = "/";
729 17e5fb89 2004-04-21 devnull return ch;
730 17e5fb89 2004-04-21 devnull }
731 17e5fb89 2004-04-21 devnull if(peekc == '*') {
732 17e5fb89 2004-04-21 devnull peekc = -1;
733 17e5fb89 2004-04-21 devnull for(;;) {
734 17e5fb89 2004-04-21 devnull ch = getch();
735 17e5fb89 2004-04-21 devnull if(ch == '*') {
736 17e5fb89 2004-04-21 devnull peekc = getch();
737 17e5fb89 2004-04-21 devnull if(peekc == '/') {
738 17e5fb89 2004-04-21 devnull peekc = -1;
739 17e5fb89 2004-04-21 devnull goto restart;
740 17e5fb89 2004-04-21 devnull }
741 17e5fb89 2004-04-21 devnull }
742 17e5fb89 2004-04-21 devnull }
743 17e5fb89 2004-04-21 devnull }
744 17e5fb89 2004-04-21 devnull return c;
745 17e5fb89 2004-04-21 devnull case '"':
746 17e5fb89 2004-04-21 devnull yylval.cptr = str;
747 17e5fb89 2004-04-21 devnull while((c=getch()) != '"'){
748 17e5fb89 2004-04-21 devnull *str++ = c;
749 17e5fb89 2004-04-21 devnull if(str >= &string[999]){
750 17e5fb89 2004-04-21 devnull yyerror("string space exceeded");
751 17e5fb89 2004-04-21 devnull getout();
752 17e5fb89 2004-04-21 devnull }
753 17e5fb89 2004-04-21 devnull }
754 17e5fb89 2004-04-21 devnull *str++ = 0;
755 17e5fb89 2004-04-21 devnull return QSTR;
756 17e5fb89 2004-04-21 devnull default:
757 17e5fb89 2004-04-21 devnull return c;
758 17e5fb89 2004-04-21 devnull }
759 17e5fb89 2004-04-21 devnull }
760 17e5fb89 2004-04-21 devnull
761 17e5fb89 2004-04-21 devnull int
762 17e5fb89 2004-04-21 devnull cpeek(int c, int yes, int no)
763 17e5fb89 2004-04-21 devnull {
764 17e5fb89 2004-04-21 devnull
765 17e5fb89 2004-04-21 devnull peekc = getch();
766 17e5fb89 2004-04-21 devnull if(peekc == c) {
767 17e5fb89 2004-04-21 devnull peekc = -1;
768 17e5fb89 2004-04-21 devnull return yes;
769 17e5fb89 2004-04-21 devnull }
770 17e5fb89 2004-04-21 devnull return no;
771 17e5fb89 2004-04-21 devnull }
772 17e5fb89 2004-04-21 devnull
773 17e5fb89 2004-04-21 devnull int
774 17e5fb89 2004-04-21 devnull getch(void)
775 17e5fb89 2004-04-21 devnull {
776 17e5fb89 2004-04-21 devnull long ch;
777 17e5fb89 2004-04-21 devnull
778 17e5fb89 2004-04-21 devnull loop:
779 17e5fb89 2004-04-21 devnull ch = peekc;
780 17e5fb89 2004-04-21 devnull if(ch < 0){
781 17e5fb89 2004-04-21 devnull if(in == 0)
782 17e5fb89 2004-04-21 devnull ch = -1;
783 17e5fb89 2004-04-21 devnull else
784 17e5fb89 2004-04-21 devnull ch = Bgetc(in);
785 17e5fb89 2004-04-21 devnull }
786 17e5fb89 2004-04-21 devnull peekc = -1;
787 17e5fb89 2004-04-21 devnull if(ch >= 0)
788 17e5fb89 2004-04-21 devnull return ch;
789 56e6f8f9 2008-12-07 rsc
790 17e5fb89 2004-04-21 devnull ifile++;
791 56e6f8f9 2008-12-07 rsc if(ifile >= sargc) {
792 56e6f8f9 2008-12-07 rsc if(ifile >= sargc+1)
793 17e5fb89 2004-04-21 devnull getout();
794 0aae8d3d 2005-10-31 devnull in = &bstdin;
795 17e5fb89 2004-04-21 devnull Binit(in, 0, OREAD);
796 17e5fb89 2004-04-21 devnull ln = 0;
797 17e5fb89 2004-04-21 devnull goto loop;
798 17e5fb89 2004-04-21 devnull }
799 0aae8d3d 2005-10-31 devnull if(in)
800 0aae8d3d 2005-10-31 devnull Bterm(in);
801 17e5fb89 2004-04-21 devnull if((in = Bopen(sargv[ifile], OREAD)) != 0){
802 17e5fb89 2004-04-21 devnull ln = 0;
803 17e5fb89 2004-04-21 devnull ss = sargv[ifile];
804 17e5fb89 2004-04-21 devnull goto loop;
805 17e5fb89 2004-04-21 devnull }
806 56e6f8f9 2008-12-07 rsc fprint(2, "open %s: %r\n", sargv[ifile]);
807 17e5fb89 2004-04-21 devnull yyerror("cannot open input file");
808 17e5fb89 2004-04-21 devnull return 0; /* shut up ken */
809 17e5fb89 2004-04-21 devnull }
810 17e5fb89 2004-04-21 devnull
811 0aae8d3d 2005-10-31 devnull char*
812 17e5fb89 2004-04-21 devnull bundle(int a, ...)
813 17e5fb89 2004-04-21 devnull {
814 0aae8d3d 2005-10-31 devnull int i;
815 0aae8d3d 2005-10-31 devnull char **q;
816 0aae8d3d 2005-10-31 devnull va_list arg;
817 0aae8d3d 2005-10-31 devnull
818 0aae8d3d 2005-10-31 devnull i = a;
819 0aae8d3d 2005-10-31 devnull va_start(arg, a);
820 17e5fb89 2004-04-21 devnull q = bsp_nxt;
821 17e5fb89 2004-04-21 devnull if(bdebug)
822 17e5fb89 2004-04-21 devnull fprint(2, "bundle %d elements at %lx\n", i, q);
823 17e5fb89 2004-04-21 devnull while(i-- > 0) {
824 17e5fb89 2004-04-21 devnull if(bsp_nxt >= &bspace[bsp_max])
825 17e5fb89 2004-04-21 devnull yyerror("bundling space exceeded");
826 0aae8d3d 2005-10-31 devnull *bsp_nxt++ = va_arg(arg, char*);
827 17e5fb89 2004-04-21 devnull }
828 17e5fb89 2004-04-21 devnull *bsp_nxt++ = 0;
829 0aae8d3d 2005-10-31 devnull va_end(arg);
830 0aae8d3d 2005-10-31 devnull yyval.cptr = (char*)q;
831 0aae8d3d 2005-10-31 devnull return (char*)q;
832 17e5fb89 2004-04-21 devnull }
833 17e5fb89 2004-04-21 devnull
834 17e5fb89 2004-04-21 devnull void
835 0aae8d3d 2005-10-31 devnull routput(char *p)
836 17e5fb89 2004-04-21 devnull {
837 0aae8d3d 2005-10-31 devnull char **pp;
838 0aae8d3d 2005-10-31 devnull
839 17e5fb89 2004-04-21 devnull if(bdebug)
840 17e5fb89 2004-04-21 devnull fprint(2, "routput(%lx)\n", p);
841 0aae8d3d 2005-10-31 devnull if((char**)p >= &bspace[0] && (char**)p < &bspace[bsp_max]) {
842 17e5fb89 2004-04-21 devnull /* part of a bundle */
843 0aae8d3d 2005-10-31 devnull pp = (char**)p;
844 0aae8d3d 2005-10-31 devnull while(*pp != 0)
845 0aae8d3d 2005-10-31 devnull routput(*pp++);
846 17e5fb89 2004-04-21 devnull } else
847 0aae8d3d 2005-10-31 devnull Bprint(&bstdout, p); /* character string */
848 17e5fb89 2004-04-21 devnull }
849 17e5fb89 2004-04-21 devnull
850 17e5fb89 2004-04-21 devnull void
851 0aae8d3d 2005-10-31 devnull output(char *p)
852 17e5fb89 2004-04-21 devnull {
853 17e5fb89 2004-04-21 devnull routput(p);
854 17e5fb89 2004-04-21 devnull bsp_nxt = &bspace[0];
855 0aae8d3d 2005-10-31 devnull Bprint(&bstdout, "\n");
856 0aae8d3d 2005-10-31 devnull Bflush(&bstdout);
857 17e5fb89 2004-04-21 devnull cp = cary;
858 17e5fb89 2004-04-21 devnull crs = rcrs;
859 17e5fb89 2004-04-21 devnull }
860 17e5fb89 2004-04-21 devnull
861 17e5fb89 2004-04-21 devnull void
862 0aae8d3d 2005-10-31 devnull conout(char *p, char *s)
863 17e5fb89 2004-04-21 devnull {
864 0aae8d3d 2005-10-31 devnull Bprint(&bstdout, "[");
865 17e5fb89 2004-04-21 devnull routput(p);
866 0aae8d3d 2005-10-31 devnull Bprint(&bstdout, "]s%s\n", s);
867 0aae8d3d 2005-10-31 devnull Bflush(&bstdout);
868 17e5fb89 2004-04-21 devnull lev--;
869 17e5fb89 2004-04-21 devnull }
870 17e5fb89 2004-04-21 devnull
871 17e5fb89 2004-04-21 devnull void
872 17e5fb89 2004-04-21 devnull yyerror(char *s, ...)
873 17e5fb89 2004-04-21 devnull {
874 17e5fb89 2004-04-21 devnull if(ifile > sargc)
875 17e5fb89 2004-04-21 devnull ss = "teletype";
876 56e6f8f9 2008-12-07 rsc Bprint(&bstdout, "c[%s:%d, %s]pc\n", s, ln+1, ss);
877 0aae8d3d 2005-10-31 devnull Bflush(&bstdout);
878 17e5fb89 2004-04-21 devnull cp = cary;
879 17e5fb89 2004-04-21 devnull crs = rcrs;
880 17e5fb89 2004-04-21 devnull bindx = 0;
881 17e5fb89 2004-04-21 devnull lev = 0;
882 17e5fb89 2004-04-21 devnull bsp_nxt = &bspace[0];
883 17e5fb89 2004-04-21 devnull }
884 17e5fb89 2004-04-21 devnull
885 17e5fb89 2004-04-21 devnull void
886 17e5fb89 2004-04-21 devnull pp(char *s)
887 17e5fb89 2004-04-21 devnull {
888 17e5fb89 2004-04-21 devnull /* puts the relevant stuff on pre and post for the letter s */
889 17e5fb89 2004-04-21 devnull bundle(3, "S", s, pre);
890 0aae8d3d 2005-10-31 devnull pre = yyval.cptr;
891 17e5fb89 2004-04-21 devnull bundle(4, post, "L", s, "s.");
892 0aae8d3d 2005-10-31 devnull post = yyval.cptr;
893 17e5fb89 2004-04-21 devnull }
894 17e5fb89 2004-04-21 devnull
895 17e5fb89 2004-04-21 devnull void
896 17e5fb89 2004-04-21 devnull tp(char *s)
897 17e5fb89 2004-04-21 devnull {
898 17e5fb89 2004-04-21 devnull /* same as pp, but for temps */
899 17e5fb89 2004-04-21 devnull bundle(3, "0S", s, pre);
900 0aae8d3d 2005-10-31 devnull pre = yyval.cptr;
901 17e5fb89 2004-04-21 devnull bundle(4, post, "L", s, "s.");
902 0aae8d3d 2005-10-31 devnull post = yyval.cptr;
903 17e5fb89 2004-04-21 devnull }
904 17e5fb89 2004-04-21 devnull
905 17e5fb89 2004-04-21 devnull void
906 17e5fb89 2004-04-21 devnull yyinit(int argc, char **argv)
907 17e5fb89 2004-04-21 devnull {
908 0aae8d3d 2005-10-31 devnull Binit(&bstdout, 1, OWRITE);
909 17e5fb89 2004-04-21 devnull sargv = argv;
910 56e6f8f9 2008-12-07 rsc sargc = argc;
911 17e5fb89 2004-04-21 devnull if(sargc == 0) {
912 0aae8d3d 2005-10-31 devnull in = &bstdin;
913 17e5fb89 2004-04-21 devnull Binit(in, 0, OREAD);
914 56e6f8f9 2008-12-07 rsc } else if((in = Bopen(sargv[0], OREAD)) == 0)
915 17e5fb89 2004-04-21 devnull yyerror("cannot open input file");
916 56e6f8f9 2008-12-07 rsc ifile = 0;
917 17e5fb89 2004-04-21 devnull ln = 0;
918 56e6f8f9 2008-12-07 rsc ss = sargv[0];
919 17e5fb89 2004-04-21 devnull }
920 17e5fb89 2004-04-21 devnull
921 17e5fb89 2004-04-21 devnull void
922 17e5fb89 2004-04-21 devnull getout(void)
923 17e5fb89 2004-04-21 devnull {
924 0aae8d3d 2005-10-31 devnull Bprint(&bstdout, "q");
925 0aae8d3d 2005-10-31 devnull Bflush(&bstdout);
926 17e5fb89 2004-04-21 devnull exits(0);
927 17e5fb89 2004-04-21 devnull }
928 17e5fb89 2004-04-21 devnull
929 0aae8d3d 2005-10-31 devnull char*
930 17e5fb89 2004-04-21 devnull getf(char *p)
931 17e5fb89 2004-04-21 devnull {
932 0aae8d3d 2005-10-31 devnull return funtab[*p - 'a'];
933 17e5fb89 2004-04-21 devnull }
934 17e5fb89 2004-04-21 devnull
935 0aae8d3d 2005-10-31 devnull char*
936 17e5fb89 2004-04-21 devnull geta(char *p)
937 17e5fb89 2004-04-21 devnull {
938 0aae8d3d 2005-10-31 devnull return atab[*p - 'a'];
939 17e5fb89 2004-04-21 devnull }
940 17e5fb89 2004-04-21 devnull
941 17e5fb89 2004-04-21 devnull void
942 17e5fb89 2004-04-21 devnull main(int argc, char **argv)
943 17e5fb89 2004-04-21 devnull {
944 17e5fb89 2004-04-21 devnull int p[2];
945 17e5fb89 2004-04-21 devnull
946 56e6f8f9 2008-12-07 rsc ARGBEGIN{
947 56e6f8f9 2008-12-07 rsc case 'd':
948 56e6f8f9 2008-12-07 rsc bdebug++;
949 56e6f8f9 2008-12-07 rsc break;
950 56e6f8f9 2008-12-07 rsc case 'c':
951 56e6f8f9 2008-12-07 rsc cflag++;
952 56e6f8f9 2008-12-07 rsc break;
953 56e6f8f9 2008-12-07 rsc case 'l':
954 56e6f8f9 2008-12-07 rsc lflag++;
955 56e6f8f9 2008-12-07 rsc break;
956 56e6f8f9 2008-12-07 rsc case 's':
957 56e6f8f9 2008-12-07 rsc sflag++;
958 56e6f8f9 2008-12-07 rsc break;
959 56e6f8f9 2008-12-07 rsc default:
960 56e6f8f9 2008-12-07 rsc fprint(2, "Usage: bc [-l] [-c] [file ...]\n");
961 56e6f8f9 2008-12-07 rsc exits("usage");
962 56e6f8f9 2008-12-07 rsc }ARGEND
963 56e6f8f9 2008-12-07 rsc
964 17e5fb89 2004-04-21 devnull if(lflag) {
965 17e5fb89 2004-04-21 devnull argc++;
966 56e6f8f9 2008-12-07 rsc argv--;
967 56e6f8f9 2008-12-07 rsc *argv = unsharp("#9/lib/bclib");
968 17e5fb89 2004-04-21 devnull }
969 17e5fb89 2004-04-21 devnull if(cflag) {
970 17e5fb89 2004-04-21 devnull yyinit(argc, argv);
971 17e5fb89 2004-04-21 devnull for(;;)
972 17e5fb89 2004-04-21 devnull yyparse();
973 0aae8d3d 2005-10-31 devnull exits(0);
974 17e5fb89 2004-04-21 devnull }
975 17e5fb89 2004-04-21 devnull pipe(p);
976 17e5fb89 2004-04-21 devnull if(fork() == 0) {
977 17e5fb89 2004-04-21 devnull dup(p[1], 1);
978 17e5fb89 2004-04-21 devnull close(p[0]);
979 17e5fb89 2004-04-21 devnull close(p[1]);
980 17e5fb89 2004-04-21 devnull yyinit(argc, argv);
981 17e5fb89 2004-04-21 devnull for(;;)
982 17e5fb89 2004-04-21 devnull yyparse();
983 17e5fb89 2004-04-21 devnull }
984 17e5fb89 2004-04-21 devnull dup(p[0], 0);
985 17e5fb89 2004-04-21 devnull close(p[0]);
986 17e5fb89 2004-04-21 devnull close(p[1]);
987 56e6f8f9 2008-12-07 rsc execl(unsharp("#9/bin/dc"), "dc", nil);
988 17e5fb89 2004-04-21 devnull }