xref: /original-bsd/usr.bin/pascal/src/yymain.c (revision 9a96b58b)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)yymain.c 1.4 05/06/82";
4 
5 #include "whoami.h"
6 #include "0.h"
7 #include "yy.h"
8 #include <a.out.h>
9 #include "objfmt.h"
10 #include <signal.h>
11 #include "config.h"
12 
13 /*
14  * Yymain initializes each of the utility
15  * clusters and then starts the processing
16  * by calling yyparse.
17  */
18 yymain()
19 {
20 
21 #ifdef OBJ
22 /*
23  * initialize symbol table temp files
24  */
25 	startnlfile();
26 #endif
27 	/*
28 	 * Initialize the scanner
29 	 */
30 #ifdef PXP
31 	if (bracket == 0) {
32 #endif
33 		if (getline() == -1) {
34 			Perror(filename, "No lines in file");
35 			pexit(NOSTART);
36 		}
37 #ifdef PXP
38 	} else
39 		yyline = 0;
40 #endif
41 
42 #ifdef PI
43 #   ifdef OBJ
44 	magic();
45 #   endif OBJ
46 #endif
47 	line = 1;
48 	errpfx = 'E';
49 	/*
50 	 * Initialize the clusters
51 	 *
52 	initstring();
53 	 */
54 	inithash();
55 	inittree();
56 #ifdef PI
57 	initnl();
58 #endif
59 
60 	/*
61 	 * Process the input
62 	 */
63 	yyparse();
64 #ifdef PI
65 #   ifdef OBJ
66 
67 	/*
68 	 * save outermost block of namelist
69 	 */
70 	savenl(0);
71 
72 	magic2();
73 #   endif OBJ
74 #   ifdef DEBUG
75 	dumpnl(0);
76 #   endif
77 #endif
78 
79 #ifdef PXP
80 	prttab();
81 	if (onefile) {
82 		extern int outcol;
83 
84 		if (outcol)
85 			pchr('\n');
86 		flush();
87 		if (eflg) {
88 			writef(2, "File not rewritten because of errors\n");
89 			pexit(ERRS);
90 		}
91 		signal(SIGHUP, SIG_IGN);
92 		signal(SIGINT, SIG_IGN);
93 		copyfile();
94 	}
95 #endif
96 	pexit(eflg ? ERRS : AOK);
97 }
98 
99 #ifdef PXP
100 copyfile()
101 {
102 	extern int fout[];
103 	register int c;
104 
105 	close(1);
106 	if (creat(firstname, 0644) != 1) {
107 		perror(firstname);
108 		pexit(ERRS);
109 	}
110 	lseek(fout[0], 0l, 0);
111 	while ((c = read(fout[0], &fout[3], 512)) > 0) {
112 		if (write(1, &fout[3], c) != c) {
113 			perror(firstname);
114 			pexit(ERRS);
115 		}
116 	}
117 }
118 #endif
119 
120 static
121 struct exec magichdr;
122 
123 #ifdef PI
124 #ifdef OBJ
125 magic()
126 {
127 
128 	short		buf[HEADER_BYTES / sizeof ( short )];
129 	unsigned	*ubuf = buf;
130 	register int	hf, i;
131 
132 	hf = open(px_header,0);
133 	if (hf >= 0 && read(hf, buf, HEADER_BYTES) > sizeof(struct exec)) {
134 		magichdr.a_magic = ubuf[0];
135 		magichdr.a_text = ubuf[1];
136 		magichdr.a_data = ubuf[2];
137 		magichdr.a_bss = ubuf[3];
138 		magichdr.a_syms = ubuf[4];
139 		magichdr.a_entry = ubuf[5];
140 		magichdr.a_trsize = ubuf[6];
141 		magichdr.a_drsize = ubuf[7];
142 		for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++)
143 			word(buf[i]);
144 	}
145 	close(hf);
146 }
147 #endif OBJ
148 
149 #ifdef OBJ
150 magic2()
151 {
152 	struct pxhdr pxhd;
153 
154 	if  (magichdr.a_magic != 0407)
155 		panic ( "magic2" );
156 	pflush();
157 	magichdr.a_data = ( unsigned ) lc - magichdr.a_text;
158 	magichdr.a_data -= sizeof (struct exec);
159 	pxhd.objsize = ( ( unsigned ) lc) - HEADER_BYTES;
160 	pxhd.symtabsize = nlhdrsize();
161 	magichdr.a_data += pxhd.symtabsize;
162 	time(&pxhd.maketime);
163 	pxhd.magicnum = MAGICNUM;
164 	lseek(ofil, 0l, 0);
165 	write(ofil, &magichdr, sizeof(struct exec));
166 	lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0);
167 	write(ofil, &pxhd, sizeof (pxhd));
168 }
169 #endif OBJ
170 #endif
171 
172 #ifdef PXP
173 writef(i, cp)
174 {
175 
176 	write(i, cp, strlen(cp));
177 }
178 #endif
179