Commit | Line | Data |
---|---|---|
e904799b PK |
1 | /* Copyright (c) 1979 Regents of the University of California */ |
2 | ||
31cef89c | 3 | static char sccsid[] = "@(#)yymain.c 1.1 8/27/80"; |
e904799b PK |
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 |