xref: /csrg-svn/usr.bin/pascal/src/yymain.c (revision 3086)
1788Speter /* Copyright (c) 1979 Regents of the University of California */
2788Speter 
3*3086Smckusic static char sccsid[] = "@(#)yymain.c 1.2 03/08/81";
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 
20788Speter 	/*
21788Speter 	 * Initialize the scanner
22788Speter 	 */
23788Speter #ifdef PXP
24788Speter 	if (bracket == 0) {
25788Speter #endif
26788Speter 		if (getline() == -1) {
27788Speter 			Perror(filename, "No lines in file");
28788Speter 			pexit(NOSTART);
29788Speter 		}
30788Speter #ifdef PXP
31788Speter 	} else
32788Speter 		yyline = 0;
33788Speter #endif
34788Speter 
35788Speter #ifdef PI
36788Speter #   ifdef OBJ
37788Speter 	magic();
38788Speter #   endif OBJ
39788Speter #endif
40*3086Smckusic 	line = 1;
41*3086Smckusic 	errpfx = 'E';
42788Speter 	/*
43788Speter 	 * Initialize the clusters
44788Speter 	 *
45788Speter 	initstring();
46788Speter 	 */
47788Speter 	inithash();
48788Speter 	inittree();
49788Speter #ifdef PI
50788Speter 	initnl();
51788Speter #endif
52788Speter 
53788Speter 	/*
54788Speter 	 * Process the input
55788Speter 	 */
56788Speter 	yyparse();
57788Speter #ifdef PI
58788Speter #   ifdef OBJ
59788Speter 	magic2();
60788Speter #   endif OBJ
61788Speter #   ifdef DEBUG
62788Speter 	dumpnl(0);
63788Speter #   endif
64788Speter #endif
65788Speter #ifdef PXP
66788Speter 	prttab();
67788Speter 	if (onefile) {
68788Speter 		extern int outcol;
69788Speter 
70788Speter 		if (outcol)
71788Speter 			pchr('\n');
72788Speter 		flush();
73788Speter 		if (eflg) {
74788Speter 			writef(2, "File not rewritten because of errors\n");
75788Speter 			pexit(ERRS);
76788Speter 		}
77788Speter 		signal(SIGHUP, SIG_IGN);
78788Speter 		signal(SIGINT, SIG_IGN);
79788Speter 		copyfile();
80788Speter 	}
81788Speter #endif
82788Speter 	pexit(eflg ? ERRS : AOK);
83788Speter }
84788Speter 
85788Speter #ifdef PXP
86788Speter copyfile()
87788Speter {
88788Speter 	extern int fout[];
89788Speter 	register int c;
90788Speter 
91788Speter 	close(1);
92788Speter 	if (creat(firstname, 0644) != 1) {
93788Speter 		perror(firstname);
94788Speter 		pexit(ERRS);
95788Speter 	}
96788Speter 	lseek(fout[0], 0l, 0);
97788Speter 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
98788Speter 		if (write(1, &fout[3], c) != c) {
99788Speter 			perror(firstname);
100788Speter 			pexit(ERRS);
101788Speter 		}
102788Speter 	}
103788Speter }
104788Speter #endif
105788Speter 
106788Speter static
107788Speter struct exec magichdr;
108788Speter 
109788Speter #ifdef PI
110788Speter #ifdef OBJ
111788Speter magic()
112788Speter {
113788Speter 
114788Speter 	short		buf[HEADER_BYTES / sizeof ( short )];
115788Speter 	unsigned	*ubuf = buf;
116788Speter 	register int	hf, i;
117788Speter 
118788Speter 	hf = open(PX_HEADER,0);
119788Speter 	if (hf >= 0 && read(hf, buf, HEADER_BYTES) > sizeof(struct exec)) {
120788Speter 		magichdr.a_magic = ubuf[0];
121788Speter 		magichdr.a_text = ubuf[1];
122788Speter 		magichdr.a_data = ubuf[2];
123788Speter 		magichdr.a_bss = ubuf[3];
124788Speter 		magichdr.a_syms = ubuf[4];
125788Speter 		magichdr.a_entry = ubuf[5];
126788Speter 		magichdr.a_trsize = ubuf[6];
127788Speter 		magichdr.a_drsize = ubuf[7];
128788Speter 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
129788Speter 			word(buf[i]);
130788Speter 	}
131788Speter 	close(hf);
132788Speter }
133788Speter #endif OBJ
134788Speter 
135788Speter #ifdef OBJ
136788Speter magic2()
137788Speter {
138788Speter 	struct pxhdr pxhd;
139788Speter 
140788Speter 	if  (magichdr.a_magic != 0407)
141788Speter 		panic ( "magic2" );
142788Speter 	pflush();
143788Speter 	lseek(ofil, 0l, 0);
144788Speter 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
145788Speter 	magichdr.a_data -= sizeof (struct exec);
146788Speter 	write(ofil, &magichdr, sizeof(struct exec));
147788Speter 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
148*3086Smckusic 	time(&pxhd.maketime);
149788Speter 	pxhd.magicnum = MAGICNUM;
150788Speter 	lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
151788Speter 	write(ofil, &pxhd, sizeof (pxhd));
152788Speter }
153788Speter #endif OBJ
154788Speter #endif
155788Speter 
156788Speter #ifdef PXP
157788Speter writef(i, cp)
158788Speter {
159788Speter 
160788Speter 	write(i, cp, strlen(cp));
161788Speter }
162788Speter #endif
163