1 | #include <stdlib.h> |
2 | #include <string.h> |
3 | #define YYBYACC 1 |
4 | #define YYMAJOR 1 |
5 | #define YYMINOR 9 |
6 | #define YYLEX yylex() |
7 | #define YYEMPTY -1 |
8 | #define yyclearin (yychar=(YYEMPTY)) |
9 | #define yyerrok (yyerrflag=0) |
10 | #define YYRECOVERING() (yyerrflag!=0) |
11 | #define YYPREFIX "yy" |
12 | #line 55 "/usr/src/games/atc/grammar.y" |
13 | #ifndef YYSTYPE_DEFINED |
14 | #define YYSTYPE_DEFINED |
15 | typedef union { |
16 | int ival; |
17 | char cval; |
18 | } YYSTYPE; |
19 | #endif /* YYSTYPE_DEFINED */ |
20 | #line 61 "/usr/src/games/atc/grammar.y" |
21 | #include "def.h" |
22 | #include "extern.h" |
23 | |
24 | int errors = 0; |
25 | int line = 1; |
26 | #line 27 "grammar.c" |
27 | #define HeightOp 257 |
28 | #define WidthOp 258 |
29 | #define UpdateOp 259 |
30 | #define NewplaneOp 260 |
31 | #define DirOp 261 |
32 | #define ConstOp 262 |
33 | #define LineOp 263 |
34 | #define AirportOp 264 |
35 | #define BeaconOp 265 |
36 | #define ExitOp 266 |
37 | #define YYERRCODE 256 |
38 | const short yylhs[] = |
39 | { -1, |
40 | 3, 0, 1, 1, 4, 4, 4, 4, 5, 6, |
41 | 8, 7, 2, 2, 9, 9, 9, 9, 10, 10, |
42 | 14, 11, 11, 15, 13, 13, 16, 12, 12, 17, |
43 | }; |
44 | const short yylen[] = |
45 | { 2, |
46 | 0, 3, 2, 1, 1, 1, 1, 1, 4, 4, |
47 | 4, 4, 2, 1, 4, 4, 4, 4, 2, 1, |
48 | 4, 2, 1, 5, 2, 1, 5, 2, 1, 10, |
49 | }; |
50 | const short yydefred[] = |
51 | { 0, |
52 | 0, 0, 0, 0, 0, 1, 0, 5, 6, 7, |
53 | 8, 0, 0, 0, 0, 0, 3, 0, 0, 0, |
54 | 0, 0, 0, 0, 0, 2, 0, 11, 12, 9, |
55 | 10, 0, 0, 0, 0, 13, 0, 0, 0, 0, |
56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, |
57 | 28, 0, 18, 25, 0, 15, 19, 0, 16, 22, |
58 | 0, 0, 0, 0, 0, 0, 21, 0, 0, 27, |
59 | 24, 0, 0, 0, 0, 30, |
60 | }; |
61 | const short yydgoto[] = |
62 | { 5, |
63 | 6, 26, 16, 7, 8, 9, 10, 11, 27, 44, |
64 | 47, 38, 41, 45, 48, 42, 39, |
65 | }; |
66 | const short yysindex[] = |
67 | { -257, |
68 | -49, -48, -47, -46, 0, 0, -257, 0, 0, 0, |
69 | 0, -246, -245, -244, -243, -259, 0, -39, -38, -37, |
70 | -36, -34, -33, -32, -31, 0, -259, 0, 0, 0, |
71 | 0, -63, -11, -10, -9, 0, -8, -26, -63, -228, |
72 | -24, -11, -226, -22, -10, -224, -20, -9, -222, 0, |
73 | 0, -221, 0, 0, -220, 0, 0, -219, 0, 0, |
74 | -218, -216, 5, -214, 7, 8, 0, 9, 11, 0, |
75 | 0, -210, -209, 13, -35, 0,}; |
76 | const short yyrindex[] = |
77 | { 0, |
78 | 0, 0, 0, 0, 0, 0, -255, 0, 0, 0, |
79 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
80 | 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, |
81 | 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, |
82 | 0, -3, 0, 0, -2, 0, 0, 1, 0, 0, |
83 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
84 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
85 | 0, 0, 0, 0, 0, 0,}; |
86 | const short yygindex[] = |
87 | { 0, |
88 | 52, 34, 0, 0, 0, 0, 0, 0, 0, 17, |
89 | 15, 25, 23, 0, 0, 0, 0, |
90 | }; |
91 | #define YYTABLESIZE 65 |
92 | const short yytable[] = |
93 | { 1, |
94 | 2, 3, 4, 22, 23, 24, 25, 4, 4, 4, |
95 | 4, 12, 13, 14, 15, 18, 19, 20, 21, 28, |
96 | 29, 30, 31, 32, 33, 34, 35, 37, 40, 43, |
97 | 46, 49, 50, 52, 53, 55, 56, 58, 59, 61, |
98 | 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, |
99 | 72, 73, 74, 75, 14, 26, 20, 76, 17, 23, |
100 | 36, 57, 60, 51, 54, |
101 | }; |
102 | const short yycheck[] = |
103 | { 257, |
104 | 258, 259, 260, 263, 264, 265, 266, 263, 264, 265, |
105 | 266, 61, 61, 61, 61, 262, 262, 262, 262, 59, |
106 | 59, 59, 59, 58, 58, 58, 58, 91, 40, 40, |
107 | 40, 40, 59, 262, 59, 262, 59, 262, 59, 262, |
108 | 262, 262, 262, 262, 261, 41, 261, 41, 41, 41, |
109 | 40, 262, 262, 41, 0, 59, 59, 93, 7, 59, |
110 | 27, 45, 48, 39, 42, |
111 | }; |
112 | #define YYFINAL 5 |
113 | #ifndef YYDEBUG |
114 | #define YYDEBUG 0 |
115 | #endif |
116 | #define YYMAXTOKEN 266 |
117 | #if YYDEBUG |
118 | const char * const yyname[] = |
119 | { |
120 | "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
121 | 0,0,0,0,0,0,"'('","')'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"':'","';'",0,"'='",0,0, |
122 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'",0,0,0,0,0,0, |
123 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
124 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
125 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
126 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
127 | "HeightOp","WidthOp","UpdateOp","NewplaneOp","DirOp","ConstOp","LineOp", |
128 | "AirportOp","BeaconOp","ExitOp", |
129 | }; |
130 | const char * const yyrule[] = |
131 | {"$accept : file", |
132 | "$$1 :", |
133 | "file : bunch_of_defs $$1 bunch_of_lines", |
134 | "bunch_of_defs : def bunch_of_defs", |
135 | "bunch_of_defs : def", |
136 | "def : udef", |
137 | "def : ndef", |
138 | "def : wdef", |
139 | "def : hdef", |
140 | "udef : UpdateOp '=' ConstOp ';'", |
141 | "ndef : NewplaneOp '=' ConstOp ';'", |
142 | "hdef : HeightOp '=' ConstOp ';'", |
143 | "wdef : WidthOp '=' ConstOp ';'", |
144 | "bunch_of_lines : line bunch_of_lines", |
145 | "bunch_of_lines : line", |
146 | "line : BeaconOp ':' Bpoint_list ';'", |
147 | "line : ExitOp ':' Epoint_list ';'", |
148 | "line : LineOp ':' Lline_list ';'", |
149 | "line : AirportOp ':' Apoint_list ';'", |
150 | "Bpoint_list : Bpoint Bpoint_list", |
151 | "Bpoint_list : Bpoint", |
152 | "Bpoint : '(' ConstOp ConstOp ')'", |
153 | "Epoint_list : Epoint Epoint_list", |
154 | "Epoint_list : Epoint", |
155 | "Epoint : '(' ConstOp ConstOp DirOp ')'", |
156 | "Apoint_list : Apoint Apoint_list", |
157 | "Apoint_list : Apoint", |
158 | "Apoint : '(' ConstOp ConstOp DirOp ')'", |
159 | "Lline_list : Lline Lline_list", |
160 | "Lline_list : Lline", |
161 | "Lline : '[' '(' ConstOp ConstOp ')' '(' ConstOp ConstOp ')' ']'", |
162 | }; |
163 | #endif |
164 | #ifdef YYSTACKSIZE |
165 | #undef YYMAXDEPTH |
166 | #define YYMAXDEPTH YYSTACKSIZE |
167 | #else |
168 | #ifdef YYMAXDEPTH |
169 | #define YYSTACKSIZE YYMAXDEPTH |
170 | #else |
171 | #define YYSTACKSIZE 10000 |
172 | #define YYMAXDEPTH 10000 |
173 | #endif |
174 | #endif |
175 | #define YYINITSTACKSIZE 200 |
176 | |
177 | int yydebug; |
178 | int yynerrs; |
179 | int yyerrflag; |
180 | int yychar; |
181 | short *yyssp; |
182 | YYSTYPE *yyvsp; |
183 | YYSTYPE yyval; |
184 | YYSTYPE yylval; |
185 | short *yyss; |
186 | short *yysslim; |
187 | YYSTYPE *yyvs; |
188 | unsigned int yystacksize; |
189 | int yyparse(void); |
190 | #line 264 "/usr/src/games/atc/grammar.y" |
191 | |
192 | void |
193 | check_edge(int x, int y) |
194 | { |
195 | if (!(x == 0) && !(x == sp->width - 1) && |
196 | !(y == 0) && !(y == sp->height - 1)) |
197 | yyerror("edge value not on edge."); |
198 | } |
199 | |
200 | void |
201 | check_point(int x, int y) |
202 | { |
203 | if (x < 1 || x >= sp->width - 1) |
204 | yyerror("X value out of range."); |
205 | if (y < 1 || y >= sp->height - 1) |
206 | yyerror("Y value out of range."); |
207 | } |
208 | |
209 | void |
210 | check_linepoint(int x, int y) |
211 | { |
212 | if (x < 0 || x >= sp->width) |
213 | yyerror("X value out of range."); |
214 | if (y < 0 || y >= sp->height) |
215 | yyerror("Y value out of range."); |
216 | } |
217 | |
218 | void |
219 | check_line(int x1, int y1, int x2, int y2) |
220 | { |
221 | int d1, d2; |
222 | |
223 | check_linepoint(x1, y1); |
224 | check_linepoint(x2, y2); |
225 | |
226 | d1 = ABS(x2 - x1); |
227 | d2 = ABS(y2 - y1); |
228 | |
229 | if (!(d1 == d2) && !(d1 == 0) && !(d2 == 0)) |
230 | yyerror("Bad line endpoints."); |
231 | } |
232 | |
233 | int |
234 | yyerror(const char *s) |
235 | { |
236 | fprintf(stderr, "\"%s\": line %d: %s\n", file, line, s); |
237 | errors++; |
238 | |
239 | return (errors); |
240 | } |
241 | |
242 | void |
243 | check_edir(int x, int y, int dir) |
244 | { |
245 | int bad = 0; |
246 | |
247 | if (x == sp->width - 1) |
248 | x = 2; |
249 | else if (x != 0) |
250 | x = 1; |
251 | if (y == sp->height - 1) |
252 | y = 2; |
253 | else if (y != 0) |
254 | y = 1; |
255 | |
256 | switch (x * 10 + y) { |
257 | case 00: if (dir != 3) bad++; break; |
258 | case 01: if (dir < 1 || dir > 3) bad++; break; |
259 | case 02: if (dir != 1) bad++; break; |
260 | case 10: if (dir < 3 || dir > 5) bad++; break; |
261 | case 11: break; |
262 | case 12: if (dir > 1 && dir < 7) bad++; break; |
263 | case 20: if (dir != 5) bad++; break; |
264 | case 21: if (dir < 5) bad++; break; |
265 | case 22: if (dir != 7) bad++; break; |
266 | default: |
267 | yyerror("Unknown value in checkdir! Get help!"); |
268 | break; |
269 | } |
270 | if (bad) |
271 | yyerror("Bad direction for entrance at exit."); |
272 | } |
273 | |
274 | void |
275 | check_adir(int x, int y, int dir) |
276 | { |
277 | } |
278 | |
279 | int |
280 | checkdefs(void) |
281 | { |
282 | int err = 0; |
283 | |
284 | if (sp->width == 0) { |
285 | yyerror("'width' undefined."); |
286 | err++; |
287 | } |
288 | if (sp->height == 0) { |
289 | yyerror("'height' undefined."); |
290 | err++; |
291 | } |
292 | if (sp->update_secs == 0) { |
293 | yyerror("'update' undefined."); |
294 | err++; |
295 | } |
296 | if (sp->newplane_time == 0) { |
297 | yyerror("'newplane' undefined."); |
298 | err++; |
299 | } |
300 | if (err) |
301 | return (-1); |
302 | else |
303 | return (0); |
304 | } |
305 | #line 298 "grammar.c" |
306 | |
307 | static int yygrowstack(void) |
308 | { |
309 | unsigned int newsize; |
310 | long sslen; |
311 | short *newss; |
312 | YYSTYPE *newvs; |
313 | |
314 | if ((newsize = yystacksize) == 0) |
| 3 | | Assuming the condition is false | |
|
| |
315 | newsize = YYINITSTACKSIZE; |
316 | else if (newsize >= YYMAXDEPTH) |
| 5 | | Assuming 'newsize' is < YYMAXDEPTH | |
|
| |
317 | return -1; |
318 | else if ((newsize *= 2) > YYMAXDEPTH) |
| 7 | | Assuming the condition is false | |
|
| |
319 | newsize = YYMAXDEPTH; |
320 | sslen = yyssp - yyss; |
321 | #ifdef SIZE_MAX |
322 | #define YY_SIZE_MAX SIZE_MAX |
323 | #else |
324 | #define YY_SIZE_MAX 0xffffffffU |
325 | #endif |
326 | if (newsize && YY_SIZE_MAX / newsize < sizeof *newss) |
| |
327 | goto bail; |
328 | newss = (short *)realloc(yyss, newsize * sizeof *newss); |
329 | if (newss == NULL) |
| 10 | | Assuming 'newss' is not equal to NULL | |
|
| |
330 | goto bail; |
331 | yyss = newss; |
332 | yyssp = newss + sslen; |
333 | if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs) |
334 | goto bail; |
335 | newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs); |
336 | if (newvs == NULL) |
| 12 | | Assuming 'newvs' is not equal to NULL | |
|
| |
337 | goto bail; |
338 | yyvs = newvs; |
339 | yyvsp = newvs + sslen; |
340 | yystacksize = newsize; |
341 | yysslim = yyss + newsize - 1; |
342 | return 0; |
343 | bail: |
344 | if (yyss) |
345 | free(yyss); |
346 | if (yyvs) |
347 | free(yyvs); |
348 | yyss = yyssp = NULL; |
349 | yyvs = yyvsp = NULL; |
350 | yystacksize = 0; |
351 | return -1; |
352 | } |
353 | |
354 | #define YYABORT goto yyabort |
355 | #define YYREJECT goto yyabort |
356 | #define YYACCEPT goto yyaccept |
357 | #define YYERROR goto yyerrlab |
358 | int |
359 | yyparse(void) |
360 | { |
361 | int yym, yyn, yystate; |
362 | #if YYDEBUG |
363 | const char *yys; |
364 | |
365 | if ((yys = getenv("YYDEBUG"))) |
366 | { |
367 | yyn = *yys; |
368 | if (yyn >= '0' && yyn <= '9') |
369 | yydebug = yyn - '0'; |
370 | } |
371 | #endif /* YYDEBUG */ |
372 | |
373 | yynerrs = 0; |
374 | yyerrflag = 0; |
375 | yychar = (-1); |
376 | |
377 | if (yyss == NULL && yygrowstack()) goto yyoverflow; |
| 1 | Assuming 'yyss' is equal to NULL | |
|
| |
| 14 | | Returning from 'yygrowstack' | |
|
| |
378 | yyssp = yyss; |
379 | yyvsp = yyvs; |
380 | *yyssp = yystate = 0; |
| 16 | | Use of zero-allocated memory |
|
381 | |
382 | yyloop: |
383 | if ((yyn = yydefred[yystate]) != 0) goto yyreduce; |
384 | if (yychar < 0) |
385 | { |
386 | if ((yychar = yylex()) < 0) yychar = 0; |
387 | #if YYDEBUG |
388 | if (yydebug) |
389 | { |
390 | yys = 0; |
391 | if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; |
392 | if (!yys) yys = "illegal-symbol"; |
393 | printf("%sdebug: state %d, reading %d (%s)\n", |
394 | YYPREFIX, yystate, yychar, yys); |
395 | } |
396 | #endif |
397 | } |
398 | if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && |
399 | yyn <= YYTABLESIZE && yycheck[yyn] == yychar) |
400 | { |
401 | #if YYDEBUG |
402 | if (yydebug) |
403 | printf("%sdebug: state %d, shifting to state %d\n", |
404 | YYPREFIX, yystate, yytable[yyn]); |
405 | #endif |
406 | if (yyssp >= yysslim && yygrowstack()) |
407 | { |
408 | goto yyoverflow; |
409 | } |
410 | *++yyssp = yystate = yytable[yyn]; |
411 | *++yyvsp = yylval; |
412 | yychar = (-1); |
413 | if (yyerrflag > 0) --yyerrflag; |
414 | goto yyloop; |
415 | } |
416 | if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && |
417 | yyn <= YYTABLESIZE && yycheck[yyn] == yychar) |
418 | { |
419 | yyn = yytable[yyn]; |
420 | goto yyreduce; |
421 | } |
422 | if (yyerrflag) goto yyinrecovery; |
423 | #if defined(__GNUC__) |
424 | goto yynewerror; |
425 | #endif |
426 | yynewerror: |
427 | yyerror("syntax error"); |
428 | #if defined(__GNUC__) |
429 | goto yyerrlab; |
430 | #endif |
431 | yyerrlab: |
432 | ++yynerrs; |
433 | yyinrecovery: |
434 | if (yyerrflag < 3) |
435 | { |
436 | yyerrflag = 3; |
437 | for (;;) |
438 | { |
439 | if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && |
440 | yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) |
441 | { |
442 | #if YYDEBUG |
443 | if (yydebug) |
444 | printf("%sdebug: state %d, error recovery shifting\ |
445 | to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); |
446 | #endif |
447 | if (yyssp >= yysslim && yygrowstack()) |
448 | { |
449 | goto yyoverflow; |
450 | } |
451 | *++yyssp = yystate = yytable[yyn]; |
452 | *++yyvsp = yylval; |
453 | goto yyloop; |
454 | } |
455 | else |
456 | { |
457 | #if YYDEBUG |
458 | if (yydebug) |
459 | printf("%sdebug: error recovery discarding state %d\n", |
460 | YYPREFIX, *yyssp); |
461 | #endif |
462 | if (yyssp <= yyss) goto yyabort; |
463 | --yyssp; |
464 | --yyvsp; |
465 | } |
466 | } |
467 | } |
468 | else |
469 | { |
470 | if (yychar == 0) goto yyabort; |
471 | #if YYDEBUG |
472 | if (yydebug) |
473 | { |
474 | yys = 0; |
475 | if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; |
476 | if (!yys) yys = "illegal-symbol"; |
477 | printf("%sdebug: state %d, error recovery discards token %d (%s)\n", |
478 | YYPREFIX, yystate, yychar, yys); |
479 | } |
480 | #endif |
481 | yychar = (-1); |
482 | goto yyloop; |
483 | } |
484 | yyreduce: |
485 | #if YYDEBUG |
486 | if (yydebug) |
487 | printf("%sdebug: state %d, reducing by rule %d (%s)\n", |
488 | YYPREFIX, yystate, yyn, yyrule[yyn]); |
489 | #endif |
490 | yym = yylen[yyn]; |
491 | if (yym) |
492 | yyval = yyvsp[1-yym]; |
493 | else |
494 | memset(&yyval, 0, sizeof yyval); |
495 | switch (yyn) |
496 | { |
497 | case 1: |
498 | #line 70 "/usr/src/games/atc/grammar.y" |
499 | { if (checkdefs() < 0) return (errors); } |
500 | break; |
501 | case 2: |
502 | #line 71 "/usr/src/games/atc/grammar.y" |
503 | { |
504 | if (sp->num_exits + sp->num_airports < 2) |
505 | yyerror("Need at least 2 airports and/or exits."); |
506 | return (errors); |
507 | } |
508 | break; |
509 | case 9: |
510 | #line 92 "/usr/src/games/atc/grammar.y" |
511 | { |
512 | if (sp->update_secs != 0) |
513 | return (yyerror("Redefinition of 'update'.")); |
514 | else if (yyvsp[-1].ival < 1) |
515 | return (yyerror("'update' is too small.")); |
516 | else |
517 | sp->update_secs = yyvsp[-1].ival; |
518 | } |
519 | break; |
520 | case 10: |
521 | #line 104 "/usr/src/games/atc/grammar.y" |
522 | { |
523 | if (sp->newplane_time != 0) |
524 | return (yyerror("Redefinition of 'newplane'.")); |
525 | else if (yyvsp[-1].ival < 1) |
526 | return (yyerror("'newplane' is too small.")); |
527 | else |
528 | sp->newplane_time = yyvsp[-1].ival; |
529 | } |
530 | break; |
531 | case 11: |
532 | #line 116 "/usr/src/games/atc/grammar.y" |
533 | { |
534 | if (sp->height != 0) |
535 | return (yyerror("Redefinition of 'height'.")); |
536 | else if (yyvsp[-1].ival < 3) |
537 | return (yyerror("'height' is too small.")); |
538 | else |
539 | sp->height = yyvsp[-1].ival; |
540 | } |
541 | break; |
542 | case 12: |
543 | #line 128 "/usr/src/games/atc/grammar.y" |
544 | { |
545 | if (sp->width != 0) |
546 | return (yyerror("Redefinition of 'width'.")); |
547 | else if (yyvsp[-1].ival < 3) |
548 | return (yyerror("'width' is too small.")); |
549 | else |
550 | sp->width = yyvsp[-1].ival; |
551 | } |
552 | break; |
553 | case 13: |
554 | #line 140 "/usr/src/games/atc/grammar.y" |
555 | {} |
556 | break; |
557 | case 14: |
558 | #line 142 "/usr/src/games/atc/grammar.y" |
559 | {} |
560 | break; |
561 | case 15: |
562 | #line 147 "/usr/src/games/atc/grammar.y" |
563 | {} |
564 | break; |
565 | case 16: |
566 | #line 149 "/usr/src/games/atc/grammar.y" |
567 | {} |
568 | break; |
569 | case 17: |
570 | #line 151 "/usr/src/games/atc/grammar.y" |
571 | {} |
572 | break; |
573 | case 18: |
574 | #line 153 "/usr/src/games/atc/grammar.y" |
575 | {} |
576 | break; |
577 | case 19: |
578 | #line 158 "/usr/src/games/atc/grammar.y" |
579 | {} |
580 | break; |
581 | case 20: |
582 | #line 160 "/usr/src/games/atc/grammar.y" |
583 | {} |
584 | break; |
585 | case 21: |
586 | #line 165 "/usr/src/games/atc/grammar.y" |
587 | { |
588 | if (sp->num_beacons % REALLOC == 0) { |
589 | sp->beacon = reallocarray(sp->beacon, |
590 | (sp->num_beacons + REALLOC) , |
591 | sizeof (BEACON)); |
592 | if (sp->beacon == NULL) |
593 | return (yyerror("No memory available.")); |
594 | } |
595 | sp->beacon[sp->num_beacons].x = yyvsp[-2].ival; |
596 | sp->beacon[sp->num_beacons].y = yyvsp[-1].ival; |
597 | check_point(yyvsp[-2].ival, yyvsp[-1].ival); |
598 | sp->num_beacons++; |
599 | } |
600 | break; |
601 | case 22: |
602 | #line 182 "/usr/src/games/atc/grammar.y" |
603 | {} |
604 | break; |
605 | case 23: |
606 | #line 184 "/usr/src/games/atc/grammar.y" |
607 | {} |
608 | break; |
609 | case 24: |
610 | #line 189 "/usr/src/games/atc/grammar.y" |
611 | { |
612 | int dir; |
613 | |
614 | if (sp->num_exits % REALLOC == 0) { |
615 | sp->exit = reallocarray(sp->exit, |
616 | (sp->num_exits + REALLOC) , |
617 | sizeof (EXIT)); |
618 | if (sp->exit == NULL) |
619 | return (yyerror("No memory available.")); |
620 | } |
621 | dir = dir_no(yyvsp[-1].cval); |
622 | sp->exit[sp->num_exits].x = yyvsp[-3].ival; |
623 | sp->exit[sp->num_exits].y = yyvsp[-2].ival; |
624 | sp->exit[sp->num_exits].dir = dir; |
625 | check_edge(yyvsp[-3].ival, yyvsp[-2].ival); |
626 | check_edir(yyvsp[-3].ival, yyvsp[-2].ival, dir); |
627 | sp->num_exits++; |
628 | } |
629 | break; |
630 | case 25: |
631 | #line 211 "/usr/src/games/atc/grammar.y" |
632 | {} |
633 | break; |
634 | case 26: |
635 | #line 213 "/usr/src/games/atc/grammar.y" |
636 | {} |
637 | break; |
638 | case 27: |
639 | #line 218 "/usr/src/games/atc/grammar.y" |
640 | { |
641 | int dir; |
642 | |
643 | if (sp->num_airports % REALLOC == 0) { |
644 | sp->airport = reallocarray(sp->airport, |
645 | (sp->num_airports + REALLOC) , |
646 | sizeof(AIRPORT)); |
647 | if (sp->airport == NULL) |
648 | return (yyerror("No memory available.")); |
649 | } |
650 | dir = dir_no(yyvsp[-1].cval); |
651 | sp->airport[sp->num_airports].x = yyvsp[-3].ival; |
652 | sp->airport[sp->num_airports].y = yyvsp[-2].ival; |
653 | sp->airport[sp->num_airports].dir = dir; |
654 | check_point(yyvsp[-3].ival, yyvsp[-2].ival); |
655 | check_adir(yyvsp[-3].ival, yyvsp[-2].ival, dir); |
656 | sp->num_airports++; |
657 | } |
658 | break; |
659 | case 28: |
660 | #line 240 "/usr/src/games/atc/grammar.y" |
661 | {} |
662 | break; |
663 | case 29: |
664 | #line 242 "/usr/src/games/atc/grammar.y" |
665 | {} |
666 | break; |
667 | case 30: |
668 | #line 247 "/usr/src/games/atc/grammar.y" |
669 | { |
670 | if (sp->num_lines % REALLOC == 0) { |
671 | sp->line = reallocarray(sp->line, |
672 | (sp->num_lines + REALLOC) , |
673 | sizeof (LINE)); |
674 | if (sp->line == NULL) |
675 | return (yyerror("No memory available.")); |
676 | } |
677 | sp->line[sp->num_lines].p1.x = yyvsp[-7].ival; |
678 | sp->line[sp->num_lines].p1.y = yyvsp[-6].ival; |
679 | sp->line[sp->num_lines].p2.x = yyvsp[-3].ival; |
680 | sp->line[sp->num_lines].p2.y = yyvsp[-2].ival; |
681 | check_line(yyvsp[-7].ival, yyvsp[-6].ival, yyvsp[-3].ival, yyvsp[-2].ival); |
682 | sp->num_lines++; |
683 | } |
684 | break; |
685 | #line 678 "grammar.c" |
686 | } |
687 | yyssp -= yym; |
688 | yystate = *yyssp; |
689 | yyvsp -= yym; |
690 | yym = yylhs[yyn]; |
691 | if (yystate == 0 && yym == 0) |
692 | { |
693 | #if YYDEBUG |
694 | if (yydebug) |
695 | printf("%sdebug: after reduction, shifting from state 0 to\ |
696 | state %d\n", YYPREFIX, YYFINAL); |
697 | #endif |
698 | yystate = YYFINAL; |
699 | *++yyssp = YYFINAL; |
700 | *++yyvsp = yyval; |
701 | if (yychar < 0) |
702 | { |
703 | if ((yychar = yylex()) < 0) yychar = 0; |
704 | #if YYDEBUG |
705 | if (yydebug) |
706 | { |
707 | yys = 0; |
708 | if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; |
709 | if (!yys) yys = "illegal-symbol"; |
710 | printf("%sdebug: state %d, reading %d (%s)\n", |
711 | YYPREFIX, YYFINAL, yychar, yys); |
712 | } |
713 | #endif |
714 | } |
715 | if (yychar == 0) goto yyaccept; |
716 | goto yyloop; |
717 | } |
718 | if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && |
719 | yyn <= YYTABLESIZE && yycheck[yyn] == yystate) |
720 | yystate = yytable[yyn]; |
721 | else |
722 | yystate = yydgoto[yym]; |
723 | #if YYDEBUG |
724 | if (yydebug) |
725 | printf("%sdebug: after reduction, shifting from state %d \ |
726 | to state %d\n", YYPREFIX, *yyssp, yystate); |
727 | #endif |
728 | if (yyssp >= yysslim && yygrowstack()) |
729 | { |
730 | goto yyoverflow; |
731 | } |
732 | *++yyssp = yystate; |
733 | *++yyvsp = yyval; |
734 | goto yyloop; |
735 | yyoverflow: |
736 | yyerror("yacc stack overflow"); |
737 | yyabort: |
738 | if (yyss) |
739 | free(yyss); |
740 | if (yyvs) |
741 | free(yyvs); |
742 | yyss = yyssp = NULL; |
743 | yyvs = yyvsp = NULL; |
744 | yystacksize = 0; |
745 | return (1); |
746 | yyaccept: |
747 | if (yyss) |
748 | free(yyss); |
749 | if (yyvs) |
750 | free(yyvs); |
751 | yyss = yyssp = NULL; |
752 | yyvs = yyvsp = NULL; |
753 | yystacksize = 0; |
754 | return (0); |
755 | } |