|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)main.c 1.1 8/27/80"; ! 4: ! 5: #include "whoami.h" ! 6: #include "0.h" ! 7: #include "yy.h" ! 8: #include <signal.h> ! 9: #include "objfmt.h" ! 10: ! 11: /* ! 12: * This version of pi has been in use at Berkeley since May 1977 ! 13: * and is very stable, except for the syntactic error recovery which ! 14: * has just been written. Please report any problems with the error ! 15: * recovery to the second author at the address given in the file ! 16: * READ_ME. The second author takes full responsibility for any bugs ! 17: * in the syntactic error recovery. ! 18: */ ! 19: ! 20: char piusage[] = "pi [ -blnpstuw ] [ -i file ... ] name.p"; ! 21: char pixusage[] = "pix [ -blnpstuw ] [ -i file ... ] name.p [ arg ... ]"; ! 22: char pcusage[] = "pc [ options ] [ -o file ] [ -i file ... ] name.p"; ! 23: ! 24: char *usageis = piusage; ! 25: ! 26: char *errfile = ERR_STRNGS; ! 27: ! 28: #ifdef OBJ ! 29: char *obj = "obj"; ! 30: #endif OBJ ! 31: #ifdef PC ! 32: char *pcname = "pc.pc1"; ! 33: #endif PC ! 34: #ifdef PTREE ! 35: char *pTreeName = "pi.pTree"; ! 36: #endif PTREE ! 37: ! 38: /* ! 39: * Be careful changing errfile and howfile. ! 40: * There are the "magic" constants 9 and 15 immediately below. ! 41: * errfile is now defined by ERR_STRNGS, in objfmt.h, ! 42: * and its leading path name length is ERR_PATHLEN long. ! 43: * this for executing out of the current directory if running as `a.something'. ! 44: */ ! 45: #ifdef OBJ ! 46: char *howfile = "/usr/lib/how_pi\0"; ! 47: #endif OBJ ! 48: #ifdef PC ! 49: char *howfile = "/usr/lib/how_pc"; ! 50: #endif PC ! 51: ! 52: int onintr(); ! 53: ! 54: extern char *lastname; ! 55: ! 56: FILE *ibuf; ! 57: FILE *pcstream = NULL; ! 58: ! 59: /* ! 60: * these are made real variables ! 61: * so they can be changed ! 62: * if you are compiling on a smaller machine ! 63: */ ! 64: double MAXINT = 2147483647.; ! 65: double MININT = -2147483648.; ! 66: ! 67: /* ! 68: * Main program for pi. ! 69: * Process options, then call yymain ! 70: * to do all the real work. ! 71: */ ! 72: main(argc, argv) ! 73: int argc; ! 74: char *argv[]; ! 75: { ! 76: register char *cp; ! 77: register c; ! 78: int i; ! 79: ! 80: if (argv[0][0] == 'a') ! 81: errfile += ERR_PATHLEN , howfile += 9; ! 82: # ifdef OBJ ! 83: if (argv[0][0] == '-' && argv[0][1] == 'o') { ! 84: obj = &argv[0][2]; ! 85: usageis = pixusage; ! 86: howfile[15] = 'x'; ! 87: ofil = 3; ! 88: } else { ! 89: ofil = creat(obj, 0755); ! 90: if (ofil < 0) { ! 91: perror(obj); ! 92: pexit(NOSTART); ! 93: } ! 94: } ! 95: # endif OBJ ! 96: argv++, argc--; ! 97: if (argc == 0) { ! 98: i = fork(); ! 99: if (i == -1) ! 100: goto usage; ! 101: if (i == 0) { ! 102: execl("/bin/cat", "cat", howfile, 0); ! 103: goto usage; ! 104: } ! 105: while (wait(&i) != -1) ! 106: continue; ! 107: pexit(NOSTART); ! 108: } ! 109: # ifdef OBJ ! 110: opt('p') = opt('t') = opt('b') = 1; ! 111: while (argc > 0) { ! 112: cp = argv[0]; ! 113: if (*cp++ != '-') ! 114: break; ! 115: while (c = *cp++) switch (c) { ! 116: #ifdef DEBUG ! 117: case 'k': ! 118: case 'r': ! 119: case 'y': ! 120: togopt(c); ! 121: continue; ! 122: case 'K': ! 123: yycosts(); ! 124: pexit(NOSTART); ! 125: case 'A': ! 126: testtrace++; ! 127: case 'F': ! 128: fulltrace++; ! 129: case 'E': ! 130: errtrace++; ! 131: opt('r')++; ! 132: continue; ! 133: case 'U': ! 134: yyunique = 0; ! 135: continue; ! 136: #endif ! 137: case 'b': ! 138: opt('b') = 2; ! 139: continue; ! 140: case 'i': ! 141: pflist = argv + 1; ! 142: pflstc = 0; ! 143: while (argc > 1) { ! 144: if (dotted(argv[1], 'p')) ! 145: break; ! 146: pflstc++, argc--, argv++; ! 147: } ! 148: if (pflstc == 0) ! 149: goto usage; ! 150: continue; ! 151: case 'l': ! 152: case 'n': ! 153: case 'p': ! 154: case 's': ! 155: case 't': ! 156: case 'u': ! 157: case 'w': ! 158: togopt(c); ! 159: continue; ! 160: case 'z': ! 161: monflg++; ! 162: continue; ! 163: default: ! 164: usage: ! 165: Perror( "Usage", usageis); ! 166: pexit(NOSTART); ! 167: } ! 168: argc--, argv++; ! 169: } ! 170: # endif OBJ ! 171: # ifdef PC ! 172: opt( 'b' ) = 1; ! 173: opt( 'g' ) = 0; ! 174: opt( 't' ) = 0; ! 175: opt( 'p' ) = 0; ! 176: usageis = pcusage; ! 177: while ( argc > 0 ) { ! 178: cp = argv[0]; ! 179: if ( *cp++ != '-' ) { ! 180: break; ! 181: } ! 182: c = *cp++; ! 183: switch( c ) { ! 184: #ifdef DEBUG ! 185: case 'k': ! 186: case 'r': ! 187: case 'y': ! 188: togopt(c); ! 189: break; ! 190: case 'K': ! 191: yycosts(); ! 192: pexit(NOSTART); ! 193: case 'A': ! 194: testtrace++; ! 195: /* and fall through */ ! 196: case 'F': ! 197: fulltrace++; ! 198: /* and fall through */ ! 199: case 'E': ! 200: errtrace++; ! 201: opt('r')++; ! 202: break; ! 203: case 'U': ! 204: yyunique = 0; ! 205: break; ! 206: #endif ! 207: case 'b': ! 208: opt('b') = 2; ! 209: break; ! 210: case 'i': ! 211: pflist = argv + 1; ! 212: pflstc = 0; ! 213: while (argc > 1) { ! 214: if (dotted(argv[1], 'p')) ! 215: break; ! 216: pflstc++, argc--, argv++; ! 217: } ! 218: if (pflstc == 0) ! 219: goto usage; ! 220: break; ! 221: /* ! 222: * output file for the first pass ! 223: */ ! 224: case 'o': ! 225: if ( argc < 2 ) { ! 226: goto usage; ! 227: } ! 228: argv++; ! 229: argc--; ! 230: pcname = argv[0]; ! 231: break; ! 232: case 'C': ! 233: /* ! 234: * since -t is an ld switch, use -C ! 235: * to turn on tests ! 236: */ ! 237: togopt( 't' ); ! 238: break; ! 239: case 'g': ! 240: /* ! 241: * sdb symbol table ! 242: */ ! 243: togopt( 'g' ); ! 244: break; ! 245: case 'l': ! 246: case 's': ! 247: case 'u': ! 248: case 'w': ! 249: togopt(c); ! 250: break; ! 251: case 'p': ! 252: /* ! 253: * -p on the command line means profile ! 254: */ ! 255: profflag++; ! 256: break; ! 257: case 'z': ! 258: monflg++; ! 259: break; ! 260: default: ! 261: usage: ! 262: Perror( "Usage", usageis); ! 263: pexit(NOSTART); ! 264: } ! 265: argc--; ! 266: argv++; ! 267: } ! 268: # endif PC ! 269: if (argc != 1) ! 270: goto usage; ! 271: efil = open ( errfile, 0 ); ! 272: if ( efil < 0 ) ! 273: perror(errfile), pexit(NOSTART); ! 274: filename = argv[0]; ! 275: if (!dotted(filename, 'p')) { ! 276: Perror(filename, "Name must end in '.p'"); ! 277: pexit(NOSTART); ! 278: } ! 279: close(0); ! 280: if ( ( ibuf = fopen( filename , "r" ) ) == NULL ) ! 281: perror(filename), pexit(NOSTART); ! 282: ibp = ibuf; ! 283: # ifdef PC ! 284: if ( ( pcstream = fopen( pcname , "w" ) ) == NULL ) { ! 285: perror( pcname ); ! 286: pexit( NOSTART ); ! 287: } ! 288: stabsource( filename ); ! 289: # endif PC ! 290: # ifdef PTREE ! 291: # define MAXpPAGES 16 ! 292: if ( ! pCreate( pTreeName , MAXpPAGES ) ) { ! 293: perror( pTreeName ); ! 294: pexit( NOSTART ); ! 295: } ! 296: # endif PTREE ! 297: if ( signal( SIGINT , SIG_IGN ) != SIG_IGN ) ! 298: signal( SIGINT , onintr ); ! 299: if (opt('l')) { ! 300: opt('n')++; ! 301: yysetfile(filename); ! 302: opt('n')--; ! 303: } ! 304: yymain(); ! 305: /* No return */ ! 306: } ! 307: ! 308: pchr(c) ! 309: char c; ! 310: { ! 311: ! 312: putc ( c , stdout ); ! 313: } ! 314: ! 315: char ugh[] = "Fatal error in pi\n"; ! 316: /* ! 317: * Exit from the Pascal system. ! 318: * We throw in an ungraceful termination ! 319: * message if c > 1 indicating a severe ! 320: * error such as running out of memory ! 321: * or an internal inconsistency. ! 322: */ ! 323: pexit(c) ! 324: int c; ! 325: { ! 326: ! 327: if (opt('l') && c != DIED && c != NOSTART) ! 328: while (getline() != -1) ! 329: continue; ! 330: yyflush(); ! 331: switch (c) { ! 332: case DIED: ! 333: write(2, ugh, sizeof ugh); ! 334: case NOSTART: ! 335: case ERRS: ! 336: # ifdef OBJ ! 337: if (ofil > 0) ! 338: unlink(obj); ! 339: # endif OBJ ! 340: # ifdef PC ! 341: if ( pcstream != NULL ) { ! 342: unlink( pcname ); ! 343: } ! 344: # endif PC ! 345: break; ! 346: case AOK: ! 347: # ifdef OBJ ! 348: pflush(); ! 349: # endif OBJ ! 350: # ifdef PC ! 351: puteof(); ! 352: # endif PC ! 353: break; ! 354: } ! 355: /* ! 356: * this to gather statistics on programs being compiled ! 357: * taken 20 june 79 ... peter ! 358: * ! 359: * if (fork() == 0) { ! 360: * char *cp = "-0"; ! 361: * cp[1] += c; ! 362: * execl("/usr/lib/gather", "gather", cp, filename, 0); ! 363: * exit(1); ! 364: * } ! 365: */ ! 366: # ifdef PTREE ! 367: pFinish(); ! 368: # endif ! 369: exit(c); ! 370: } ! 371: ! 372: onintr() ! 373: { ! 374: ! 375: signal( SIGINT , SIG_IGN ); ! 376: pexit(NOSTART); ! 377: } ! 378: ! 379: /* ! 380: * Get an error message from the error message file ! 381: */ ! 382: geterr(seekpt, buf) ! 383: int seekpt; ! 384: char *buf; ! 385: { ! 386: ! 387: lseek(efil, (long) seekpt, 0); ! 388: if (read(efil, buf, 256) <= 0) ! 389: perror(errfile), pexit(DIED); ! 390: } ! 391: ! 392: header() ! 393: { ! 394: extern char version[]; ! 395: static char anyheaders; ! 396: ! 397: gettime( filename ); ! 398: if (anyheaders && opt('n')) ! 399: putc( '\f' , stdout ); ! 400: anyheaders++; ! 401: # ifdef OBJ ! 402: printf("Berkeley Pascal PI -- Version 2.0 (%s)\n\n%s %s\n\n", ! 403: version, myctime(&tvec), filename); ! 404: # endif OBJ ! 405: # ifdef PC ! 406: printf("Berkeley Pascal PC -- Version 2.0 (%s)\n\n%s %s\n\n", ! 407: version, myctime(&tvec), filename); ! 408: # endif PC ! 409: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.