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