Annotation of 3BSD/cmd/pi/main.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: #
                      3: /*
                      4:  * pi - Pascal interpreter code translator
                      5:  *
                      6:  * Charles Haley, Bill Joy UCB
                      7:  * Version 1.2 November 1978
                      8:  */
                      9: 
                     10: #include "whoami"
                     11: #include "0.h"
                     12: #include "yy.h"
                     13: 
                     14: /*
                     15:  * This version of pi has been in use at Berkeley since May 1977
                     16:  * and is very stable, except for the syntactic error recovery which
                     17:  * has just been written.  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: 
                     26: char   *usageis        = piusage;
                     27: char   *obj            = "obj";
                     28: 
                     29: #ifdef PPC
                     30:     char       *ppcname = "ppc.p1";
                     31: #   ifdef DEBUG
                     32:        char    *ppcdname = "ppcd.p1";
                     33: #   endif
                     34: #endif
                     35: #ifdef PTREE
                     36:     char       *pTreeName = "pi.pTree";
                     37: #endif
                     38: 
                     39: /*
                     40:  * Be careful changing errfile and howfile.
                     41:  * There are the "magic" constants 9 and 15 immediately below.
                     42:  */
                     43: char   *errfile        = "/usr/lib/pi1.2strings";
                     44: char   *howfile        = "/usr/lib/how_pi\0";
                     45: 
                     46: int    onintr();
                     47: 
                     48: extern char *lastname;
                     49: 
                     50: FILE   *ibuf;
                     51: 
                     52: /*
                     53:  * these are made real variables
                     54:  * so they can be changed
                     55:  * if you are compiling on a smaller machine
                     56:  */
                     57: double MAXINT  =  2147483647.;
                     58: double MININT  = -2147483648.;
                     59: 
                     60: /*
                     61:  * Main program for pi.
                     62:  * Process options, then call yymain
                     63:  * to do all the real work.
                     64:  */
                     65: main(argc, argv)
                     66:        int argc;
                     67:        char *argv[];
                     68: {
                     69:        register char *cp;
                     70:        register c;
                     71:        int i;
                     72: 
                     73:        if (argv[0][0] == 'a')
                     74:                errfile += 9, howfile += 9;
                     75:        if (argv[0][0] == '-' && argv[0][1] == 'o') {
                     76:                obj = &argv[0][2];
                     77:                usageis = pixusage;
                     78:                howfile[15] = 'x';
                     79:                ofil = 3;
                     80:        } else {
                     81:                ofil = creat(obj, 0755);
                     82:                if (ofil < 0) {
                     83:                        perror(obj);
                     84:                        pexit(NOSTART);
                     85:                }
                     86:        }
                     87:        argv++, argc--;
                     88:        if (argc == 0) {
                     89:                i = fork();
                     90:                if (i == -1)
                     91:                        goto usage;
                     92:                if (i == 0) {
                     93:                        execl("/bin/cat", "cat", howfile, 0);
                     94:                        goto usage;
                     95:                }
                     96:                while (wait(&i) != -1)
                     97:                        continue;
                     98:                pexit(NOSTART);
                     99:        }
                    100:        opt('p') = opt('t') = opt('b') = 1;
                    101:        while (argc > 0) {
                    102:                cp = argv[0];
                    103:                if (*cp++ != '-')
                    104:                        break;
                    105:                while (c = *cp++) switch (c) {
                    106: #ifdef DEBUG
                    107:                        case 'c':
                    108:                        case 'r':
                    109:                        case 'y':
                    110:                                togopt(c);
                    111:                                continue;
                    112:                        case 'C':
                    113:                                yycosts();
                    114:                                pexit(NOSTART);
                    115:                        case 'A':
                    116:                                testtrace++;
                    117:                        case 'F':
                    118:                                fulltrace++;
                    119:                        case 'E':
                    120:                                errtrace++;
                    121:                                opt('r')++;
                    122:                                continue;
                    123:                        case 'U':
                    124:                                yyunique = 0;
                    125:                                continue;
                    126: #                      ifdef PPC
                    127:                            case 'P':
                    128:                                ppcdebug++;
                    129:                                continue;
                    130: #                      endif
                    131: #endif
                    132:                        case 'b':
                    133:                                opt('b') = 2;
                    134:                                continue;
                    135:                        case 'i':
                    136:                                pflist = argv + 1;
                    137:                                pflstc = 0;
                    138:                                while (argc > 1) {
                    139:                                        if (dotted(argv[1], 'p'))
                    140:                                                break;
                    141:                                        pflstc++, argc--, argv++;
                    142:                                }
                    143:                                if (pflstc == 0)
                    144:                                        goto usage;
                    145:                                continue;
                    146:                        case 'l':
                    147:                        case 'n':
                    148:                        case 'p':
                    149:                        case 's':
                    150:                        case 't':
                    151:                        case 'u':
                    152:                        case 'w':
                    153:                                togopt(c);
                    154:                                continue;
                    155:                        case 'z':
                    156:                                monflg++;
                    157:                                continue;
                    158:                        default:
                    159: usage:
                    160:                                Perror( "Usage", usageis);
                    161:                                pexit(NOSTART);
                    162:                }
                    163:                argc--, argv++;
                    164:        }
                    165:        if (argc != 1)
                    166:                goto usage;
                    167:        efil = open ( errfile, 0 );
                    168:        if ( efil < 0 )
                    169:                perror(errfile), pexit(NOSTART);
                    170:        filename = argv[0];
                    171:        if (!dotted(filename, 'p')) {
                    172:                Perror(filename, "Name must end in '.p'");
                    173:                pexit(NOSTART);
                    174:        }
                    175:        close(0);
                    176:        if ( ( ibuf = fopen ( filename , "r" ) ) == NULL )
                    177:                perror(filename), pexit(NOSTART);
                    178:        ibp = ibuf;
                    179: #      ifdef PPC
                    180:            if ( ( ppcstream = fopen( ppcname , "w" ) ) == NULL ) {
                    181:                perror( ppcname );
                    182:                pexit( NOSTART );
                    183:            }
                    184: #          ifdef DEBUG
                    185:                if ( ppcdebug ) {
                    186:                    if ( ( ppcdstream = fopen( ppcdname , "w" ) ) == NULL ) {
                    187:                        perror( ppcdname );
                    188:                        pexit( NOSTART );
                    189:                    }
                    190:                }
                    191: #          endif
                    192:            putprintf( "#               compilation of %s" , filename );
                    193: #      endif
                    194: #      ifdef PTREE
                    195: #          define      MAXpPAGES       16
                    196:            if ( ! pCreate( pTreeName , MAXpPAGES ) ) {
                    197:                perror( pTreeName );
                    198:                pexit( NOSTART );
                    199:            }
                    200: #      endif
                    201:        if ((signal(2, 1) & 01) == 0)
                    202:                signal(2, onintr);
                    203:        if (opt('l')) {
                    204:                opt('n')++;
                    205:                yysetfile(filename);
                    206:                opt('n')--;
                    207:        } else
                    208:                lastname = filename;
                    209:        yymain();
                    210:        /* No return */
                    211: }
                    212: 
                    213: pchr(c)
                    214:        char c;
                    215: {
                    216: 
                    217:        putc ( c , stdout );
                    218: }
                    219: 
                    220: char   ugh[]   = "Fatal error in pi\n";
                    221: /*
                    222:  * Exit from the Pascal system.
                    223:  * We throw in an ungraceful termination
                    224:  * message if c > 1 indicating a severe
                    225:  * error such as running out of memory
                    226:  * or an internal inconsistency.
                    227:  */
                    228: pexit(c)
                    229:        int c;
                    230: {
                    231: 
                    232:        if (opt('l') && c != DIED && c != NOSTART)
                    233:                while (getline() != -1)
                    234:                        continue;
                    235:        yyflush();
                    236:        switch (c) {
                    237:                case DIED:
                    238:                        write(2, ugh, sizeof ugh);
                    239:                case NOSTART:
                    240:                case ERRS:
                    241:                        if (ofil > 0)
                    242:                                unlink(obj);
                    243:                        break;
                    244:                case AOK:
                    245:                        pflush();
                    246:                        break;
                    247:        }
                    248:        /*
                    249:         *      this to gather statistics on programs being compiled
                    250:         *      taken 20 june 79        ... peter
                    251:         *
                    252:         *  if (fork() == 0) {
                    253:         *      char *cp = "-0";
                    254:         *      cp[1] += c;
                    255:         *      execl("/usr/lib/gather", "gather", cp, filename, 0);
                    256:         *      exit(1);
                    257:         *  }
                    258:         */
                    259: #      ifdef PTREE
                    260:            pFinish();
                    261: #      endif
                    262:        exit(c);
                    263: }
                    264: 
                    265: onintr()
                    266: {
                    267: 
                    268:        signal(2, 1);
                    269:        pexit(NOSTART);
                    270: }
                    271: 
                    272: /*
                    273:  * Get an error message from the error message file
                    274:  */
                    275: geterr(seekpt, buf)
                    276:        int seekpt;
                    277:        char *buf;
                    278: {
                    279: 
                    280:        lseek(efil, (long) seekpt, 0);
                    281:        if (read(efil, buf, 256) <= 0)
                    282:                perror(errfile), pexit(DIED);
                    283: }
                    284: 
                    285: header()
                    286: {
                    287:        extern char version[];
                    288:        static char anyheaders;
                    289: 
                    290:        gettime( filename );
                    291:        if (anyheaders && opt('n'))
                    292:                putc( '\f' , stdout );
                    293:        anyheaders++;
                    294:        printf("Berkeley Pascal PI -- Version 1.2 (%s)\n\n%s  %s\n\n",
                    295:                version, myctime(&tvec), filename);
                    296: }

unix.superglobalmegacorp.com

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