xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 14748)
1788Speter /* Copyright (c) 1979 Regents of the University of California */
2788Speter 
3*14748Sthien #ifndef lint
4*14748Sthien static char sccsid[] = "@(#)yymain.c 1.5 08/19/83";
5*14748Sthien #endif
6788Speter 
7788Speter #include "whoami.h"
8788Speter #include "0.h"
9*14748Sthien #include "tree_ty.h"	/* must be included for yy.h */
10788Speter #include "yy.h"
11788Speter #include <a.out.h>
12788Speter #include "objfmt.h"
13788Speter #include <signal.h>
146627Speter #include "config.h"
15788Speter 
16788Speter /*
17788Speter  * Yymain initializes each of the utility
18788Speter  * clusters and then starts the processing
19788Speter  * by calling yyparse.
20788Speter  */
21788Speter yymain()
22788Speter {
23788Speter 
245654Slinton #ifdef OBJ
255654Slinton /*
265654Slinton  * initialize symbol table temp files
275654Slinton  */
285654Slinton 	startnlfile();
295654Slinton #endif
30788Speter 	/*
31788Speter 	 * Initialize the scanner
32788Speter 	 */
33788Speter #ifdef PXP
34788Speter 	if (bracket == 0) {
35788Speter #endif
36788Speter 		if (getline() == -1) {
37788Speter 			Perror(filename, "No lines in file");
38788Speter 			pexit(NOSTART);
39788Speter 		}
40788Speter #ifdef PXP
41788Speter 	} else
42788Speter 		yyline = 0;
43788Speter #endif
44788Speter 
45788Speter #ifdef PI
46788Speter #   ifdef OBJ
47788Speter 	magic();
48788Speter #   endif OBJ
49788Speter #endif
503086Smckusic 	line = 1;
513086Smckusic 	errpfx = 'E';
52788Speter 	/*
53788Speter 	 * Initialize the clusters
54788Speter 	 *
55788Speter 	initstring();
56788Speter 	 */
57788Speter 	inithash();
58788Speter 	inittree();
59788Speter #ifdef PI
60788Speter 	initnl();
61788Speter #endif
62788Speter 
63788Speter 	/*
64788Speter 	 * Process the input
65788Speter 	 */
66788Speter 	yyparse();
67788Speter #ifdef PI
68788Speter #   ifdef OBJ
695654Slinton 
705654Slinton 	/*
715654Slinton 	 * save outermost block of namelist
725654Slinton 	 */
73*14748Sthien 	savenl(NLNIL);
745654Slinton 
75788Speter 	magic2();
76788Speter #   endif OBJ
77788Speter #   ifdef DEBUG
78*14748Sthien 	dumpnl(NLNIL);
79788Speter #   endif
80788Speter #endif
815654Slinton 
82788Speter #ifdef PXP
83788Speter 	prttab();
84788Speter 	if (onefile) {
85788Speter 		extern int outcol;
86788Speter 
87788Speter 		if (outcol)
88788Speter 			pchr('\n');
89788Speter 		flush();
90788Speter 		if (eflg) {
91788Speter 			writef(2, "File not rewritten because of errors\n");
92788Speter 			pexit(ERRS);
93788Speter 		}
94*14748Sthien 		(void) signal(SIGHUP, SIG_IGN);
95*14748Sthien 		(void) signal(SIGINT, SIG_IGN);
96788Speter 		copyfile();
97788Speter 	}
98788Speter #endif
99788Speter 	pexit(eflg ? ERRS : AOK);
100788Speter }
101788Speter 
102788Speter #ifdef PXP
103788Speter copyfile()
104788Speter {
105788Speter 	extern int fout[];
106788Speter 	register int c;
107788Speter 
108*14748Sthien 	(void) close(1);
109788Speter 	if (creat(firstname, 0644) != 1) {
110788Speter 		perror(firstname);
111788Speter 		pexit(ERRS);
112788Speter 	}
113*14748Sthien 	(void) lseek(fout[0], 0l, 0);
114788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
115788Speter 		if (write(1, &fout[3], c) != c) {
116788Speter 			perror(firstname);
117788Speter 			pexit(ERRS);
118788Speter 		}
119788Speter 	}
120788Speter }
121788Speter #endif
122788Speter 
123*14748Sthien 
124*14748Sthien #ifdef PI
125*14748Sthien #ifdef OBJ
126*14748Sthien 
127788Speter static
128788Speter struct exec magichdr;
129788Speter 
130788Speter magic()
131788Speter {
132788Speter 
133788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
134*14748Sthien 	unsigned	*ubuf = (unsigned *) buf;
135788Speter 	register int	hf, i;
136788Speter 
1376627Speter 	hf = open(px_header,0);
138*14748Sthien 	if (hf >= 0 && read(hf, (char *) buf, HEADER_BYTES) > sizeof(struct exec)) {
139788Speter 		magichdr.a_magic = ubuf[0];
140788Speter 		magichdr.a_text = ubuf[1];
141788Speter 		magichdr.a_data = ubuf[2];
142788Speter 		magichdr.a_bss = ubuf[3];
143788Speter 		magichdr.a_syms = ubuf[4];
144788Speter 		magichdr.a_entry = ubuf[5];
145788Speter 		magichdr.a_trsize = ubuf[6];
146788Speter 		magichdr.a_drsize = ubuf[7];
147788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
148788Speter 			word(buf[i]);
149788Speter 	}
150*14748Sthien 	(void) close(hf);
151788Speter }
152788Speter #endif OBJ
153788Speter 
154788Speter #ifdef OBJ
155788Speter magic2()
156788Speter {
157788Speter 	struct pxhdr pxhd;
158*14748Sthien 	extern long lseek();
159788Speter 
160788Speter 	if  (magichdr.a_magic != 0407)
161788Speter 		panic ( "magic2" );
162788Speter 	pflush();
163788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
164788Speter 	magichdr.a_data -= sizeof (struct exec);
165788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
1665654Slinton 	pxhd.symtabsize = nlhdrsize();
1675654Slinton 	magichdr.a_data += pxhd.symtabsize;
168*14748Sthien 	(void) time((long *) (&pxhd.maketime));
169788Speter 	pxhd.magicnum = MAGICNUM;
170*14748Sthien 	(void) lseek(ofil, 0l, 0);
171*14748Sthien 	write(ofil, (char *) (&magichdr), sizeof(struct exec));
172*14748Sthien 	(void) lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
173*14748Sthien 	write(ofil, (char *) (&pxhd), sizeof (pxhd));
174788Speter }
175788Speter #endif OBJ
176788Speter #endif
177788Speter 
178788Speter #ifdef PXP
179788Speter writef(i, cp)
180788Speter {
181788Speter 
182788Speter 	write(i, cp, strlen(cp));
183788Speter }
184788Speter #endif
185