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