xref: /csrg-svn/usr.bin/f77/pass1.vax/main.c (revision 33254)
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