Annotation of 3BSD/cmd/pi/main.c, revision 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.