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