xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 67239)
148116Sbostic /*-
262225Sbostic  * Copyright (c) 1980, 1993
362225Sbostic  *	The Regents of the University of California.  All rights reserved.
448116Sbostic  *
548116Sbostic  * %sccs.include.redist.c%
622208Sdist  */
7788Speter 
814748Sthien #ifndef lint
9*67239Smckusick static char sccsid[] = "@(#)yymain.c	8.2 (Berkeley) 05/24/94";
1048116Sbostic #endif /* not lint */
11788Speter 
12788Speter #include "whoami.h"
13788Speter #include "0.h"
1414748Sthien #include "tree_ty.h"	/* must be included for yy.h */
15788Speter #include "yy.h"
16788Speter #include <a.out.h>
17788Speter #include "objfmt.h"
18788Speter #include <signal.h>
196627Speter #include "config.h"
20788Speter 
21788Speter /*
22788Speter  * Yymain initializes each of the utility
23788Speter  * clusters and then starts the processing
24788Speter  * by calling yyparse.
25788Speter  */
yymain()26788Speter yymain()
27788Speter {
28788Speter 
295654Slinton #ifdef OBJ
305654Slinton /*
315654Slinton  * initialize symbol table temp files
325654Slinton  */
335654Slinton 	startnlfile();
345654Slinton #endif
35788Speter 	/*
36788Speter 	 * Initialize the scanner
37788Speter 	 */
38788Speter #ifdef PXP
39788Speter 	if (bracket == 0) {
40788Speter #endif
41788Speter 		if (getline() == -1) {
42788Speter 			Perror(filename, "No lines in file");
43788Speter 			pexit(NOSTART);
44788Speter 		}
45788Speter #ifdef PXP
46788Speter 	} else
47788Speter 		yyline = 0;
48788Speter #endif
49788Speter 
50788Speter #ifdef PI
51788Speter #   ifdef OBJ
52788Speter 	magic();
53788Speter #   endif OBJ
54788Speter #endif
553086Smckusic 	line = 1;
563086Smckusic 	errpfx = 'E';
57788Speter 	/*
58788Speter 	 * Initialize the clusters
59788Speter 	 *
60788Speter 	initstring();
61788Speter 	 */
62788Speter 	inithash();
63788Speter 	inittree();
64788Speter #ifdef PI
65788Speter 	initnl();
66788Speter #endif
67788Speter 
68788Speter 	/*
69788Speter 	 * Process the input
70788Speter 	 */
71788Speter 	yyparse();
72788Speter #ifdef PI
73788Speter #   ifdef OBJ
745654Slinton 
755654Slinton 	/*
765654Slinton 	 * save outermost block of namelist
775654Slinton 	 */
7814748Sthien 	savenl(NLNIL);
795654Slinton 
80788Speter 	magic2();
81788Speter #   endif OBJ
82788Speter #   ifdef DEBUG
8314748Sthien 	dumpnl(NLNIL);
84788Speter #   endif
85788Speter #endif
865654Slinton 
87788Speter #ifdef PXP
88788Speter 	prttab();
89788Speter 	if (onefile) {
90788Speter 		extern int outcol;
91788Speter 
92788Speter 		if (outcol)
93788Speter 			pchr('\n');
94788Speter 		flush();
95788Speter 		if (eflg) {
96788Speter 			writef(2, "File not rewritten because of errors\n");
97788Speter 			pexit(ERRS);
98788Speter 		}
9914748Sthien 		(void) signal(SIGHUP, SIG_IGN);
10014748Sthien 		(void) signal(SIGINT, SIG_IGN);
101788Speter 		copyfile();
102788Speter 	}
103788Speter #endif
104788Speter 	pexit(eflg ? ERRS : AOK);
105788Speter }
106788Speter 
107788Speter #ifdef PXP
copyfile()108788Speter copyfile()
109788Speter {
110788Speter 	extern int fout[];
111788Speter 	register int c;
112788Speter 
11314748Sthien 	(void) close(1);
114788Speter 	if (creat(firstname, 0644) != 1) {
115788Speter 		perror(firstname);
116788Speter 		pexit(ERRS);
117788Speter 	}
118*67239Smckusick 	if (lseek(fout[0], (off_t)0, 0) == -1)
119*67239Smckusick 		perror("copyfile: lseek"), panic("copyfile");
120788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
121788Speter 		if (write(1, &fout[3], c) != c) {
122788Speter 			perror(firstname);
123788Speter 			pexit(ERRS);
124788Speter 		}
125788Speter 	}
126788Speter }
127788Speter #endif
128788Speter 
12914748Sthien 
13014748Sthien #ifdef PI
13114748Sthien #ifdef OBJ
13214748Sthien 
133788Speter static
134788Speter struct exec magichdr;
135788Speter 
magic()136788Speter magic()
137788Speter {
138788Speter 
139788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
14014748Sthien 	unsigned	*ubuf = (unsigned *) buf;
141788Speter 	register int	hf, i;
142788Speter 
1436627Speter 	hf = open(px_header,0);
14414748Sthien 	if (hf >= 0 && read(hf, (char *) buf, HEADER_BYTES) > sizeof(struct exec)) {
145788Speter 		magichdr.a_magic = ubuf[0];
146788Speter 		magichdr.a_text = ubuf[1];
147788Speter 		magichdr.a_data = ubuf[2];
148788Speter 		magichdr.a_bss = ubuf[3];
149788Speter 		magichdr.a_syms = ubuf[4];
150788Speter 		magichdr.a_entry = ubuf[5];
151788Speter 		magichdr.a_trsize = ubuf[6];
152788Speter 		magichdr.a_drsize = ubuf[7];
153788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
154788Speter 			word(buf[i]);
155788Speter 	}
15614748Sthien 	(void) close(hf);
157788Speter }
158788Speter #endif OBJ
159788Speter 
160788Speter #ifdef OBJ
magic2()161788Speter magic2()
162788Speter {
163788Speter 	struct pxhdr pxhd;
164788Speter 
165788Speter 	if  (magichdr.a_magic != 0407)
166788Speter 		panic ( "magic2" );
167788Speter 	pflush();
168788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
169788Speter 	magichdr.a_data -= sizeof (struct exec);
170788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
1715654Slinton 	pxhd.symtabsize = nlhdrsize();
1725654Slinton 	magichdr.a_data += pxhd.symtabsize;
17314748Sthien 	(void) time((long *) (&pxhd.maketime));
174788Speter 	pxhd.magicnum = MAGICNUM;
175*67239Smckusick 	if (lseek(ofil, (off_t)0, 0) == -1)
176*67239Smckusick 		perror("magic2: lseek1"), panic("magic2");
17714748Sthien 	write(ofil, (char *) (&magichdr), sizeof(struct exec));
178*67239Smckusick 	if (lseek(ofil, (off_t)(HEADER_BYTES - sizeof(pxhd)), 0) == -1)
179*67239Smckusick 		perror("magic2: lseek2"), panic("magic2");
18014748Sthien 	write(ofil, (char *) (&pxhd), sizeof (pxhd));
181788Speter }
182788Speter #endif OBJ
183788Speter #endif
184788Speter 
185788Speter #ifdef PXP
writef(i,cp)186788Speter writef(i, cp)
187788Speter {
188788Speter 
189788Speter 	write(i, cp, strlen(cp));
190788Speter }
191788Speter #endif
192