xref: /csrg-svn/usr.bin/pascal/pxp/yymain.c (revision 62195)
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