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