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