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