|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Robert Paul Corbett. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: char copyright[] = ! 25: "@(#) Copyright (c) 1989 The Regents of the University of California.\n\ ! 26: All rights reserved.\n"; ! 27: #endif /* not lint */ ! 28: ! 29: #ifndef lint ! 30: static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 6/1/90"; ! 31: #endif /* not lint */ ! 32: ! 33: #include <signal.h> ! 34: #include "defs.h" ! 35: ! 36: char dflag; ! 37: char lflag; ! 38: char tflag; ! 39: char vflag; ! 40: ! 41: char *prefix = "y"; ! 42: char *myname = "yacc"; ! 43: char *temp_form = "yacc.XXXXXXX"; ! 44: ! 45: int lineno; ! 46: int outline; ! 47: ! 48: char *action_file_name; ! 49: char *defines_file_name; ! 50: char *input_file_name = ""; ! 51: char *output_file_name; ! 52: char *text_file_name; ! 53: char *union_file_name; ! 54: char *verbose_file_name; ! 55: ! 56: FILE *action_file; /* a temp file, used to save actions associated */ ! 57: /* with rules until the parser is written */ ! 58: FILE *defines_file; /* y.tab.h */ ! 59: FILE *input_file; /* the input file */ ! 60: FILE *output_file; /* y.tab.c */ ! 61: FILE *text_file; /* a temp file, used to save text until all */ ! 62: /* symbols have been defined */ ! 63: FILE *union_file; /* a temp file, used to save the union */ ! 64: /* definition until all symbol have been */ ! 65: /* defined */ ! 66: FILE *verbose_file; /* y.output */ ! 67: ! 68: int nitems; ! 69: int nrules; ! 70: int nsyms; ! 71: int ntokens; ! 72: int nvars; ! 73: ! 74: int start_symbol; ! 75: char **symbol_name; ! 76: short *symbol_value; ! 77: short *symbol_prec; ! 78: char *symbol_assoc; ! 79: ! 80: short *ritem; ! 81: short *rlhs; ! 82: short *rrhs; ! 83: short *rprec; ! 84: char *rassoc; ! 85: short **derives; ! 86: char *nullable; ! 87: ! 88: extern char *mktemp(); ! 89: extern char *getenv(); ! 90: ! 91: ! 92: done(k) ! 93: int k; ! 94: { ! 95: if (action_file) { fclose(action_file); unlink(action_file_name); } ! 96: if (text_file) { fclose(text_file); unlink(text_file_name); } ! 97: if (union_file) { fclose(union_file); unlink(union_file_name); } ! 98: exit(k); ! 99: } ! 100: ! 101: ! 102: onintr() ! 103: { ! 104: done(1); ! 105: } ! 106: ! 107: ! 108: set_signals() ! 109: { ! 110: #ifdef SIGINT ! 111: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 112: signal(SIGINT, onintr); ! 113: #endif ! 114: #ifdef SIGTERM ! 115: if (signal(SIGTERM, SIG_IGN) != SIG_IGN) ! 116: signal(SIGTERM, onintr); ! 117: #endif ! 118: #ifdef SIGHUP ! 119: if (signal(SIGHUP, SIG_IGN) != SIG_IGN) ! 120: signal(SIGHUP, onintr); ! 121: #endif ! 122: } ! 123: ! 124: ! 125: usage() ! 126: { ! 127: fprintf(stderr, "usage: %s [-dltv] [-b prefix] filename\n", myname); ! 128: exit(1); ! 129: } ! 130: ! 131: ! 132: getargs(argc, argv) ! 133: int argc; ! 134: char *argv[]; ! 135: { ! 136: register int i; ! 137: register char *s; ! 138: ! 139: if (argc > 0) myname = argv[0]; ! 140: for (i = 1; i < argc; ++i) ! 141: { ! 142: s = argv[i]; ! 143: if (*s != '-') break; ! 144: switch (*++s) ! 145: { ! 146: case '\0': ! 147: input_file = stdin; ! 148: if (i + 1 < argc) usage(); ! 149: return; ! 150: ! 151: case '_': ! 152: ++i; ! 153: goto no_more_options; ! 154: ! 155: case 'b': ! 156: if (*++s || ++i >= argc) usage(); ! 157: prefix = argv[i]; ! 158: continue; ! 159: ! 160: case 'd': ! 161: dflag = 1; ! 162: break; ! 163: ! 164: case 'l': ! 165: lflag = 1; ! 166: break; ! 167: ! 168: case 't': ! 169: tflag = 1; ! 170: break; ! 171: ! 172: case 'v': ! 173: vflag = 1; ! 174: break; ! 175: ! 176: default: ! 177: usage(); ! 178: } ! 179: ! 180: for (;;) ! 181: { ! 182: switch (*++s) ! 183: { ! 184: case '\0': ! 185: goto end_of_option; ! 186: ! 187: case 'd': ! 188: dflag = 1; ! 189: break; ! 190: ! 191: case 'l': ! 192: lflag = 1; ! 193: break; ! 194: ! 195: case 't': ! 196: tflag = 1; ! 197: break; ! 198: ! 199: case 'v': ! 200: vflag = 1; ! 201: break; ! 202: ! 203: default: ! 204: usage(); ! 205: } ! 206: } ! 207: end_of_option:; ! 208: } ! 209: ! 210: no_more_options:; ! 211: if (i + 1 != argc) usage(); ! 212: input_file_name = argv[i]; ! 213: } ! 214: ! 215: ! 216: char * ! 217: allocate(n) ! 218: unsigned n; ! 219: { ! 220: register char *p; ! 221: ! 222: p = calloc((unsigned) 1, n); ! 223: if (!p) no_space(); ! 224: return (p); ! 225: } ! 226: ! 227: ! 228: create_file_names() ! 229: { ! 230: int i, len; ! 231: char *tmpdir; ! 232: ! 233: tmpdir = getenv("TMPDIR"); ! 234: if (tmpdir == 0) tmpdir = "/tmp"; ! 235: ! 236: len = strlen(tmpdir); ! 237: i = len + 13; ! 238: if (len && tmpdir[len-1] != '/') ! 239: ++i; ! 240: ! 241: action_file_name = MALLOC(i); ! 242: if (action_file_name == 0) no_space(); ! 243: text_file_name = MALLOC(i); ! 244: if (text_file_name == 0) no_space(); ! 245: union_file_name = MALLOC(i); ! 246: if (union_file_name == 0) no_space(); ! 247: ! 248: strcpy(action_file_name, tmpdir); ! 249: strcpy(text_file_name, tmpdir); ! 250: strcpy(union_file_name, tmpdir); ! 251: ! 252: if (len && tmpdir[len - 1] != '/') ! 253: { ! 254: action_file_name[len] = '/'; ! 255: text_file_name[len] = '/'; ! 256: union_file_name[len] = '/'; ! 257: ++len; ! 258: } ! 259: ! 260: strcpy(action_file_name + len, temp_form); ! 261: strcpy(text_file_name + len, temp_form); ! 262: strcpy(union_file_name + len, temp_form); ! 263: ! 264: action_file_name[len + 5] = 'a'; ! 265: text_file_name[len + 5] = 't'; ! 266: union_file_name[len + 5] = 'u'; ! 267: ! 268: mktemp(action_file_name); ! 269: mktemp(text_file_name); ! 270: mktemp(union_file_name); ! 271: ! 272: len = strlen(prefix); ! 273: if (dflag) ! 274: { ! 275: /* the number 7 below is the size of ".tab.h"; sizeof is not used */ ! 276: /* because of a C compiler that thinks sizeof(".tab.h") == 6 */ ! 277: defines_file_name = MALLOC(len + 7); ! 278: if (defines_file_name == 0) no_space(); ! 279: strcpy(defines_file_name, prefix); ! 280: strcpy(defines_file_name + len, DEFINES_SUFFIX); ! 281: } ! 282: ! 283: output_file_name = MALLOC(len + 7); ! 284: if (output_file_name == 0) no_space(); ! 285: strcpy(output_file_name, prefix); ! 286: strcpy(output_file_name + len, OUTPUT_SUFFIX); ! 287: ! 288: if (vflag) ! 289: { ! 290: verbose_file_name = MALLOC(len + 8); ! 291: if (verbose_file_name == 0) no_space(); ! 292: strcpy(verbose_file_name, prefix); ! 293: strcpy(verbose_file_name + len, VERBOSE_SUFFIX); ! 294: } ! 295: } ! 296: ! 297: ! 298: open_files() ! 299: { ! 300: create_file_names(); ! 301: ! 302: if (input_file == 0) ! 303: { ! 304: input_file = fopen(input_file_name, "r"); ! 305: if (input_file == 0) open_error(input_file_name); ! 306: } ! 307: ! 308: action_file = fopen(action_file_name, "w"); ! 309: if (action_file == 0) open_error(action_file_name); ! 310: ! 311: text_file = fopen(text_file_name, "w"); ! 312: if (text_file == 0) open_error(text_file_name); ! 313: ! 314: if (vflag) ! 315: { ! 316: verbose_file = fopen(verbose_file_name, "w"); ! 317: if (verbose_file == 0) open_error(verbose_file_name); ! 318: } ! 319: ! 320: if (dflag) ! 321: { ! 322: defines_file = fopen(defines_file_name, "w"); ! 323: if (defines_file == 0) open_error(defines_file_name); ! 324: union_file = fopen(union_file_name, "w"); ! 325: if (union_file == 0) open_error(union_file_name); ! 326: } ! 327: ! 328: output_file = fopen(output_file_name, "w"); ! 329: if (output_file == 0) open_error(output_file_name); ! 330: } ! 331: ! 332: ! 333: int ! 334: main(argc, argv) ! 335: int argc; ! 336: char *argv[]; ! 337: { ! 338: set_signals(); ! 339: getargs(argc, argv); ! 340: open_files(); ! 341: reader(); ! 342: lr0(); ! 343: lalr(); ! 344: make_parser(); ! 345: verbose(); ! 346: output(); ! 347: done(0); ! 348: /*NOTREACHED*/ ! 349: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.