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