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.3 (Berkeley) 12/04/87"; 9 #endif not lint 10 11 /* 12 * pi - Pascal interpreter code translator 13 * 14 * Charles Haley, Bill Joy UCB 15 * Version 1.2 November 1978 16 * 17 * 18 * pxp - Pascal execution profiler 19 * 20 * Bill Joy UCB 21 * Version 1.2 November 1978 22 */ 23 24 #include "whoami.h" 25 #include "0.h" 26 #include "yy.h" 27 28 int line = 1; 29 30 /* 31 * Yymain initializes each of the utility 32 * clusters and then starts the processing 33 * by calling yyparse. 34 */ 35 yymain() 36 { 37 38 /* 39 * Initialize the scanner 40 */ 41 #ifdef PXP 42 if (bracket == 0) { 43 #endif 44 if (getline() == -1) { 45 Perror(filename, "No lines in file"); 46 pexit(NOSTART); 47 } 48 #ifdef PXP 49 } else 50 yyline = 0; 51 #endif 52 53 #ifdef PI 54 magic(); 55 56 #endif 57 /* 58 * Initialize the clusters 59 * 60 initstring(); 61 */ 62 inithash(); 63 inittree(); 64 #ifdef PI 65 initnl(); 66 #endif 67 68 /* 69 * Process the input 70 */ 71 yyparse(); 72 #ifdef PI 73 magic2(); 74 #ifdef DEBUG 75 dumpnl(0); 76 #endif 77 #endif 78 #ifdef PXP 79 prttab(); 80 if (onefile) { 81 extern int outcol; 82 83 if (outcol) 84 putchar('\n'); 85 flush(); 86 if (eflg) { 87 writef(2, "File not rewritten because of errors\n"); 88 pexit(ERRS); 89 } 90 signal(1, 1); 91 signal(2, 1); 92 copyfile(); 93 } 94 #endif 95 pexit(eflg ? ERRS : AOK); 96 } 97 98 #ifdef PXP 99 copyfile() 100 { 101 register int c; 102 char buf[BUFSIZ]; 103 104 if (freopen(stdoutn, "r", stdin) == NULL) { 105 perror(stdoutn); 106 pexit(ERRS); 107 } 108 if (freopen(firstname, "w", stdout) == NULL) { 109 perror(firstname); 110 pexit(ERRS); 111 } 112 while ((c = getchar()) > 0) 113 putchar(c); 114 if (ferror(stdout)) 115 perror(stdout); 116 } 117 #endif 118 119 static 120 struct { 121 int magic; 122 unsigned txt_size; 123 unsigned data_size; 124 unsigned bss_size; 125 unsigned syms_size; 126 unsigned entry_point; 127 unsigned tr_size; 128 unsigned dr_size; 129 } header; 130 131 #ifdef PI 132 magic() 133 { 134 135 /* 136 * this is the size of /usr/lib/npxheader 137 */ 138 #define HEAD_BYTES 1024 139 short buf[HEAD_BYTES / sizeof ( short )]; 140 unsigned *ubuf = buf; 141 register int hf, i; 142 143 hf = open("/usr/lib/npx_header", 0); 144 if (hf >= 0 && read(hf, buf, HEAD_BYTES) > sizeof header) { 145 header.magic = ubuf[0]; 146 header.txt_size = ubuf[1]; 147 header.data_size = ubuf[2]; 148 header.bss_size = ubuf[3]; 149 header.syms_size = ubuf[4]; 150 header.entry_point = ubuf[5]; 151 header.tr_size = ubuf[6]; 152 header.dr_size = ubuf[7]; 153 for (i = 0; i < HEAD_BYTES / sizeof ( short ); i++) 154 word(buf[i]); 155 } 156 close(hf); 157 word(0404); 158 } 159 160 magic2() 161 { 162 short i; 163 164 if (header.magic != 0407) 165 panic ( "magic2" ); 166 pflush(); 167 lseek(ofil, 0l, 0); 168 header.data_size = ( unsigned ) lc - header.txt_size; 169 header.data_size -= sizeof header; 170 write(ofil, &header, sizeof header); 171 lseek(ofil, ( long ) ( HEAD_BYTES - sizeof ( short ) ) , 0); 172 i = ( ( unsigned ) lc) - HEAD_BYTES; 173 write(ofil, &i, 2); 174 } 175 #endif 176 177 #ifdef PXP 178 writef(i, cp) 179 { 180 181 write(i, cp, strlen(cp)); 182 } 183 #endif 184