xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 5654)
1788Speter /* Copyright (c) 1979 Regents of the University of California */
2788Speter 
3*5654Slinton static char sccsid[] = "@(#)yymain.c 1.3 02/02/82";
4788Speter 
5788Speter #include "whoami.h"
6788Speter #include "0.h"
7788Speter #include "yy.h"
8788Speter #include <a.out.h>
9788Speter #include "objfmt.h"
10788Speter #include <signal.h>
11788Speter 
12788Speter /*
13788Speter  * Yymain initializes each of the utility
14788Speter  * clusters and then starts the processing
15788Speter  * by calling yyparse.
16788Speter  */
17788Speter yymain()
18788Speter {
19788Speter 
20*5654Slinton #ifdef OBJ
21*5654Slinton /*
22*5654Slinton  * initialize symbol table temp files
23*5654Slinton  */
24*5654Slinton 	startnlfile();
25*5654Slinton #endif
26788Speter 	/*
27788Speter 	 * Initialize the scanner
28788Speter 	 */
29788Speter #ifdef PXP
30788Speter 	if (bracket == 0) {
31788Speter #endif
32788Speter 		if (getline() == -1) {
33788Speter 			Perror(filename, "No lines in file");
34788Speter 			pexit(NOSTART);
35788Speter 		}
36788Speter #ifdef PXP
37788Speter 	} else
38788Speter 		yyline = 0;
39788Speter #endif
40788Speter 
41788Speter #ifdef PI
42788Speter #   ifdef OBJ
43788Speter 	magic();
44788Speter #   endif OBJ
45788Speter #endif
463086Smckusic 	line = 1;
473086Smckusic 	errpfx = 'E';
48788Speter 	/*
49788Speter 	 * Initialize the clusters
50788Speter 	 *
51788Speter 	initstring();
52788Speter 	 */
53788Speter 	inithash();
54788Speter 	inittree();
55788Speter #ifdef PI
56788Speter 	initnl();
57788Speter #endif
58788Speter 
59788Speter 	/*
60788Speter 	 * Process the input
61788Speter 	 */
62788Speter 	yyparse();
63788Speter #ifdef PI
64788Speter #   ifdef OBJ
65*5654Slinton 
66*5654Slinton 	/*
67*5654Slinton 	 * save outermost block of namelist
68*5654Slinton 	 */
69*5654Slinton 	savenl(0);
70*5654Slinton 
71788Speter 	magic2();
72788Speter #   endif OBJ
73788Speter #   ifdef DEBUG
74788Speter 	dumpnl(0);
75788Speter #   endif
76788Speter #endif
77*5654Slinton 
78788Speter #ifdef PXP
79788Speter 	prttab();
80788Speter 	if (onefile) {
81788Speter 		extern int outcol;
82788Speter 
83788Speter 		if (outcol)
84788Speter 			pchr('\n');
85788Speter 		flush();
86788Speter 		if (eflg) {
87788Speter 			writef(2, "File not rewritten because of errors\n");
88788Speter 			pexit(ERRS);
89788Speter 		}
90788Speter 		signal(SIGHUP, SIG_IGN);
91788Speter 		signal(SIGINT, SIG_IGN);
92788Speter 		copyfile();
93788Speter 	}
94788Speter #endif
95788Speter 	pexit(eflg ? ERRS : AOK);
96788Speter }
97788Speter 
98788Speter #ifdef PXP
99788Speter copyfile()
100788Speter {
101788Speter 	extern int fout[];
102788Speter 	register int c;
103788Speter 
104788Speter 	close(1);
105788Speter 	if (creat(firstname, 0644) != 1) {
106788Speter 		perror(firstname);
107788Speter 		pexit(ERRS);
108788Speter 	}
109788Speter 	lseek(fout[0], 0l, 0);
110788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
111788Speter 		if (write(1, &fout[3], c) != c) {
112788Speter 			perror(firstname);
113788Speter 			pexit(ERRS);
114788Speter 		}
115788Speter 	}
116788Speter }
117788Speter #endif
118788Speter 
119788Speter static
120788Speter struct exec magichdr;
121788Speter 
122788Speter #ifdef PI
123788Speter #ifdef OBJ
124788Speter magic()
125788Speter {
126788Speter 
127788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
128788Speter 	unsigned	*ubuf = buf;
129788Speter 	register int	hf, i;
130788Speter 
131788Speter 	hf = open(PX_HEADER,0);
132788Speter 	if (hf >= 0 && read(hf, buf, HEADER_BYTES) > sizeof(struct exec)) {
133788Speter 		magichdr.a_magic = ubuf[0];
134788Speter 		magichdr.a_text = ubuf[1];
135788Speter 		magichdr.a_data = ubuf[2];
136788Speter 		magichdr.a_bss = ubuf[3];
137788Speter 		magichdr.a_syms = ubuf[4];
138788Speter 		magichdr.a_entry = ubuf[5];
139788Speter 		magichdr.a_trsize = ubuf[6];
140788Speter 		magichdr.a_drsize = ubuf[7];
141788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
142788Speter 			word(buf[i]);
143788Speter 	}
144788Speter 	close(hf);
145788Speter }
146788Speter #endif OBJ
147788Speter 
148788Speter #ifdef OBJ
149788Speter magic2()
150788Speter {
151788Speter 	struct pxhdr pxhd;
152788Speter 
153788Speter 	if  (magichdr.a_magic != 0407)
154788Speter 		panic ( "magic2" );
155788Speter 	pflush();
156788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
157788Speter 	magichdr.a_data -= sizeof (struct exec);
158788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
159*5654Slinton 	pxhd.symtabsize = nlhdrsize();
160*5654Slinton 	magichdr.a_data += pxhd.symtabsize;
1613086Smckusic 	time(&pxhd.maketime);
162788Speter 	pxhd.magicnum = MAGICNUM;
163*5654Slinton 	lseek(ofil, 0l, 0);
164*5654Slinton 	write(ofil, &magichdr, sizeof(struct exec));
165788Speter 	lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
166788Speter 	write(ofil, &pxhd, sizeof (pxhd));
167788Speter }
168788Speter #endif OBJ
169788Speter #endif
170788Speter 
171788Speter #ifdef PXP
172788Speter writef(i, cp)
173788Speter {
174788Speter 
175788Speter 	write(i, cp, strlen(cp));
176788Speter }
177788Speter #endif
178