Bug Summary

File:src/games/atc/obj/grammar.c
Warning:line 451, column 26
Use of zero-allocated memory

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name grammar.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/games/atc/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/games/atc -I . -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/games/atc/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c grammar.c
1#include <stdlib.h>
2#include <string.h>
3#define YYBYACC1 1
4#define YYMAJOR1 1
5#define YYMINOR9 9
6#define YYLEXyylex() yylex()
7#define YYEMPTY-1 -1
8#define yyclearin(yychar=(-1)) (yychar=(YYEMPTY-1))
9#define yyerrok(yyerrflag=0) (yyerrflag=0)
10#define YYRECOVERING()(yyerrflag!=0) (yyerrflag!=0)
11#define YYPREFIX"yy" "yy"
12#line 55 "/usr/src/games/atc/grammar.y"
13#ifndef YYSTYPE_DEFINED
14#define YYSTYPE_DEFINED
15typedef 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
24int errors = 0;
25int line = 1;
26#line 27 "grammar.c"
27#define HeightOp257 257
28#define WidthOp258 258
29#define UpdateOp259 259
30#define NewplaneOp260 260
31#define DirOp261 261
32#define ConstOp262 262
33#define LineOp263 263
34#define AirportOp264 264
35#define BeaconOp265 265
36#define ExitOp266 266
37#define YYERRCODE256 256
38const 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};
44const 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};
50const 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};
61const short yydgoto[] =
62 { 5,
63 6, 26, 16, 7, 8, 9, 10, 11, 27, 44,
64 47, 38, 41, 45, 48, 42, 39,
65};
66const 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,};
76const 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,};
86const 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 YYTABLESIZE65 65
92const 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};
102const 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 YYFINAL5 5
113#ifndef YYDEBUG0
114#define YYDEBUG0 0
115#endif
116#define YYMAXTOKEN266 266
117#if YYDEBUG0
118const 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,
1210,0,0,0,0,0,"'('","')'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"':'","';'",0,"'='",0,0,
1220,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,
1230,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,
1240,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,
1250,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,
1260,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};
130const 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 YYSTACKSIZE10000
165#undef YYMAXDEPTH10000
166#define YYMAXDEPTH10000 YYSTACKSIZE10000
167#else
168#ifdef YYMAXDEPTH10000
169#define YYSTACKSIZE10000 YYMAXDEPTH10000
170#else
171#define YYSTACKSIZE10000 10000
172#define YYMAXDEPTH10000 10000
173#endif
174#endif
175#define YYINITSTACKSIZE200 200
176/* LINTUSED */
177int yydebug;
178int yynerrs;
179int yyerrflag;
180int yychar;
181short *yyssp;
182YYSTYPE *yyvsp;
183YYSTYPE yyval;
184YYSTYPE yylval;
185short *yyss;
186short *yysslim;
187YYSTYPE *yyvs;
188unsigned int yystacksize;
189int yyparse(void);
190#line 264 "/usr/src/games/atc/grammar.y"
191
192void
193check_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
200void
201check_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
209void
210check_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
218void
219check_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)((x2 - x1 < 0) ? -(x2 - x1) : (x2 - x1));
227 d2 = ABS(y2 - y1)((y2 - y1 < 0) ? -(y2 - y1) : (y2 - y1));
228
229 if (!(d1 == d2) && !(d1 == 0) && !(d2 == 0))
230 yyerror("Bad line endpoints.");
231}
232
233int
234yyerror(const char *s)
235{
236 fprintf(stderr(&__sF[2]), "\"%s\": line %d: %s\n", file, line, s);
237 errors++;
238
239 return (errors);
240}
241
242void
243check_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
274void
275check_adir(int x, int y, int dir)
276{
277}
278
279int
280checkdefs(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/* allocate initial stack or double stack size, up to YYMAXDEPTH */
307static int yygrowstack(void)
308{
309 unsigned int newsize;
310 long sslen;
311 short *newss;
312 YYSTYPE *newvs;
313
314 if ((newsize = yystacksize) == 0)
22
Assuming the condition is false
23
Taking false branch
315 newsize = YYINITSTACKSIZE200;
316 else if (newsize >= YYMAXDEPTH10000)
24
Assuming 'newsize' is < YYMAXDEPTH
25
Taking false branch
317 return -1;
318 else if ((newsize *= 2) > YYMAXDEPTH10000)
26
Assuming the condition is false
27
Taking false branch
319 newsize = YYMAXDEPTH10000;
320 sslen = yyssp - yyss;
321#ifdef SIZE_MAX
322#define YY_SIZE_MAX0xffffffffU SIZE_MAX
323#else
324#define YY_SIZE_MAX0xffffffffU 0xffffffffU
325#endif
326 if (newsize && YY_SIZE_MAX0xffffffffU / newsize < sizeof *newss)
28
Assuming 'newsize' is 0
327 goto bail;
328 newss = (short *)realloc(yyss, newsize * sizeof *newss);
329 if (newss == NULL((void *)0))
29
Assuming 'newss' is not equal to NULL
30
Taking false branch
330 goto bail;
331 yyss = newss;
332 yyssp = newss + sslen;
333 if (newsize
30.1
'newsize' is 0
&& YY_SIZE_MAX0xffffffffU / newsize < sizeof *newvs)
334 goto bail;
335 newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs);
336 if (newvs == NULL((void *)0))
31
Assuming 'newvs' is not equal to NULL
32
Taking false branch
337 goto bail;
338 yyvs = newvs;
339 yyvsp = newvs + sslen;
340 yystacksize = newsize;
341 yysslim = yyss + newsize - 1;
342 return 0;
343bail:
344 if (yyss)
345 free(yyss);
346 if (yyvs)
347 free(yyvs);
348 yyss = yyssp = NULL((void *)0);
349 yyvs = yyvsp = NULL((void *)0);
350 yystacksize = 0;
351 return -1;
352}
353
354#define YYABORTgoto yyabort goto yyabort
355#define YYREJECTgoto yyabort goto yyabort
356#define YYACCEPTgoto yyaccept goto yyaccept
357#define YYERRORgoto yyerrlab goto yyerrlab
358int
359yyparse(void)
360{
361 int yym, yyn, yystate;
362#if YYDEBUG0
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((void *)0) && yygrowstack()) goto yyoverflow;
1
Assuming 'yyss' is not equal to NULL
378 yyssp = yyss;
379 yyvsp = yyvs;
380 *yyssp = yystate = 0;
381
382yyloop:
383 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
2
Taking false branch
384 if (yychar
2.1
'yychar' is < 0
< 0)
3
Taking true branch
385 {
386 if ((yychar = yylex()) < 0) yychar = 0;
4
Assuming the condition is false
5
Taking false branch
387#if YYDEBUG0
388 if (yydebug)
389 {
390 yys = 0;
391 if (yychar <= YYMAXTOKEN266) yys = yyname[yychar];
392 if (!yys) yys = "illegal-symbol";
393 printf("%sdebug: state %d, reading %d (%s)\n",
394 YYPREFIX"yy", yystate, yychar, yys);
395 }
396#endif
397 }
398 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
6
Assuming 'yyn' is not equal to 0
7
Assuming the condition is false
399 yyn <= YYTABLESIZE65 && yycheck[yyn] == yychar)
400 {
401#if YYDEBUG0
402 if (yydebug)
403 printf("%sdebug: state %d, shifting to state %d\n",
404 YYPREFIX"yy", 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 &&
8
Assuming 'yyn' is 0
417 yyn <= YYTABLESIZE65 && yycheck[yyn] == yychar)
418 {
419 yyn = yytable[yyn];
420 goto yyreduce;
421 }
422 if (yyerrflag) goto yyinrecovery;
9
Assuming 'yyerrflag' is not equal to 0
10
Taking true branch
11
Control jumps to line 434
423#if defined(__GNUC__4)
424 goto yynewerror;
425#endif
426yynewerror:
427 yyerror("syntax error");
428#if defined(__GNUC__4)
429 goto yyerrlab;
430#endif
431yyerrlab:
432 ++yynerrs;
433yyinrecovery:
434 if (yyerrflag < 3)
12
Assuming 'yyerrflag' is < 3
13
Taking true branch
435 {
436 yyerrflag = 3;
437 for (;;)
14
Loop condition is true. Entering loop body
438 {
439 if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE256) >= 0 &&
15
Assuming 'yyn' is not equal to 0
16
Assuming the condition is true
19
Taking true branch
440 yyn <= YYTABLESIZE65 && yycheck[yyn] == YYERRCODE256)
17
Assuming 'yyn' is <= YYTABLESIZE
18
Assuming the condition is true
441 {
442#if YYDEBUG0
443 if (yydebug)
444 printf("%sdebug: state %d, error recovery shifting\
445 to state %d\n", YYPREFIX"yy", *yyssp, yytable[yyn]);
446#endif
447 if (yyssp >= yysslim && yygrowstack())
20
Assuming 'yyssp' is >= 'yysslim'
21
Calling 'yygrowstack'
33
Returning from 'yygrowstack'
34
Taking false branch
448 {
449 goto yyoverflow;
450 }
451 *++yyssp = yystate = yytable[yyn];
35
Use of zero-allocated memory
452 *++yyvsp = yylval;
453 goto yyloop;
454 }
455 else
456 {
457#if YYDEBUG0
458 if (yydebug)
459 printf("%sdebug: error recovery discarding state %d\n",
460 YYPREFIX"yy", *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 YYDEBUG0
472 if (yydebug)
473 {
474 yys = 0;
475 if (yychar <= YYMAXTOKEN266) yys = yyname[yychar];
476 if (!yys) yys = "illegal-symbol";
477 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
478 YYPREFIX"yy", yystate, yychar, yys);
479 }
480#endif
481 yychar = (-1);
482 goto yyloop;
483 }
484yyreduce:
485#if YYDEBUG0
486 if (yydebug)
487 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
488 YYPREFIX"yy", 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 {
497case 1:
498#line 70 "/usr/src/games/atc/grammar.y"
499{ if (checkdefs() < 0) return (errors); }
500break;
501case 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 }
508break;
509case 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 }
519break;
520case 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 }
530break;
531case 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 }
541break;
542case 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 }
552break;
553case 13:
554#line 140 "/usr/src/games/atc/grammar.y"
555{}
556break;
557case 14:
558#line 142 "/usr/src/games/atc/grammar.y"
559{}
560break;
561case 15:
562#line 147 "/usr/src/games/atc/grammar.y"
563{}
564break;
565case 16:
566#line 149 "/usr/src/games/atc/grammar.y"
567{}
568break;
569case 17:
570#line 151 "/usr/src/games/atc/grammar.y"
571{}
572break;
573case 18:
574#line 153 "/usr/src/games/atc/grammar.y"
575{}
576break;
577case 19:
578#line 158 "/usr/src/games/atc/grammar.y"
579{}
580break;
581case 20:
582#line 160 "/usr/src/games/atc/grammar.y"
583{}
584break;
585case 21:
586#line 165 "/usr/src/games/atc/grammar.y"
587{
588 if (sp->num_beacons % REALLOC10 == 0) {
589 sp->beacon = reallocarray(sp->beacon,
590 (sp->num_beacons + REALLOC10) ,
591 sizeof (BEACON));
592 if (sp->beacon == NULL((void *)0))
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 }
600break;
601case 22:
602#line 182 "/usr/src/games/atc/grammar.y"
603{}
604break;
605case 23:
606#line 184 "/usr/src/games/atc/grammar.y"
607{}
608break;
609case 24:
610#line 189 "/usr/src/games/atc/grammar.y"
611{
612 int dir;
613
614 if (sp->num_exits % REALLOC10 == 0) {
615 sp->exit = reallocarray(sp->exit,
616 (sp->num_exits + REALLOC10) ,
617 sizeof (EXIT));
618 if (sp->exit == NULL((void *)0))
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 }
629break;
630case 25:
631#line 211 "/usr/src/games/atc/grammar.y"
632{}
633break;
634case 26:
635#line 213 "/usr/src/games/atc/grammar.y"
636{}
637break;
638case 27:
639#line 218 "/usr/src/games/atc/grammar.y"
640{
641 int dir;
642
643 if (sp->num_airports % REALLOC10 == 0) {
644 sp->airport = reallocarray(sp->airport,
645 (sp->num_airports + REALLOC10) ,
646 sizeof(AIRPORT));
647 if (sp->airport == NULL((void *)0))
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 }
658break;
659case 28:
660#line 240 "/usr/src/games/atc/grammar.y"
661{}
662break;
663case 29:
664#line 242 "/usr/src/games/atc/grammar.y"
665{}
666break;
667case 30:
668#line 247 "/usr/src/games/atc/grammar.y"
669{
670 if (sp->num_lines % REALLOC10 == 0) {
671 sp->line = reallocarray(sp->line,
672 (sp->num_lines + REALLOC10) ,
673 sizeof (LINE));
674 if (sp->line == NULL((void *)0))
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 }
684break;
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 YYDEBUG0
694 if (yydebug)
695 printf("%sdebug: after reduction, shifting from state 0 to\
696 state %d\n", YYPREFIX"yy", YYFINAL5);
697#endif
698 yystate = YYFINAL5;
699 *++yyssp = YYFINAL5;
700 *++yyvsp = yyval;
701 if (yychar < 0)
702 {
703 if ((yychar = yylex()) < 0) yychar = 0;
704#if YYDEBUG0
705 if (yydebug)
706 {
707 yys = 0;
708 if (yychar <= YYMAXTOKEN266) yys = yyname[yychar];
709 if (!yys) yys = "illegal-symbol";
710 printf("%sdebug: state %d, reading %d (%s)\n",
711 YYPREFIX"yy", YYFINAL5, 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 <= YYTABLESIZE65 && yycheck[yyn] == yystate)
720 yystate = yytable[yyn];
721 else
722 yystate = yydgoto[yym];
723#if YYDEBUG0
724 if (yydebug)
725 printf("%sdebug: after reduction, shifting from state %d \
726to state %d\n", YYPREFIX"yy", *yyssp, yystate);
727#endif
728 if (yyssp >= yysslim && yygrowstack())
729 {
730 goto yyoverflow;
731 }
732 *++yyssp = yystate;
733 *++yyvsp = yyval;
734 goto yyloop;
735yyoverflow:
736 yyerror("yacc stack overflow");
737yyabort:
738 if (yyss)
739 free(yyss);
740 if (yyvs)
741 free(yyvs);
742 yyss = yyssp = NULL((void *)0);
743 yyvs = yyvsp = NULL((void *)0);
744 yystacksize = 0;
745 return (1);
746yyaccept:
747 if (yyss)
748 free(yyss);
749 if (yyvs)
750 free(yyvs);
751 yyss = yyssp = NULL((void *)0);
752 yyvs = yyvsp = NULL((void *)0);
753 yystacksize = 0;
754 return (0);
755}