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

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

unix.superglobalmegacorp.com

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