xref: /csrg-svn/usr.bin/pascal/pxp/yymain.c (revision 2870)
1*2870Speter static	char *sccsid = "@(#)yymain.c	1.1 (Berkeley) 03/02/81";
2*2870Speter /* Copyright (c) 1979 Regents of the University of California */
3*2870Speter #
4*2870Speter /*
5*2870Speter  * pi - Pascal interpreter code translator
6*2870Speter  *
7*2870Speter  * Charles Haley, Bill Joy UCB
8*2870Speter  * Version 1.2 November 1978
9*2870Speter  *
10*2870Speter  *
11*2870Speter  * pxp - Pascal execution profiler
12*2870Speter  *
13*2870Speter  * Bill Joy UCB
14*2870Speter  * Version 1.2 November 1978
15*2870Speter  */
16*2870Speter 
17*2870Speter #include "0.h"
18*2870Speter #include "yy.h"
19*2870Speter 
20*2870Speter int	line = 1;
21*2870Speter 
22*2870Speter /*
23*2870Speter  * Yymain initializes each of the utility
24*2870Speter  * clusters and then starts the processing
25*2870Speter  * by calling yyparse.
26*2870Speter  */
27*2870Speter yymain()
28*2870Speter {
29*2870Speter 
30*2870Speter 	/*
31*2870Speter 	 * Initialize the scanner
32*2870Speter 	 */
33*2870Speter #ifdef PXP
34*2870Speter 	if (bracket == 0) {
35*2870Speter #endif
36*2870Speter 		if (getline() == -1) {
37*2870Speter 			Perror(filename, "No lines in file");
38*2870Speter 			pexit(NOSTART);
39*2870Speter 		}
40*2870Speter #ifdef PXP
41*2870Speter 	} else
42*2870Speter 		yyline = 0;
43*2870Speter #endif
44*2870Speter 
45*2870Speter #ifdef PI
46*2870Speter 	magic();
47*2870Speter 
48*2870Speter #endif
49*2870Speter 	/*
50*2870Speter 	 * Initialize the clusters
51*2870Speter 	 *
52*2870Speter 	initstring();
53*2870Speter 	 */
54*2870Speter 	inithash();
55*2870Speter 	inittree();
56*2870Speter #ifdef PI
57*2870Speter 	initnl();
58*2870Speter #endif
59*2870Speter 
60*2870Speter 	/*
61*2870Speter 	 * Process the input
62*2870Speter 	 */
63*2870Speter 	yyparse();
64*2870Speter #ifdef PI
65*2870Speter 	magic2();
66*2870Speter #ifdef DEBUG
67*2870Speter 	dumpnl(0);
68*2870Speter #endif
69*2870Speter #endif
70*2870Speter #ifdef PXP
71*2870Speter 	prttab();
72*2870Speter 	if (onefile) {
73*2870Speter 		extern int outcol;
74*2870Speter 
75*2870Speter 		if (outcol)
76*2870Speter 			putchar('\n');
77*2870Speter 		flush();
78*2870Speter 		if (eflg) {
79*2870Speter 			writef(2, "File not rewritten because of errors\n");
80*2870Speter 			pexit(ERRS);
81*2870Speter 		}
82*2870Speter 		signal(1, 1);
83*2870Speter 		signal(2, 1);
84*2870Speter 		copyfile();
85*2870Speter 	}
86*2870Speter #endif
87*2870Speter 	pexit(eflg ? ERRS : AOK);
88*2870Speter }
89*2870Speter 
90*2870Speter #ifdef PXP
91*2870Speter copyfile()
92*2870Speter {
93*2870Speter 	register int c;
94*2870Speter 	char buf[BUFSIZ];
95*2870Speter 
96*2870Speter 	if (freopen(stdoutn, "r", stdin) == NULL) {
97*2870Speter 		perror(stdoutn);
98*2870Speter 		pexit(ERRS);
99*2870Speter 	}
100*2870Speter 	if (freopen(firstname, "w", stdout) == NULL) {
101*2870Speter 		perror(firstname);
102*2870Speter 		pexit(ERRS);
103*2870Speter 	}
104*2870Speter 	while ((c = getchar()) > 0)
105*2870Speter 		putchar(c);
106*2870Speter 	if (ferror(stdout))
107*2870Speter 		perror(stdout);
108*2870Speter }
109*2870Speter #endif
110*2870Speter 
111*2870Speter static
112*2870Speter struct {
113*2870Speter 	int		magic;
114*2870Speter 	unsigned	txt_size;
115*2870Speter 	unsigned	data_size;
116*2870Speter 	unsigned	bss_size;
117*2870Speter 	unsigned	syms_size;
118*2870Speter 	unsigned	entry_point;
119*2870Speter 	unsigned	tr_size;
120*2870Speter 	unsigned	dr_size;
121*2870Speter } header;
122*2870Speter 
123*2870Speter #ifdef PI
124*2870Speter magic()
125*2870Speter {
126*2870Speter 
127*2870Speter     /*
128*2870Speter      *	this is the size of /usr/lib/npxheader
129*2870Speter      */
130*2870Speter #define	HEAD_BYTES	1024
131*2870Speter 	short		buf[HEAD_BYTES / sizeof ( short )];
132*2870Speter 	unsigned	*ubuf = buf;
133*2870Speter 	register int	hf, i;
134*2870Speter 
135*2870Speter 	hf = open("/usr/lib/npx_header", 0);
136*2870Speter 	if (hf >= 0 && read(hf, buf, HEAD_BYTES) > sizeof header) {
137*2870Speter 		header.magic = ubuf[0];
138*2870Speter 		header.txt_size = ubuf[1];
139*2870Speter 		header.data_size = ubuf[2];
140*2870Speter 		header.bss_size = ubuf[3];
141*2870Speter 		header.syms_size = ubuf[4];
142*2870Speter 		header.entry_point = ubuf[5];
143*2870Speter 		header.tr_size = ubuf[6];
144*2870Speter 		header.dr_size = ubuf[7];
145*2870Speter 		for (i = 0; i < HEAD_BYTES / sizeof ( short ); i++)
146*2870Speter 			word(buf[i]);
147*2870Speter 	}
148*2870Speter 	close(hf);
149*2870Speter 	word(0404);
150*2870Speter }
151*2870Speter 
152*2870Speter magic2()
153*2870Speter {
154*2870Speter 	short i;
155*2870Speter 
156*2870Speter 	if  (header.magic != 0407)
157*2870Speter 		panic ( "magic2" );
158*2870Speter 	pflush();
159*2870Speter 	lseek(ofil, 0l, 0);
160*2870Speter 	header.data_size = ( unsigned ) lc - header.txt_size;
161*2870Speter 	header.data_size =- sizeof header;
162*2870Speter 	write(ofil, &header, sizeof header);
163*2870Speter 	lseek(ofil, ( long ) ( HEAD_BYTES - sizeof ( short ) ) , 0);
164*2870Speter 	i = ( ( unsigned ) lc) - HEAD_BYTES;
165*2870Speter 	write(ofil, &i, 2);
166*2870Speter }
167*2870Speter #endif
168*2870Speter 
169*2870Speter #ifdef PXP
170*2870Speter writef(i, cp)
171*2870Speter {
172*2870Speter 
173*2870Speter 	write(i, cp, strlen(cp));
174*2870Speter }
175*2870Speter #endif
176