122844Smckusick /* 222844Smckusick * Copyright (c) 1980 Regents of the University of California. 322844Smckusick * All rights reserved. The Berkeley software License Agreement 422844Smckusick * specifies the terms and conditions for redistribution. 522844Smckusick */ 622844Smckusick 722844Smckusick #ifndef lint 822844Smckusick char copyright[] = 922844Smckusick "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 1022844Smckusick All rights reserved.\n"; 11*33254Sbostic #endif /* not lint */ 1222844Smckusick 1322844Smckusick #ifndef lint 14*33254Sbostic static char sccsid[] = "@(#)main.c 5.3 (Berkeley) 01/03/88"; 15*33254Sbostic #endif /* not lint */ 1622844Smckusick 1722844Smckusick /* 1822844Smckusick * main.c 1922844Smckusick * 2022844Smckusick * Main routine for the f77 compiler, pass 1, 4.2 BSD. 2122844Smckusick * 2222844Smckusick * University of Utah CS Dept modification history: 2322844Smckusick * 2422844Smckusick * $Log: main.c,v $ 2524482Sdonn * Revision 5.2 85/08/10 04:57:16 donn 2624482Sdonn * Jerry Berkman's changes to ifdef 66 code and add -r8/double flag.. 2724482Sdonn * 2824482Sdonn * Revision 5.1 85/08/10 03:48:26 donn 2924482Sdonn * 4.3 alpha 3024482Sdonn * 3122844Smckusick * Revision 3.2 85/01/14 04:21:31 donn 3222844Smckusick * Added changes to implement Jerry's '-q' option. 3322844Smckusick * 3422844Smckusick * Revision 3.1 84/10/29 05:47:03 donn 3522844Smckusick * Added Jerry Berkman's change to line buffer stderr. 3622844Smckusick * 3722844Smckusick */ 3822844Smckusick 39*33254Sbostic char *xxxvers = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10, 16 AUGUST 1980\n"; 4022844Smckusick 4122844Smckusick #include "defs.h" 4222844Smckusick #include <signal.h> 4322844Smckusick 4422844Smckusick #ifdef SDB 4522844Smckusick # include <a.out.h> 4622844Smckusick # ifndef N_SO 4722844Smckusick # include <stab.h> 4822844Smckusick # endif 4922844Smckusick #endif 5022844Smckusick 5122844Smckusick 5222844Smckusick LOCAL char *textname = ""; 5322844Smckusick LOCAL char *asmname = ""; 5422844Smckusick LOCAL char *initname = ""; 5522844Smckusick 5622844Smckusick 5722844Smckusick extern intexit(); 5822844Smckusick 5922844Smckusick flag namesflag = YES; 6022844Smckusick 6122844Smckusick 6222844Smckusick 6322844Smckusick main(argc, argv) 6422844Smckusick int argc; 6522844Smckusick char **argv; 6622844Smckusick { 6722844Smckusick char *s; 6822844Smckusick int k, retcode, *ip; 6922844Smckusick FILEP opf(); 7022844Smckusick int flovflo(); 7122844Smckusick 7222844Smckusick #define DONE(c) { retcode = c; goto finis; } 7322844Smckusick 7422844Smckusick signal(SIGFPE, flovflo); /* catch overflows */ 7522844Smckusick signal(SIGINT, intexit); 7622844Smckusick 7722844Smckusick #if HERE == PDP11 7822844Smckusick ldfps(01200); /* trap on overflow */ 7922844Smckusick #endif 8022844Smckusick 8122844Smckusick 8222844Smckusick setlinebuf(diagfile); 8322844Smckusick 8422844Smckusick --argc; 8522844Smckusick ++argv; 8622844Smckusick 8722844Smckusick while(argc>0 && argv[0][0]=='-') 8822844Smckusick { 8922844Smckusick for(s = argv[0]+1 ; *s ; ++s) switch(*s) 9022844Smckusick { 9122844Smckusick case 'w': 9222844Smckusick if(s[1]=='6' && s[2]=='6') 9322844Smckusick { 9422844Smckusick ftn66flag = YES; 9522844Smckusick s += 2; 9622844Smckusick } 9722844Smckusick else 9822844Smckusick nowarnflag = YES; 9922844Smckusick break; 10022844Smckusick 10122844Smckusick case 'U': 10222844Smckusick shiftcase = NO; 10322844Smckusick break; 10422844Smckusick 10522844Smckusick case 'u': 10622844Smckusick undeftype = YES; 10722844Smckusick break; 10822844Smckusick 10922844Smckusick case 'O': 11022844Smckusick optimflag = YES; 11122844Smckusick break; 11222844Smckusick 11322844Smckusick case 'd': 11422844Smckusick debugflag[0] = YES; 11522844Smckusick 11622844Smckusick while (*s == 'd' || *s == ',') 11722844Smckusick { 11822844Smckusick k = 0; 11922844Smckusick while( isdigit(*++s) ) 12022844Smckusick k = 10*k + (*s - '0'); 12122844Smckusick if(k < 0 || k >= MAXDEBUGFLAG) 12222844Smckusick fatali("bad debug number %d",k); 12322844Smckusick debugflag[k] = YES; 12422844Smckusick } 12522844Smckusick break; 12622844Smckusick 12722844Smckusick case 'p': 12822844Smckusick profileflag = YES; 12922844Smckusick break; 13022844Smckusick 13124482Sdonn case '8': 13224482Sdonn dblflag = YES; 13324482Sdonn break; 13424482Sdonn 13522844Smckusick case 'C': 13622844Smckusick checksubs = YES; 13722844Smckusick break; 13822844Smckusick 13924482Sdonn #ifdef ONLY66 14022844Smckusick case '6': 14122844Smckusick no66flag = YES; 14222844Smckusick noextflag = YES; 14322844Smckusick break; 14424482Sdonn #endif 14522844Smckusick 14622844Smckusick case '1': 14722844Smckusick onetripflag = YES; 14822844Smckusick break; 14922844Smckusick 15022844Smckusick #ifdef SDB 15122844Smckusick case 'g': 15222844Smckusick sdbflag = YES; 15322844Smckusick break; 15422844Smckusick #endif 15522844Smckusick 15622844Smckusick case 'q': 15722844Smckusick namesflag = NO; 15822844Smckusick break; 15922844Smckusick 16022844Smckusick case 'N': 16122844Smckusick switch(*++s) 16222844Smckusick { 16322844Smckusick case 'q': 16422844Smckusick ip = &maxequiv; goto getnum; 16522844Smckusick case 'x': 16622844Smckusick ip = &maxext; goto getnum; 16722844Smckusick case 's': 16822844Smckusick ip = &maxstno; goto getnum; 16922844Smckusick case 'c': 17022844Smckusick ip = &maxctl; goto getnum; 17122844Smckusick case 'n': 17222844Smckusick ip = &maxhash; goto getnum; 17322844Smckusick 17422844Smckusick default: 17522844Smckusick fatali("invalid flag -N%c", *s); 17622844Smckusick } 17722844Smckusick getnum: 17822844Smckusick k = 0; 17922844Smckusick while( isdigit(*++s) ) 18022844Smckusick k = 10*k + (*s - '0'); 18122844Smckusick if(k <= 0) 18222844Smckusick fatal("Table size too small"); 18322844Smckusick *ip = k; 18422844Smckusick break; 18522844Smckusick 18622844Smckusick case 'i': 18722844Smckusick if(*++s == '2') 18822844Smckusick tyint = TYSHORT; 18922844Smckusick else if(*s == '4') 19022844Smckusick { 19122844Smckusick shortsubs = NO; 19222844Smckusick tyint = TYLONG; 19322844Smckusick } 19422844Smckusick else if(*s == 's') 19522844Smckusick shortsubs = YES; 19622844Smckusick else 19722844Smckusick fatali("invalid flag -i%c\n", *s); 19822844Smckusick tylogical = tyint; 19922844Smckusick break; 20022844Smckusick 20122844Smckusick default: 20222844Smckusick fatali("invalid flag %c\n", *s); 20322844Smckusick } 20422844Smckusick --argc; 20522844Smckusick ++argv; 20622844Smckusick } 20722844Smckusick 20822844Smckusick if(argc != 4) 20922844Smckusick fatali("arg count %d", argc); 21022844Smckusick textname = argv[3]; 21122844Smckusick initname = argv[2]; 21222844Smckusick asmname = argv[1]; 21322844Smckusick asmfile = opf(argv[1]); 21422844Smckusick initfile = opf(argv[2]); 21522844Smckusick textfile = opf(argv[3]); 21622844Smckusick 21722844Smckusick initkey(); 21822844Smckusick if(inilex( copys(argv[0]) )) 21922844Smckusick DONE(1); 22022844Smckusick if(namesflag == YES) 22122844Smckusick fprintf(diagfile, "%s:\n", argv[0]); 22222844Smckusick 22322844Smckusick #ifdef SDB 22422844Smckusick filenamestab(argv[0]); 22522844Smckusick #endif 22622844Smckusick 22722844Smckusick fileinit(); 22822844Smckusick procinit(); 22922844Smckusick if(k = yyparse()) 23022844Smckusick { 23122844Smckusick fprintf(diagfile, "Bad parse, return code %d\n", k); 23222844Smckusick DONE(1); 23322844Smckusick } 23422844Smckusick if(nerr > 0) 23522844Smckusick DONE(1); 23622844Smckusick if(parstate != OUTSIDE) 23722844Smckusick { 23822844Smckusick warn("missing END statement"); 23922844Smckusick endproc(); 24022844Smckusick } 24122844Smckusick doext(); 24222844Smckusick preven(ALIDOUBLE); 24322844Smckusick prtail(); 24422844Smckusick #if FAMILY==PCC 24522844Smckusick puteof(); 24622844Smckusick #endif 24722844Smckusick 24822844Smckusick if(nerr > 0) 24922844Smckusick DONE(1); 25022844Smckusick DONE(0); 25122844Smckusick 25222844Smckusick 25322844Smckusick finis: 25422844Smckusick done(retcode); 25522844Smckusick } 25622844Smckusick 25722844Smckusick 25822844Smckusick 25922844Smckusick done(k) 26022844Smckusick int k; 26122844Smckusick { 26222844Smckusick static char *ioerror = "i/o error on intermediate file %s\n"; 26322844Smckusick 26422844Smckusick if (textfile != NULL && textfile != stdout) 26522844Smckusick { 26622844Smckusick if (ferror(textfile)) 26722844Smckusick { 26822844Smckusick fprintf(diagfile, ioerror, textname); 26922844Smckusick k = 3; 27022844Smckusick } 27122844Smckusick fclose(textfile); 27222844Smckusick } 27322844Smckusick 27422844Smckusick if (asmfile != NULL && asmfile != stdout) 27522844Smckusick { 27622844Smckusick if (ferror(asmfile)) 27722844Smckusick { 27822844Smckusick fprintf(diagfile, ioerror, asmname); 27922844Smckusick k = 3; 28022844Smckusick } 28122844Smckusick fclose(asmfile); 28222844Smckusick } 28322844Smckusick 28422844Smckusick if (initfile != NULL && initfile != stdout) 28522844Smckusick { 28622844Smckusick if (ferror(initfile)) 28722844Smckusick { 28822844Smckusick fprintf(diagfile, ioerror, initname); 28922844Smckusick k = 3; 29022844Smckusick } 29122844Smckusick fclose(initfile); 29222844Smckusick } 29322844Smckusick 29422844Smckusick rmtmpfiles(); 29522844Smckusick 29622844Smckusick exit(k); 29722844Smckusick } 29822844Smckusick 29922844Smckusick 30022844Smckusick LOCAL FILEP opf(fn) 30122844Smckusick char *fn; 30222844Smckusick { 30322844Smckusick FILEP fp; 30422844Smckusick if( fp = fopen(fn, "w") ) 30522844Smckusick return(fp); 30622844Smckusick 30722844Smckusick fatalstr("cannot open intermediate file %s", fn); 30822844Smckusick /* NOTREACHED */ 30922844Smckusick } 31022844Smckusick 31122844Smckusick 31222844Smckusick 31322844Smckusick clf(p) 31422844Smckusick FILEP *p; 31522844Smckusick { 31622844Smckusick if(p!=NULL && *p!=NULL && *p!=stdout) 31722844Smckusick { 31822844Smckusick if(ferror(*p)) 31922844Smckusick fatal("writing error"); 32022844Smckusick fclose(*p); 32122844Smckusick } 32222844Smckusick *p = NULL; 32322844Smckusick } 32422844Smckusick 32522844Smckusick 32622844Smckusick 32722844Smckusick 32822844Smckusick flovflo() 32922844Smckusick { 33022844Smckusick err("floating exception during constant evaluation"); 33122844Smckusick #if HERE == VAX 33222844Smckusick fatal("vax cannot recover from floating exception"); 33322844Smckusick rmtmpfiles(); 33422844Smckusick /* vax returns a reserved operand that generates 33522844Smckusick an illegal operand fault on next instruction, 33622844Smckusick which if ignored causes an infinite loop. 33722844Smckusick */ 33822844Smckusick #endif 33922844Smckusick signal(SIGFPE, flovflo); 34022844Smckusick } 34122844Smckusick 34222844Smckusick 34322844Smckusick 34422844Smckusick rmtmpfiles() 34522844Smckusick { 34622844Smckusick close(vdatafile); 34722844Smckusick unlink(vdatafname); 34822844Smckusick close(vchkfile); 34922844Smckusick unlink(vchkfname); 35022844Smckusick close(cdatafile); 35122844Smckusick unlink(cdatafname); 35222844Smckusick close(cchkfile); 35322844Smckusick unlink(cchkfname); 35422844Smckusick } 35522844Smckusick 35622844Smckusick 35722844Smckusick 35822844Smckusick intexit() 35922844Smckusick { 36022844Smckusick done(1); 36122844Smckusick } 362