1*48116Sbostic /*- 2*48116Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48116Sbostic * All rights reserved. 4*48116Sbostic * 5*48116Sbostic * %sccs.include.redist.c% 622208Sdist */ 7788Speter 814748Sthien #ifndef lint 9*48116Sbostic static char sccsid[] = "@(#)yymain.c 5.2 (Berkeley) 04/16/91"; 10*48116Sbostic #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 */ 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 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 } 11814748Sthien (void) lseek(fout[0], 0l, 0); 119788Speter while ((c = read(fout[0], &fout[3], 512)) > 0) { 120788Speter if (write(1, &fout[3], c) != c) { 121788Speter perror(firstname); 122788Speter pexit(ERRS); 123788Speter } 124788Speter } 125788Speter } 126788Speter #endif 127788Speter 12814748Sthien 12914748Sthien #ifdef PI 13014748Sthien #ifdef OBJ 13114748Sthien 132788Speter static 133788Speter struct exec magichdr; 134788Speter 135788Speter magic() 136788Speter { 137788Speter 138788Speter short buf[HEADER_BYTES / sizeof ( short )]; 13914748Sthien unsigned *ubuf = (unsigned *) buf; 140788Speter register int hf, i; 141788Speter 1426627Speter hf = open(px_header,0); 14314748Sthien if (hf >= 0 && read(hf, (char *) buf, HEADER_BYTES) > sizeof(struct exec)) { 144788Speter magichdr.a_magic = ubuf[0]; 145788Speter magichdr.a_text = ubuf[1]; 146788Speter magichdr.a_data = ubuf[2]; 147788Speter magichdr.a_bss = ubuf[3]; 148788Speter magichdr.a_syms = ubuf[4]; 149788Speter magichdr.a_entry = ubuf[5]; 150788Speter magichdr.a_trsize = ubuf[6]; 151788Speter magichdr.a_drsize = ubuf[7]; 152788Speter for (i = 0; i < HEADER_BYTES / sizeof ( short ); i++) 153788Speter word(buf[i]); 154788Speter } 15514748Sthien (void) close(hf); 156788Speter } 157788Speter #endif OBJ 158788Speter 159788Speter #ifdef OBJ 160788Speter magic2() 161788Speter { 162788Speter struct pxhdr pxhd; 16314748Sthien extern long lseek(); 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; 17514748Sthien (void) lseek(ofil, 0l, 0); 17614748Sthien write(ofil, (char *) (&magichdr), sizeof(struct exec)); 17714748Sthien (void) lseek(ofil, ( long ) ( HEADER_BYTES - sizeof ( pxhd ) ) , 0); 17814748Sthien write(ofil, (char *) (&pxhd), sizeof (pxhd)); 179788Speter } 180788Speter #endif OBJ 181788Speter #endif 182788Speter 183788Speter #ifdef PXP 184788Speter writef(i, cp) 185788Speter { 186788Speter 187788Speter write(i, cp, strlen(cp)); 188788Speter } 189788Speter #endif 190