Annotation of 42BSD/ucb/pascal/src/main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.