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