|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Ed James. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted ! 9: * provided that: (1) source distributions retain this entire copyright ! 10: * notice and comment, and (2) distributions including binaries display ! 11: * the following acknowledgement: ``This product includes software ! 12: * developed by the University of California, Berkeley and its contributors'' ! 13: * in the documentation or other materials provided with the distribution ! 14: * and in all advertising materials mentioning features or use of this ! 15: * software. Neither the name of the University nor the names of its ! 16: * contributors may be used to endorse or promote products derived ! 17: * from this software without specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: /* ! 24: * Copyright (c) 1987 by Ed James, UC Berkeley. All rights reserved. ! 25: * ! 26: * Copy permission is hereby granted provided that this notice is ! 27: * retained on all partial or complete copies. ! 28: * ! 29: * For more info on this and all of my stuff, mail [email protected]. ! 30: */ ! 31: ! 32: %token <ival> HeightOp ! 33: %token <ival> WidthOp ! 34: %token <ival> UpdateOp ! 35: %token <ival> NewplaneOp ! 36: %token <cval> DirOp ! 37: %token <ival> ConstOp ! 38: %token <ival> LineOp ! 39: %token <ival> AirportOp ! 40: %token <ival> BeaconOp ! 41: %token <ival> ExitOp ! 42: %union { ! 43: int ival; ! 44: char cval; ! 45: } ! 46: ! 47: %{ ! 48: #include "include.h" ! 49: ! 50: #ifndef lint ! 51: static char sccsid[] = "@(#)grammar.y 5.2 (Berkeley) 4/30/90"; ! 52: #endif /* not lint */ ! 53: ! 54: int errors = 0; ! 55: int line = 1; ! 56: %} ! 57: ! 58: %% ! 59: file: ! 60: bunch_of_defs { if (checkdefs() < 0) return (errors); } bunch_of_lines ! 61: { ! 62: if (sp->num_exits + sp->num_airports < 2) ! 63: yyerror("Need at least 2 airports and/or exits."); ! 64: return (errors); ! 65: } ! 66: ; ! 67: ! 68: bunch_of_defs: ! 69: def bunch_of_defs ! 70: | def ! 71: ; ! 72: ! 73: def: ! 74: udef ! 75: | ndef ! 76: | wdef ! 77: | hdef ! 78: ; ! 79: ! 80: udef: ! 81: UpdateOp '=' ConstOp ';' ! 82: { ! 83: if (sp->update_secs != 0) ! 84: return (yyerror("Redefinition of 'update'.")); ! 85: else if ($3 < 1) ! 86: return (yyerror("'update' is too small.")); ! 87: else ! 88: sp->update_secs = $3; ! 89: } ! 90: ; ! 91: ! 92: ndef: ! 93: NewplaneOp '=' ConstOp ';' ! 94: { ! 95: if (sp->newplane_time != 0) ! 96: return (yyerror("Redefinition of 'newplane'.")); ! 97: else if ($3 < 1) ! 98: return (yyerror("'newplane' is too small.")); ! 99: else ! 100: sp->newplane_time = $3; ! 101: } ! 102: ; ! 103: ! 104: hdef: ! 105: HeightOp '=' ConstOp ';' ! 106: { ! 107: if (sp->height != 0) ! 108: return (yyerror("Redefinition of 'height'.")); ! 109: else if ($3 < 3) ! 110: return (yyerror("'height' is too small.")); ! 111: else ! 112: sp->height = $3; ! 113: } ! 114: ; ! 115: ! 116: wdef: ! 117: WidthOp '=' ConstOp ';' ! 118: { ! 119: if (sp->height != 0) ! 120: return (yyerror("Redefinition of 'width'.")); ! 121: else if ($3 < 3) ! 122: return (yyerror("'width' is too small.")); ! 123: else ! 124: sp->width = $3; ! 125: } ! 126: ; ! 127: ! 128: bunch_of_lines: ! 129: line bunch_of_lines ! 130: {} ! 131: | line ! 132: {} ! 133: ; ! 134: ! 135: line: ! 136: BeaconOp ':' Bpoint_list ';' ! 137: {} ! 138: | ExitOp ':' Epoint_list ';' ! 139: {} ! 140: | LineOp ':' Lline_list ';' ! 141: {} ! 142: | AirportOp ':' Apoint_list ';' ! 143: {} ! 144: ; ! 145: ! 146: Bpoint_list: ! 147: Bpoint Bpoint_list ! 148: {} ! 149: | Bpoint ! 150: {} ! 151: ; ! 152: ! 153: Bpoint: ! 154: '(' ConstOp ConstOp ')' ! 155: { ! 156: if (sp->num_beacons % REALLOC == 0) { ! 157: if (sp->beacon == NULL) ! 158: sp->beacon = (BEACON *) malloc((sp->num_beacons ! 159: + REALLOC) * sizeof (BEACON)); ! 160: else ! 161: sp->beacon = (BEACON *) realloc(sp->beacon, ! 162: (sp->num_beacons + REALLOC) * ! 163: sizeof (BEACON)); ! 164: if (sp->beacon == NULL) ! 165: return (yyerror("No memory available.")); ! 166: } ! 167: sp->beacon[sp->num_beacons].x = $2; ! 168: sp->beacon[sp->num_beacons].y = $3; ! 169: check_point($2, $3); ! 170: sp->num_beacons++; ! 171: } ! 172: ; ! 173: ! 174: Epoint_list: ! 175: Epoint Epoint_list ! 176: {} ! 177: | Epoint ! 178: {} ! 179: ; ! 180: ! 181: Epoint: ! 182: '(' ConstOp ConstOp DirOp ')' ! 183: { ! 184: int dir; ! 185: ! 186: if (sp->num_exits % REALLOC == 0) { ! 187: if (sp->exit == NULL) ! 188: sp->exit = (EXIT *) malloc((sp->num_exits + ! 189: REALLOC) * sizeof (EXIT)); ! 190: else ! 191: sp->exit = (EXIT *) realloc(sp->exit, ! 192: (sp->num_exits + REALLOC) * ! 193: sizeof (EXIT)); ! 194: if (sp->exit == NULL) ! 195: return (yyerror("No memory available.")); ! 196: } ! 197: dir = dir_no($4); ! 198: sp->exit[sp->num_exits].x = $2; ! 199: sp->exit[sp->num_exits].y = $3; ! 200: sp->exit[sp->num_exits].dir = dir; ! 201: check_edge($2, $3); ! 202: check_edir($2, $3, dir); ! 203: sp->num_exits++; ! 204: } ! 205: ; ! 206: ! 207: Apoint_list: ! 208: Apoint Apoint_list ! 209: {} ! 210: | Apoint ! 211: {} ! 212: ; ! 213: ! 214: Apoint: ! 215: '(' ConstOp ConstOp DirOp ')' ! 216: { ! 217: int dir; ! 218: ! 219: if (sp->num_airports % REALLOC == 0) { ! 220: if (sp->airport == NULL) ! 221: sp->airport=(AIRPORT *)malloc((sp->num_airports ! 222: + REALLOC) * sizeof(AIRPORT)); ! 223: else ! 224: sp->airport = (AIRPORT *) realloc(sp->airport, ! 225: (sp->num_airports + REALLOC) * ! 226: sizeof(AIRPORT)); ! 227: if (sp->airport == NULL) ! 228: return (yyerror("No memory available.")); ! 229: } ! 230: dir = dir_no($4); ! 231: sp->airport[sp->num_airports].x = $2; ! 232: sp->airport[sp->num_airports].y = $3; ! 233: sp->airport[sp->num_airports].dir = dir; ! 234: check_point($2, $3); ! 235: check_adir($2, $3, dir); ! 236: sp->num_airports++; ! 237: } ! 238: ; ! 239: ! 240: Lline_list: ! 241: Lline Lline_list ! 242: {} ! 243: | Lline ! 244: {} ! 245: ; ! 246: ! 247: Lline: ! 248: '[' '(' ConstOp ConstOp ')' '(' ConstOp ConstOp ')' ']' ! 249: { ! 250: if (sp->num_lines % REALLOC == 0) { ! 251: if (sp->line == NULL) ! 252: sp->line = (LINE *) malloc((sp->num_lines + ! 253: REALLOC) * sizeof (LINE)); ! 254: else ! 255: sp->line = (LINE *) realloc(sp->line, ! 256: (sp->num_lines + REALLOC) * ! 257: sizeof (LINE)); ! 258: if (sp->line == NULL) ! 259: return (yyerror("No memory available.")); ! 260: } ! 261: sp->line[sp->num_lines].p1.x = $3; ! 262: sp->line[sp->num_lines].p1.y = $4; ! 263: sp->line[sp->num_lines].p2.x = $7; ! 264: sp->line[sp->num_lines].p2.y = $8; ! 265: check_line($3, $4, $7, $8); ! 266: sp->num_lines++; ! 267: } ! 268: ; ! 269: %% ! 270: ! 271: check_edge(x, y) ! 272: { ! 273: if (!(x == 0) && !(x == sp->width - 1) && ! 274: !(y == 0) && !(y == sp->height - 1)) ! 275: yyerror("edge value not on edge."); ! 276: } ! 277: ! 278: check_point(x, y) ! 279: { ! 280: if (x < 1 || x >= sp->width - 1) ! 281: yyerror("X value out of range."); ! 282: if (y < 1 || y >= sp->height - 1) ! 283: yyerror("Y value out of range."); ! 284: } ! 285: ! 286: check_linepoint(x, y) ! 287: { ! 288: if (x < 0 || x >= sp->width) ! 289: yyerror("X value out of range."); ! 290: if (y < 0 || y >= sp->height) ! 291: yyerror("Y value out of range."); ! 292: } ! 293: ! 294: check_line(x1, y1, x2, y2) ! 295: { ! 296: int d1, d2; ! 297: ! 298: check_linepoint(x1, y1); ! 299: check_linepoint(x2, y2); ! 300: ! 301: d1 = ABS(x2 - x1); ! 302: d2 = ABS(y2 - y1); ! 303: ! 304: if (!(d1 == d2) && !(d1 == 0) && !(d2 == 0)) ! 305: yyerror("Bad line endpoints."); ! 306: } ! 307: ! 308: yyerror(s) ! 309: { ! 310: fprintf(stderr, "\"%s\": line %d: %s\n", file, line, s); ! 311: errors++; ! 312: ! 313: return (errors); ! 314: } ! 315: ! 316: check_edir(x, y, dir) ! 317: { ! 318: int bad = 0; ! 319: ! 320: if (x == sp->width - 1) ! 321: x = 2; ! 322: else if (x != 0) ! 323: x = 1; ! 324: if (y == sp->height - 1) ! 325: y = 2; ! 326: else if (y != 0) ! 327: y = 1; ! 328: ! 329: switch (x * 10 + y) { ! 330: case 00: if (dir != 3) bad++; break; ! 331: case 01: if (dir < 1 || dir > 3) bad++; break; ! 332: case 02: if (dir != 1) bad++; break; ! 333: case 10: if (dir < 3 || dir > 5) bad++; break; ! 334: case 11: break; ! 335: case 12: if (dir > 1 && dir < 7) bad++; break; ! 336: case 20: if (dir != 5) bad++; break; ! 337: case 21: if (dir < 5) bad++; break; ! 338: case 22: if (dir != 7) bad++; break; ! 339: default: ! 340: yyerror("Unknown value in checkdir! Get help!"); ! 341: break; ! 342: } ! 343: if (bad) ! 344: yyerror("Bad direction for entrance at exit."); ! 345: } ! 346: ! 347: check_adir(x, y, dir) ! 348: { ! 349: } ! 350: ! 351: checkdefs() ! 352: { ! 353: int err = 0; ! 354: ! 355: if (sp->width == 0) { ! 356: yyerror("'width' undefined."); ! 357: err++; ! 358: } ! 359: if (sp->height == 0) { ! 360: yyerror("'height' undefined."); ! 361: err++; ! 362: } ! 363: if (sp->update_secs == 0) { ! 364: yyerror("'update' undefined."); ! 365: err++; ! 366: } ! 367: if (sp->newplane_time == 0) { ! 368: yyerror("'newplane' undefined."); ! 369: err++; ! 370: } ! 371: if (err) ! 372: return (-1); ! 373: else ! 374: return (0); ! 375: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.