148112Sbostic /*-
2*62195Sbostic * Copyright (c) 1980, 1993
3*62195Sbostic * The Regents of the University of California. All rights reserved.
448112Sbostic *
548112Sbostic * %sccs.include.redist.c%
622245Sdist */
722245Sdist
822245Sdist #ifndef lint
9*62195Sbostic static char sccsid[] = "@(#)yymain.c 8.1 (Berkeley) 06/06/93";
1048112Sbostic #endif /* not lint */
1122245Sdist
1222245Sdist /*
132870Speter * pi - Pascal interpreter code translator
142870Speter *
152870Speter * Charles Haley, Bill Joy UCB
162870Speter * Version 1.2 November 1978
172870Speter *
182870Speter *
192870Speter * pxp - Pascal execution profiler
202870Speter *
212870Speter * Bill Joy UCB
222870Speter * Version 1.2 November 1978
232870Speter */
242870Speter
2512391Speter #include "whoami.h"
262870Speter #include "0.h"
272870Speter #include "yy.h"
282870Speter
292870Speter int line = 1;
302870Speter
312870Speter /*
322870Speter * Yymain initializes each of the utility
332870Speter * clusters and then starts the processing
342870Speter * by calling yyparse.
352870Speter */
yymain()362870Speter yymain()
372870Speter {
382870Speter
392870Speter /*
402870Speter * Initialize the scanner
412870Speter */
422870Speter #ifdef PXP
432870Speter if (bracket == 0) {
442870Speter #endif
452870Speter if (getline() == -1) {
462870Speter Perror(filename, "No lines in file");
472870Speter pexit(NOSTART);
482870Speter }
492870Speter #ifdef PXP
502870Speter } else
512870Speter yyline = 0;
522870Speter #endif
532870Speter
542870Speter #ifdef PI
552870Speter magic();
562870Speter
572870Speter #endif
582870Speter /*
592870Speter * Initialize the clusters
602870Speter *
612870Speter initstring();
622870Speter */
632870Speter inithash();
642870Speter inittree();
652870Speter #ifdef PI
662870Speter initnl();
672870Speter #endif
682870Speter
692870Speter /*
702870Speter * Process the input
712870Speter */
722870Speter yyparse();
732870Speter #ifdef PI
742870Speter magic2();
752870Speter #ifdef DEBUG
762870Speter dumpnl(0);
772870Speter #endif
782870Speter #endif
792870Speter #ifdef PXP
802870Speter prttab();
812870Speter if (onefile) {
822870Speter extern int outcol;
832870Speter
842870Speter if (outcol)
852870Speter putchar('\n');
862870Speter flush();
872870Speter if (eflg) {
882870Speter writef(2, "File not rewritten because of errors\n");
892870Speter pexit(ERRS);
902870Speter }
912870Speter signal(1, 1);
922870Speter signal(2, 1);
932870Speter copyfile();
942870Speter }
952870Speter #endif
962870Speter pexit(eflg ? ERRS : AOK);
972870Speter }
982870Speter
992870Speter #ifdef PXP
copyfile()1002870Speter copyfile()
1012870Speter {
1022870Speter register int c;
1032870Speter char buf[BUFSIZ];
1042870Speter
1052870Speter if (freopen(stdoutn, "r", stdin) == NULL) {
1062870Speter perror(stdoutn);
1072870Speter pexit(ERRS);
1082870Speter }
1092870Speter if (freopen(firstname, "w", stdout) == NULL) {
1102870Speter perror(firstname);
1112870Speter pexit(ERRS);
1122870Speter }
1132870Speter while ((c = getchar()) > 0)
1142870Speter putchar(c);
1152870Speter if (ferror(stdout))
1162870Speter perror(stdout);
1172870Speter }
1182870Speter #endif
1192870Speter
1202870Speter static
1212870Speter struct {
1222870Speter int magic;
1232870Speter unsigned txt_size;
1242870Speter unsigned data_size;
1252870Speter unsigned bss_size;
1262870Speter unsigned syms_size;
1272870Speter unsigned entry_point;
1282870Speter unsigned tr_size;
1292870Speter unsigned dr_size;
1302870Speter } header;
1312870Speter
1322870Speter #ifdef PI
magic()1332870Speter magic()
1342870Speter {
1352870Speter
1362870Speter /*
1372870Speter * this is the size of /usr/lib/npxheader
1382870Speter */
1392870Speter #define HEAD_BYTES 1024
1402870Speter short buf[HEAD_BYTES / sizeof ( short )];
1412870Speter unsigned *ubuf = buf;
1422870Speter register int hf, i;
1432870Speter
1442870Speter hf = open("/usr/lib/npx_header", 0);
1452870Speter if (hf >= 0 && read(hf, buf, HEAD_BYTES) > sizeof header) {
1462870Speter header.magic = ubuf[0];
1472870Speter header.txt_size = ubuf[1];
1482870Speter header.data_size = ubuf[2];
1492870Speter header.bss_size = ubuf[3];
1502870Speter header.syms_size = ubuf[4];
1512870Speter header.entry_point = ubuf[5];
1522870Speter header.tr_size = ubuf[6];
1532870Speter header.dr_size = ubuf[7];
1542870Speter for (i = 0; i < HEAD_BYTES / sizeof ( short ); i++)
1552870Speter word(buf[i]);
1562870Speter }
1572870Speter close(hf);
1582870Speter word(0404);
1592870Speter }
1602870Speter
magic2()1612870Speter magic2()
1622870Speter {
1632870Speter short i;
1642870Speter
1652870Speter if (header.magic != 0407)
1662870Speter panic ( "magic2" );
1672870Speter pflush();
1682870Speter lseek(ofil, 0l, 0);
1692870Speter header.data_size = ( unsigned ) lc - header.txt_size;
17032762Sbostic header.data_size -= sizeof header;
1712870Speter write(ofil, &header, sizeof header);
1722870Speter lseek(ofil, ( long ) ( HEAD_BYTES - sizeof ( short ) ) , 0);
1732870Speter i = ( ( unsigned ) lc) - HEAD_BYTES;
1742870Speter write(ofil, &i, 2);
1752870Speter }
1762870Speter #endif
1772870Speter
1782870Speter #ifdef PXP
writef(i,cp)1792870Speter writef(i, cp)
1802870Speter {
1812870Speter
1822870Speter write(i, cp, strlen(cp));
1832870Speter }
1842870Speter #endif
185