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