xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 22208)
1*22208Sdist /*
2*22208Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22208Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22208Sdist  * specifies the terms and conditions for redistribution.
5*22208Sdist  */
6788Speter 
714748Sthien #ifndef lint
8*22208Sdist static char sccsid[] = "@(#)yymain.c	5.1 (Berkeley) 06/05/85";
9*22208Sdist #endif not lint
10788Speter 
11788Speter #include "whoami.h"
12788Speter #include "0.h"
1314748Sthien #include "tree_ty.h"	/* must be included for yy.h */
14788Speter #include "yy.h"
15788Speter #include <a.out.h>
16788Speter #include "objfmt.h"
17788Speter #include <signal.h>
186627Speter #include "config.h"
19788Speter 
20788Speter /*
21788Speter  * Yymain initializes each of the utility
22788Speter  * clusters and then starts the processing
23788Speter  * by calling yyparse.
24788Speter  */
25788Speter yymain()
26788Speter {
27788Speter 
285654Slinton #ifdef OBJ
295654Slinton /*
305654Slinton  * initialize symbol table temp files
315654Slinton  */
325654Slinton 	startnlfile();
335654Slinton #endif
34788Speter 	/*
35788Speter 	 * Initialize the scanner
36788Speter 	 */
37788Speter #ifdef PXP
38788Speter 	if (bracket == 0) {
39788Speter #endif
40788Speter 		if (getline() == -1) {
41788Speter 			Perror(filename, "No lines in file");
42788Speter 			pexit(NOSTART);
43788Speter 		}
44788Speter #ifdef PXP
45788Speter 	} else
46788Speter 		yyline = 0;
47788Speter #endif
48788Speter 
49788Speter #ifdef PI
50788Speter #   ifdef OBJ
51788Speter 	magic();
52788Speter #   endif OBJ
53788Speter #endif
543086Smckusic 	line = 1;
553086Smckusic 	errpfx = 'E';
56788Speter 	/*
57788Speter 	 * Initialize the clusters
58788Speter 	 *
59788Speter 	initstring();
60788Speter 	 */
61788Speter 	inithash();
62788Speter 	inittree();
63788Speter #ifdef PI
64788Speter 	initnl();
65788Speter #endif
66788Speter 
67788Speter 	/*
68788Speter 	 * Process the input
69788Speter 	 */
70788Speter 	yyparse();
71788Speter #ifdef PI
72788Speter #   ifdef OBJ
735654Slinton 
745654Slinton 	/*
755654Slinton 	 * save outermost block of namelist
765654Slinton 	 */
7714748Sthien 	savenl(NLNIL);
785654Slinton 
79788Speter 	magic2();
80788Speter #   endif OBJ
81788Speter #   ifdef DEBUG
8214748Sthien 	dumpnl(NLNIL);
83788Speter #   endif
84788Speter #endif
855654Slinton 
86788Speter #ifdef PXP
87788Speter 	prttab();
88788Speter 	if (onefile) {
89788Speter 		extern int outcol;
90788Speter 
91788Speter 		if (outcol)
92788Speter 			pchr('\n');
93788Speter 		flush();
94788Speter 		if (eflg) {
95788Speter 			writef(2, "File not rewritten because of errors\n");
96788Speter 			pexit(ERRS);
97788Speter 		}
9814748Sthien 		(void) signal(SIGHUP, SIG_IGN);
9914748Sthien 		(void) signal(SIGINT, SIG_IGN);
100788Speter 		copyfile();
101788Speter 	}
102788Speter #endif
103788Speter 	pexit(eflg ? ERRS : AOK);
104788Speter }
105788Speter 
106788Speter #ifdef PXP
107788Speter copyfile()
108788Speter {
109788Speter 	extern int fout[];
110788Speter 	register int c;
111788Speter 
11214748Sthien 	(void) close(1);
113788Speter 	if (creat(firstname, 0644) != 1) {
114788Speter 		perror(firstname);
115788Speter 		pexit(ERRS);
116788Speter 	}
11714748Sthien 	(void) lseek(fout[0], 0l, 0);
118788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
119788Speter 		if (write(1, &fout[3], c) != c) {
120788Speter 			perror(firstname);
121788Speter 			pexit(ERRS);
122788Speter 		}
123788Speter 	}
124788Speter }
125788Speter #endif
126788Speter 
12714748Sthien 
12814748Sthien #ifdef PI
12914748Sthien #ifdef OBJ
13014748Sthien 
131788Speter static
132788Speter struct exec magichdr;
133788Speter 
134788Speter magic()
135788Speter {
136788Speter 
137788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
13814748Sthien 	unsigned	*ubuf = (unsigned *) buf;
139788Speter 	register int	hf, i;
140788Speter 
1416627Speter 	hf = open(px_header,0);
14214748Sthien 	if (hf >= 0 && read(hf, (char *) buf, HEADER_BYTES) > sizeof(struct exec)) {
143788Speter 		magichdr.a_magic = ubuf[0];
144788Speter 		magichdr.a_text = ubuf[1];
145788Speter 		magichdr.a_data = ubuf[2];
146788Speter 		magichdr.a_bss = ubuf[3];
147788Speter 		magichdr.a_syms = ubuf[4];
148788Speter 		magichdr.a_entry = ubuf[5];
149788Speter 		magichdr.a_trsize = ubuf[6];
150788Speter 		magichdr.a_drsize = ubuf[7];
151788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
152788Speter 			word(buf[i]);
153788Speter 	}
15414748Sthien 	(void) close(hf);
155788Speter }
156788Speter #endif OBJ
157788Speter 
158788Speter #ifdef OBJ
159788Speter magic2()
160788Speter {
161788Speter 	struct pxhdr pxhd;
16214748Sthien 	extern long lseek();
163788Speter 
164788Speter 	if  (magichdr.a_magic != 0407)
165788Speter 		panic ( "magic2" );
166788Speter 	pflush();
167788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
168788Speter 	magichdr.a_data -= sizeof (struct exec);
169788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
1705654Slinton 	pxhd.symtabsize = nlhdrsize();
1715654Slinton 	magichdr.a_data += pxhd.symtabsize;
17214748Sthien 	(void) time((long *) (&pxhd.maketime));
173788Speter 	pxhd.magicnum = MAGICNUM;
17414748Sthien 	(void) lseek(ofil, 0l, 0);
17514748Sthien 	write(ofil, (char *) (&magichdr), sizeof(struct exec));
17614748Sthien 	(void) lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
17714748Sthien 	write(ofil, (char *) (&pxhd), sizeof (pxhd));
178788Speter }
179788Speter #endif OBJ
180788Speter #endif
181788Speter 
182788Speter #ifdef PXP
183788Speter writef(i, cp)
184788Speter {
185788Speter 
186788Speter 	write(i, cp, strlen(cp));
187788Speter }
188788Speter #endif
189