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