1*22844Smckusick /* 2*22844Smckusick * Copyright (c) 1980 Regents of the University of California. 3*22844Smckusick * All rights reserved. The Berkeley software License Agreement 4*22844Smckusick * specifies the terms and conditions for redistribution. 5*22844Smckusick */ 6*22844Smckusick 7*22844Smckusick #ifndef lint 8*22844Smckusick char copyright[] = 9*22844Smckusick "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 10*22844Smckusick All rights reserved.\n"; 11*22844Smckusick #endif not lint 12*22844Smckusick 13*22844Smckusick #ifndef lint 14*22844Smckusick static char sccsid[] = "@(#)main.c 5.1 (Berkeley) 06/07/85"; 15*22844Smckusick #endif not lint 16*22844Smckusick 17*22844Smckusick /* 18*22844Smckusick * main.c 19*22844Smckusick * 20*22844Smckusick * Main routine for the f77 compiler, pass 1, 4.2 BSD. 21*22844Smckusick * 22*22844Smckusick * University of Utah CS Dept modification history: 23*22844Smckusick * 24*22844Smckusick * $Log: main.c,v $ 25*22844Smckusick * Revision 3.2 85/01/14 04:21:31 donn 26*22844Smckusick * Added changes to implement Jerry's '-q' option. 27*22844Smckusick * 28*22844Smckusick * Revision 3.1 84/10/29 05:47:03 donn 29*22844Smckusick * Added Jerry Berkman's change to line buffer stderr. 30*22844Smckusick * 31*22844Smckusick */ 32*22844Smckusick 33*22844Smckusick char *xxxvers[] = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10, 16 AUGUST 1980\n"; 34*22844Smckusick 35*22844Smckusick #include "defs.h" 36*22844Smckusick #include <signal.h> 37*22844Smckusick 38*22844Smckusick #ifdef SDB 39*22844Smckusick # include <a.out.h> 40*22844Smckusick # ifndef N_SO 41*22844Smckusick # include <stab.h> 42*22844Smckusick # endif 43*22844Smckusick #endif 44*22844Smckusick 45*22844Smckusick 46*22844Smckusick LOCAL char *textname = ""; 47*22844Smckusick LOCAL char *asmname = ""; 48*22844Smckusick LOCAL char *initname = ""; 49*22844Smckusick 50*22844Smckusick 51*22844Smckusick extern intexit(); 52*22844Smckusick 53*22844Smckusick flag namesflag = YES; 54*22844Smckusick 55*22844Smckusick 56*22844Smckusick 57*22844Smckusick main(argc, argv) 58*22844Smckusick int argc; 59*22844Smckusick char **argv; 60*22844Smckusick { 61*22844Smckusick char *s; 62*22844Smckusick int k, retcode, *ip; 63*22844Smckusick FILEP opf(); 64*22844Smckusick int flovflo(); 65*22844Smckusick 66*22844Smckusick #define DONE(c) { retcode = c; goto finis; } 67*22844Smckusick 68*22844Smckusick signal(SIGFPE, flovflo); /* catch overflows */ 69*22844Smckusick signal(SIGINT, intexit); 70*22844Smckusick 71*22844Smckusick #if HERE == PDP11 72*22844Smckusick ldfps(01200); /* trap on overflow */ 73*22844Smckusick #endif 74*22844Smckusick 75*22844Smckusick 76*22844Smckusick setlinebuf(diagfile); 77*22844Smckusick 78*22844Smckusick --argc; 79*22844Smckusick ++argv; 80*22844Smckusick 81*22844Smckusick while(argc>0 && argv[0][0]=='-') 82*22844Smckusick { 83*22844Smckusick for(s = argv[0]+1 ; *s ; ++s) switch(*s) 84*22844Smckusick { 85*22844Smckusick case 'w': 86*22844Smckusick if(s[1]=='6' && s[2]=='6') 87*22844Smckusick { 88*22844Smckusick ftn66flag = YES; 89*22844Smckusick s += 2; 90*22844Smckusick } 91*22844Smckusick else 92*22844Smckusick nowarnflag = YES; 93*22844Smckusick break; 94*22844Smckusick 95*22844Smckusick case 'U': 96*22844Smckusick shiftcase = NO; 97*22844Smckusick break; 98*22844Smckusick 99*22844Smckusick case 'u': 100*22844Smckusick undeftype = YES; 101*22844Smckusick break; 102*22844Smckusick 103*22844Smckusick case 'O': 104*22844Smckusick optimflag = YES; 105*22844Smckusick break; 106*22844Smckusick 107*22844Smckusick case 'd': 108*22844Smckusick debugflag[0] = YES; 109*22844Smckusick 110*22844Smckusick while (*s == 'd' || *s == ',') 111*22844Smckusick { 112*22844Smckusick k = 0; 113*22844Smckusick while( isdigit(*++s) ) 114*22844Smckusick k = 10*k + (*s - '0'); 115*22844Smckusick if(k < 0 || k >= MAXDEBUGFLAG) 116*22844Smckusick fatali("bad debug number %d",k); 117*22844Smckusick debugflag[k] = YES; 118*22844Smckusick } 119*22844Smckusick break; 120*22844Smckusick 121*22844Smckusick case 'p': 122*22844Smckusick profileflag = YES; 123*22844Smckusick break; 124*22844Smckusick 125*22844Smckusick case 'C': 126*22844Smckusick checksubs = YES; 127*22844Smckusick break; 128*22844Smckusick 129*22844Smckusick case '6': 130*22844Smckusick no66flag = YES; 131*22844Smckusick noextflag = YES; 132*22844Smckusick break; 133*22844Smckusick 134*22844Smckusick case '1': 135*22844Smckusick onetripflag = YES; 136*22844Smckusick break; 137*22844Smckusick 138*22844Smckusick #ifdef SDB 139*22844Smckusick case 'g': 140*22844Smckusick sdbflag = YES; 141*22844Smckusick break; 142*22844Smckusick #endif 143*22844Smckusick 144*22844Smckusick case 'q': 145*22844Smckusick namesflag = NO; 146*22844Smckusick break; 147*22844Smckusick 148*22844Smckusick case 'N': 149*22844Smckusick switch(*++s) 150*22844Smckusick { 151*22844Smckusick case 'q': 152*22844Smckusick ip = &maxequiv; goto getnum; 153*22844Smckusick case 'x': 154*22844Smckusick ip = &maxext; goto getnum; 155*22844Smckusick case 's': 156*22844Smckusick ip = &maxstno; goto getnum; 157*22844Smckusick case 'c': 158*22844Smckusick ip = &maxctl; goto getnum; 159*22844Smckusick case 'n': 160*22844Smckusick ip = &maxhash; goto getnum; 161*22844Smckusick 162*22844Smckusick default: 163*22844Smckusick fatali("invalid flag -N%c", *s); 164*22844Smckusick } 165*22844Smckusick getnum: 166*22844Smckusick k = 0; 167*22844Smckusick while( isdigit(*++s) ) 168*22844Smckusick k = 10*k + (*s - '0'); 169*22844Smckusick if(k <= 0) 170*22844Smckusick fatal("Table size too small"); 171*22844Smckusick *ip = k; 172*22844Smckusick break; 173*22844Smckusick 174*22844Smckusick case 'i': 175*22844Smckusick if(*++s == '2') 176*22844Smckusick tyint = TYSHORT; 177*22844Smckusick else if(*s == '4') 178*22844Smckusick { 179*22844Smckusick shortsubs = NO; 180*22844Smckusick tyint = TYLONG; 181*22844Smckusick } 182*22844Smckusick else if(*s == 's') 183*22844Smckusick shortsubs = YES; 184*22844Smckusick else 185*22844Smckusick fatali("invalid flag -i%c\n", *s); 186*22844Smckusick tylogical = tyint; 187*22844Smckusick break; 188*22844Smckusick 189*22844Smckusick default: 190*22844Smckusick fatali("invalid flag %c\n", *s); 191*22844Smckusick } 192*22844Smckusick --argc; 193*22844Smckusick ++argv; 194*22844Smckusick } 195*22844Smckusick 196*22844Smckusick if(argc != 4) 197*22844Smckusick fatali("arg count %d", argc); 198*22844Smckusick textname = argv[3]; 199*22844Smckusick initname = argv[2]; 200*22844Smckusick asmname = argv[1]; 201*22844Smckusick asmfile = opf(argv[1]); 202*22844Smckusick initfile = opf(argv[2]); 203*22844Smckusick textfile = opf(argv[3]); 204*22844Smckusick 205*22844Smckusick initkey(); 206*22844Smckusick if(inilex( copys(argv[0]) )) 207*22844Smckusick DONE(1); 208*22844Smckusick if(namesflag == YES) 209*22844Smckusick fprintf(diagfile, "%s:\n", argv[0]); 210*22844Smckusick 211*22844Smckusick #ifdef SDB 212*22844Smckusick filenamestab(argv[0]); 213*22844Smckusick #endif 214*22844Smckusick 215*22844Smckusick fileinit(); 216*22844Smckusick procinit(); 217*22844Smckusick if(k = yyparse()) 218*22844Smckusick { 219*22844Smckusick fprintf(diagfile, "Bad parse, return code %d\n", k); 220*22844Smckusick DONE(1); 221*22844Smckusick } 222*22844Smckusick if(nerr > 0) 223*22844Smckusick DONE(1); 224*22844Smckusick if(parstate != OUTSIDE) 225*22844Smckusick { 226*22844Smckusick warn("missing END statement"); 227*22844Smckusick endproc(); 228*22844Smckusick } 229*22844Smckusick doext(); 230*22844Smckusick preven(ALIDOUBLE); 231*22844Smckusick prtail(); 232*22844Smckusick #if FAMILY==PCC 233*22844Smckusick puteof(); 234*22844Smckusick #endif 235*22844Smckusick 236*22844Smckusick if(nerr > 0) 237*22844Smckusick DONE(1); 238*22844Smckusick DONE(0); 239*22844Smckusick 240*22844Smckusick 241*22844Smckusick finis: 242*22844Smckusick done(retcode); 243*22844Smckusick } 244*22844Smckusick 245*22844Smckusick 246*22844Smckusick 247*22844Smckusick done(k) 248*22844Smckusick int k; 249*22844Smckusick { 250*22844Smckusick static char *ioerror = "i/o error on intermediate file %s\n"; 251*22844Smckusick 252*22844Smckusick if (textfile != NULL && textfile != stdout) 253*22844Smckusick { 254*22844Smckusick if (ferror(textfile)) 255*22844Smckusick { 256*22844Smckusick fprintf(diagfile, ioerror, textname); 257*22844Smckusick k = 3; 258*22844Smckusick } 259*22844Smckusick fclose(textfile); 260*22844Smckusick } 261*22844Smckusick 262*22844Smckusick if (asmfile != NULL && asmfile != stdout) 263*22844Smckusick { 264*22844Smckusick if (ferror(asmfile)) 265*22844Smckusick { 266*22844Smckusick fprintf(diagfile, ioerror, asmname); 267*22844Smckusick k = 3; 268*22844Smckusick } 269*22844Smckusick fclose(asmfile); 270*22844Smckusick } 271*22844Smckusick 272*22844Smckusick if (initfile != NULL && initfile != stdout) 273*22844Smckusick { 274*22844Smckusick if (ferror(initfile)) 275*22844Smckusick { 276*22844Smckusick fprintf(diagfile, ioerror, initname); 277*22844Smckusick k = 3; 278*22844Smckusick } 279*22844Smckusick fclose(initfile); 280*22844Smckusick } 281*22844Smckusick 282*22844Smckusick rmtmpfiles(); 283*22844Smckusick 284*22844Smckusick exit(k); 285*22844Smckusick } 286*22844Smckusick 287*22844Smckusick 288*22844Smckusick LOCAL FILEP opf(fn) 289*22844Smckusick char *fn; 290*22844Smckusick { 291*22844Smckusick FILEP fp; 292*22844Smckusick if( fp = fopen(fn, "w") ) 293*22844Smckusick return(fp); 294*22844Smckusick 295*22844Smckusick fatalstr("cannot open intermediate file %s", fn); 296*22844Smckusick /* NOTREACHED */ 297*22844Smckusick } 298*22844Smckusick 299*22844Smckusick 300*22844Smckusick 301*22844Smckusick clf(p) 302*22844Smckusick FILEP *p; 303*22844Smckusick { 304*22844Smckusick if(p!=NULL && *p!=NULL && *p!=stdout) 305*22844Smckusick { 306*22844Smckusick if(ferror(*p)) 307*22844Smckusick fatal("writing error"); 308*22844Smckusick fclose(*p); 309*22844Smckusick } 310*22844Smckusick *p = NULL; 311*22844Smckusick } 312*22844Smckusick 313*22844Smckusick 314*22844Smckusick 315*22844Smckusick 316*22844Smckusick flovflo() 317*22844Smckusick { 318*22844Smckusick err("floating exception during constant evaluation"); 319*22844Smckusick #if HERE == VAX 320*22844Smckusick fatal("vax cannot recover from floating exception"); 321*22844Smckusick rmtmpfiles(); 322*22844Smckusick /* vax returns a reserved operand that generates 323*22844Smckusick an illegal operand fault on next instruction, 324*22844Smckusick which if ignored causes an infinite loop. 325*22844Smckusick */ 326*22844Smckusick #endif 327*22844Smckusick signal(SIGFPE, flovflo); 328*22844Smckusick } 329*22844Smckusick 330*22844Smckusick 331*22844Smckusick 332*22844Smckusick rmtmpfiles() 333*22844Smckusick { 334*22844Smckusick close(vdatafile); 335*22844Smckusick unlink(vdatafname); 336*22844Smckusick close(vchkfile); 337*22844Smckusick unlink(vchkfname); 338*22844Smckusick close(cdatafile); 339*22844Smckusick unlink(cdatafname); 340*22844Smckusick close(cchkfile); 341*22844Smckusick unlink(cchkfname); 342*22844Smckusick } 343*22844Smckusick 344*22844Smckusick 345*22844Smckusick 346*22844Smckusick intexit() 347*22844Smckusick { 348*22844Smckusick done(1); 349*22844Smckusick } 350