1*48112Sbostic /*- 2*48112Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48112Sbostic * All rights reserved. 4*48112Sbostic * 5*48112Sbostic * %sccs.include.redist.c% 622245Sdist */ 722245Sdist 822245Sdist #ifndef lint 9*48112Sbostic static char sccsid[] = "@(#)yymain.c 5.4 (Berkeley) 04/16/91"; 10*48112Sbostic #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 */ 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 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 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 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 1792870Speter writef(i, cp) 1802870Speter { 1812870Speter 1822870Speter write(i, cp, strlen(cp)); 1832870Speter } 1842870Speter #endif 185