xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 6627)
1788Speter /* Copyright (c) 1979 Regents of the University of California */
2788Speter 
3*6627Speter static char sccsid[] = "@(#)yymain.c 1.4 05/06/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>
11*6627Speter #include "config.h"
12788Speter 
13788Speter /*
14788Speter  * Yymain initializes each of the utility
15788Speter  * clusters and then starts the processing
16788Speter  * by calling yyparse.
17788Speter  */
18788Speter yymain()
19788Speter {
20788Speter 
215654Slinton #ifdef OBJ
225654Slinton /*
235654Slinton  * initialize symbol table temp files
245654Slinton  */
255654Slinton 	startnlfile();
265654Slinton #endif
27788Speter 	/*
28788Speter 	 * Initialize the scanner
29788Speter 	 */
30788Speter #ifdef PXP
31788Speter 	if (bracket == 0) {
32788Speter #endif
33788Speter 		if (getline() == -1) {
34788Speter 			Perror(filename, "No lines in file");
35788Speter 			pexit(NOSTART);
36788Speter 		}
37788Speter #ifdef PXP
38788Speter 	} else
39788Speter 		yyline = 0;
40788Speter #endif
41788Speter 
42788Speter #ifdef PI
43788Speter #   ifdef OBJ
44788Speter 	magic();
45788Speter #   endif OBJ
46788Speter #endif
473086Smckusic 	line = 1;
483086Smckusic 	errpfx = 'E';
49788Speter 	/*
50788Speter 	 * Initialize the clusters
51788Speter 	 *
52788Speter 	initstring();
53788Speter 	 */
54788Speter 	inithash();
55788Speter 	inittree();
56788Speter #ifdef PI
57788Speter 	initnl();
58788Speter #endif
59788Speter 
60788Speter 	/*
61788Speter 	 * Process the input
62788Speter 	 */
63788Speter 	yyparse();
64788Speter #ifdef PI
65788Speter #   ifdef OBJ
665654Slinton 
675654Slinton 	/*
685654Slinton 	 * save outermost block of namelist
695654Slinton 	 */
705654Slinton 	savenl(0);
715654Slinton 
72788Speter 	magic2();
73788Speter #   endif OBJ
74788Speter #   ifdef DEBUG
75788Speter 	dumpnl(0);
76788Speter #   endif
77788Speter #endif
785654Slinton 
79788Speter #ifdef PXP
80788Speter 	prttab();
81788Speter 	if (onefile) {
82788Speter 		extern int outcol;
83788Speter 
84788Speter 		if (outcol)
85788Speter 			pchr('\n');
86788Speter 		flush();
87788Speter 		if (eflg) {
88788Speter 			writef(2, "File not rewritten because of errors\n");
89788Speter 			pexit(ERRS);
90788Speter 		}
91788Speter 		signal(SIGHUP, SIG_IGN);
92788Speter 		signal(SIGINT, SIG_IGN);
93788Speter 		copyfile();
94788Speter 	}
95788Speter #endif
96788Speter 	pexit(eflg ? ERRS : AOK);
97788Speter }
98788Speter 
99788Speter #ifdef PXP
100788Speter copyfile()
101788Speter {
102788Speter 	extern int fout[];
103788Speter 	register int c;
104788Speter 
105788Speter 	close(1);
106788Speter 	if (creat(firstname, 0644) != 1) {
107788Speter 		perror(firstname);
108788Speter 		pexit(ERRS);
109788Speter 	}
110788Speter 	lseek(fout[0], 0l, 0);
111788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
112788Speter 		if (write(1, &fout[3], c) != c) {
113788Speter 			perror(firstname);
114788Speter 			pexit(ERRS);
115788Speter 		}
116788Speter 	}
117788Speter }
118788Speter #endif
119788Speter 
120788Speter static
121788Speter struct exec magichdr;
122788Speter 
123788Speter #ifdef PI
124788Speter #ifdef OBJ
125788Speter magic()
126788Speter {
127788Speter 
128788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
129788Speter 	unsigned	*ubuf = buf;
130788Speter 	register int	hf, i;
131788Speter 
132*6627Speter 	hf = open(px_header,0);
133788Speter 	if (hf >= 0 && read(hf, buf, HEADER_BYTES) > sizeof(struct exec)) {
134788Speter 		magichdr.a_magic = ubuf[0];
135788Speter 		magichdr.a_text = ubuf[1];
136788Speter 		magichdr.a_data = ubuf[2];
137788Speter 		magichdr.a_bss = ubuf[3];
138788Speter 		magichdr.a_syms = ubuf[4];
139788Speter 		magichdr.a_entry = ubuf[5];
140788Speter 		magichdr.a_trsize = ubuf[6];
141788Speter 		magichdr.a_drsize = ubuf[7];
142788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
143788Speter 			word(buf[i]);
144788Speter 	}
145788Speter 	close(hf);
146788Speter }
147788Speter #endif OBJ
148788Speter 
149788Speter #ifdef OBJ
150788Speter magic2()
151788Speter {
152788Speter 	struct pxhdr pxhd;
153788Speter 
154788Speter 	if  (magichdr.a_magic != 0407)
155788Speter 		panic ( "magic2" );
156788Speter 	pflush();
157788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
158788Speter 	magichdr.a_data -= sizeof (struct exec);
159788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
1605654Slinton 	pxhd.symtabsize = nlhdrsize();
1615654Slinton 	magichdr.a_data += pxhd.symtabsize;
1623086Smckusic 	time(&pxhd.maketime);
163788Speter 	pxhd.magicnum = MAGICNUM;
1645654Slinton 	lseek(ofil, 0l, 0);
1655654Slinton 	write(ofil, &magichdr, sizeof(struct exec));
166788Speter 	lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
167788Speter 	write(ofil, &pxhd, sizeof (pxhd));
168788Speter }
169788Speter #endif OBJ
170788Speter #endif
171788Speter 
172788Speter #ifdef PXP
173788Speter writef(i, cp)
174788Speter {
175788Speter 
176788Speter 	write(i, cp, strlen(cp));
177788Speter }
178788Speter #endif
179