xref: /csrg-svn/usr.bin/f77/f77.vax/f77.c (revision 47931)
1*47931Sbostic /*-
2*47931Sbostic  * Copyright (c) 1985 The Regents of the University of California.
3*47931Sbostic  * All rights reserved.
4*47931Sbostic  *
5*47931Sbostic  * %sccs.include.proprietary.c%
624472Sdonn  */
724472Sdonn 
824472Sdonn #ifndef lint
9*47931Sbostic char copyright[] =
10*47931Sbostic "@(#) Copyright (c) 1985 The Regents of the University of California.\n\
11*47931Sbostic  All rights reserved.\n";
12*47931Sbostic #endif /* not lint */
1324472Sdonn 
14*47931Sbostic #ifndef lint
15*47931Sbostic static char sccsid[] = "@(#)f77.c	5.8 (Berkeley) 04/12/91";
16*47931Sbostic #endif /* not lint */
17*47931Sbostic 
1824472Sdonn /*
1924472Sdonn  * f77.c
2024472Sdonn  *
2124472Sdonn  * Driver program for the 4.2 BSD f77 compiler.
2224472Sdonn  *
2324472Sdonn  * University of Utah CS Dept modification history:
2424472Sdonn  *
2524472Sdonn  * $Log:	f77.c,v $
2625734Sdonn  * Revision 5.4  85/12/17  19:12:14  donn
2725734Sdonn  * Dynamically allocate buffer; add lint fixes.
2825734Sdonn  *
2925734Sdonn  * Revision 5.3  85/11/25  00:00:02  donn
3025734Sdonn  * 4.3 beta
3125734Sdonn  *
3224473Sdonn  * Revision 5.2  85/08/10  05:16:14  donn
3324473Sdonn  * Ifdeffed 66 code, added -r8 flag.  From Jerry Berkman.
3424473Sdonn  *
3524473Sdonn  * Revision 5.1  85/08/10  03:32:12  donn
3624473Sdonn  * 4.3 alpha
3724473Sdonn  *
3824472Sdonn  * Revision 1.14  85/03/01  00:07:57  donn
3924472Sdonn  * Portability fix from Ralph Campbell.
4024472Sdonn  *
4124472Sdonn  * Revision 1.13  85/02/12  19:31:47  donn
4224472Sdonn  * Use CATNAME to get the name of a concatenation command instead of
4324472Sdonn  * explicitly running 'cat' -- you can get the wrong 'cat' the old way!
4424472Sdonn  *
4524472Sdonn  * Revision 1.12  85/01/14  06:42:30  donn
4624472Sdonn  * Changed to call the peephole optimizer with the '-f' flag, so that
4724472Sdonn  * floating point moves are translated to integer moves.
4824472Sdonn  *
4924472Sdonn  * Revision 1.11  85/01/14  04:38:59  donn
5024472Sdonn  * Jerry's change to pass -O to f1 so it knows whether the peephole optimizer
5124472Sdonn  * will be run.  This is necessary in order to handle movf/movl translation.
5224472Sdonn  *
5324472Sdonn  * Revision 1.10  85/01/14  03:59:12  donn
5424472Sdonn  * Added Jerry Berkman's fix for the '-q' flag.
5524472Sdonn  *
5624472Sdonn  * Revision 1.9  84/11/09  01:51:26  donn
5724472Sdonn  * Cosmetic change to stupid() suggested by John McCarthy at Memorial
5824472Sdonn  * University, St. Johns.
5924472Sdonn  *
6024472Sdonn  * Revision 1.8  84/09/14  16:02:34  donn
6124472Sdonn  * Added changes to notice when people do 'f77 -c foo.f -o bar.o' and tell
6224472Sdonn  * them why it doesn't do what they think it does.
6324472Sdonn  *
6424472Sdonn  * Revision 1.7  84/08/24  21:08:31  donn
6524472Sdonn  * Added call to setrlimit() to prevent core dumps when not debugging.
6624472Sdonn  * Reorganized the include file arrangment somewhat.
6724472Sdonn  *
6824472Sdonn  * Revision 1.6  84/08/24  20:20:24  donn
6924472Sdonn  * Changed stupidity check on Jerry Berkman's suggestion -- now it balks if
7024472Sdonn  * the load file exists and has a sensitive suffix.
7124472Sdonn  *
7224472Sdonn  * Revision 1.5  84/08/15  18:56:44  donn
7324472Sdonn  * Added test for -O combined with -g, suggested by Raleigh Romine.  To keep
7424472Sdonn  * things simple, if both are specified then the second in the list is thrown
7524472Sdonn  * out and the user is warned.
7624472Sdonn  *
7724472Sdonn  * Revision 1.4  84/08/05  21:33:15  donn
7824472Sdonn  * Added stupidity check -- f77 won't load on a file that it's asked to
7924472Sdonn  * compile as well.
8024472Sdonn  *
8124472Sdonn  * Revision 1.3  84/08/04  22:58:24  donn
8224472Sdonn  * Improved error reporting -- we now explain why we died and what we did.
8324472Sdonn  * Only works on 4.2.  Added at the instigation of Jerry Berkman.
8424472Sdonn  *
8524472Sdonn  * Revision 1.2  84/07/28  13:11:24  donn
8624472Sdonn  * Added Ralph Campbell's changes to reduce offsets to data.
8724472Sdonn  *
8824472Sdonn  */
8924472Sdonn 
9033259Sbostic char *xxxvers = "\n@(#) F77 DRIVER, VERSION 4.2,   1984 JULY 28\n";
9124472Sdonn #include <sys/types.h>
9224472Sdonn #include <sys/stat.h>
9337794Sbostic #include <sys/signal.h>
9424472Sdonn #include <ctype.h>
9537794Sbostic #include <stdio.h>
9624472Sdonn 
9724472Sdonn #ifdef	SIGPROF
9824472Sdonn /*
9924472Sdonn  * Some 4.2 BSD capabilities.
10024472Sdonn  */
10124472Sdonn #include <sys/time.h>
10224472Sdonn #include <sys/resource.h>
10324472Sdonn #define	NOCORE		1
10424472Sdonn #include <sys/wait.h>
10524472Sdonn #define PSIGNAL		1
10624472Sdonn #endif
10724472Sdonn 
10824472Sdonn #include "defines.h"
10924472Sdonn #include "machdefs.h"
11037794Sbostic #include "pathnames.h"
11124472Sdonn #include "version.h"
11224472Sdonn 
11324472Sdonn static FILEP diagfile	= {stderr} ;
11424472Sdonn static int pid;
11524472Sdonn static int sigivalue	= 0;
11624472Sdonn static int sigqvalue	= 0;
11724472Sdonn static int sighvalue	= 0;
11824472Sdonn static int sigtvalue	= 0;
11924472Sdonn 
12024472Sdonn static char *pass1name	= PASS1NAME ;
12124472Sdonn static char *pass2name	= PASS2NAME ;
12224472Sdonn static char *pass2opt	= PASS2OPT ;
12324472Sdonn static char *asmname	= ASMNAME ;
12424472Sdonn static char *ldname	= LDNAME ;
12524472Sdonn static char *footname	= FOOTNAME;
12624472Sdonn static char *proffoot	= PROFFOOT;
12724472Sdonn static char *macroname	= "m4";
12837794Sbostic static char *shellname	= _PATH_BSHELL;
12937794Sbostic static char *cppname	= _PATH_CPP;
13024472Sdonn static char *aoutname	= "a.out" ;
13124472Sdonn static char *temppref	= TEMPPREF;
13224472Sdonn 
13324472Sdonn static char *infname;
13424472Sdonn static char textfname[44];
13524472Sdonn static char asmfname[44];
13624472Sdonn static char asmpass2[44];
13724472Sdonn static char initfname[44];
13824472Sdonn static char sortfname[44];
13924472Sdonn static char prepfname[44];
14024472Sdonn static char objfdefault[44];
14124472Sdonn static char optzfname[44];
14224472Sdonn static char setfname[44];
14324472Sdonn 
14424472Sdonn static char fflags[50]	= "-";
14524472Sdonn static char f2flags[50];
14624472Sdonn static char cflags[50]	= "-c";
14724472Sdonn #if TARGET == GCOS
14824472Sdonn 	static char eflags[30]	= "system=gcos ";
14924472Sdonn #else
15024472Sdonn 	static char eflags[30]	= "system=unix ";
15124472Sdonn #endif
15224472Sdonn static char rflags[30]	= "";
15324472Sdonn static char lflag[3]	= "-x";
15424472Sdonn static char *fflagp	= fflags+1;
15524472Sdonn static char *f2flagp	= f2flags;
15624472Sdonn static char *eflagp	= eflags+12;
15724472Sdonn static char *rflagp	= rflags;
15824472Sdonn static char *cppflags	= "";
15924472Sdonn static char **cppargs;
16024472Sdonn static char **loadargs;
16124472Sdonn static char **loadp;
16224472Sdonn 
16324472Sdonn static flag erred	= NO;
16424472Sdonn static flag loadflag	= YES;
16524472Sdonn static flag saveasmflag	= NO;
16624472Sdonn static flag profileflag	= NO;
16724472Sdonn static flag optimflag	= NO;
16824472Sdonn static flag debugflag	= NO;
16924472Sdonn static flag verbose	= NO;
17024472Sdonn static flag fortonly	= NO;
17124472Sdonn static flag macroflag	= NO;
17224472Sdonn static flag sdbflag	= NO;
17324472Sdonn static flag namesflag	= YES;
17424472Sdonn 
17525734Sdonn #if TARGET == PDP11
17625734Sdonn static flag nofloating	= NO;
17725734Sdonn #endif
17825734Sdonn 
17924472Sdonn static int ncpp;
18024472Sdonn 
18124472Sdonn 
main(argc,argv)18224472Sdonn main(argc, argv)
18324472Sdonn int argc;
18424472Sdonn char **argv;
18524472Sdonn {
18625734Sdonn register int i, n;
18725734Sdonn int c, status;
18824472Sdonn char *setdoto(), *lastchar(), *lastfield(), *copys(), *argvtos();
18924472Sdonn ptr ckalloc();
19025734Sdonn char *strcat();
19124472Sdonn register char *s;
19224472Sdonn char fortfile[20], *t;
19325734Sdonn char *buff;
19424472Sdonn int intrupt();
19524472Sdonn int new_aoutname = NO;
19624472Sdonn 
19724472Sdonn sigivalue = signal(SIGINT, SIG_IGN) == SIG_IGN;
19824472Sdonn sigqvalue = signal(SIGQUIT,SIG_IGN) == SIG_IGN;
19924472Sdonn sighvalue = signal(SIGHUP, SIG_IGN) == SIG_IGN;
20024472Sdonn sigtvalue = signal(SIGTERM,SIG_IGN) == SIG_IGN;
20124472Sdonn enbint(intrupt);
20224472Sdonn 
20324472Sdonn pid = getpid();
20424472Sdonn crfnames();
20524472Sdonn 
20624472Sdonn cppargs  = (char **) ckalloc( argc * sizeof(*cppargs) );
20724472Sdonn loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
20824472Sdonn loadargs[1] = "-X";
20924472Sdonn loadargs[2] = "-u";
21024472Sdonn #if HERE==PDP11 || HERE==VAX
21124472Sdonn 	loadargs[3] = "_MAIN_";
21224472Sdonn #endif
21324472Sdonn #if HERE == INTERDATA
21424472Sdonn 	loadargs[3] = "main";
21524472Sdonn #endif
21624472Sdonn loadp = loadargs + 4;
21724472Sdonn 
21824472Sdonn --argc;
21924472Sdonn ++argv;
22024472Sdonn 
22125734Sdonn for (i = 0, n = 50; i < argc; ++i)
22225734Sdonn 	n += strlen(argv[i]) + 1;
22325734Sdonn buff = (char *) ckalloc(n);
22425734Sdonn 
22524472Sdonn while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
22624472Sdonn 	{
22724472Sdonn 	for(s = argv[0]+1 ; *s ; ++s) switch(*s)
22824472Sdonn 		{
22924472Sdonn 		case 'T':  /* use special passes */
23024472Sdonn 			switch(*++s)
23124472Sdonn 				{
23224472Sdonn 				case '1':
23324472Sdonn 					pass1name = s+1; goto endfor;
23424472Sdonn 				case '2':
23524472Sdonn 					pass2name = s+1; goto endfor;
23624472Sdonn 				case 'p':
23724472Sdonn 					pass2opt = s+1; goto endfor;
23824472Sdonn 				case 'a':
23924472Sdonn 					asmname = s+1; goto endfor;
24024472Sdonn 				case 'l':
24124472Sdonn 					ldname = s+1; goto endfor;
24224472Sdonn 				case 'F':
24324472Sdonn 					footname = s+1; goto endfor;
24424472Sdonn 				case 'm':
24524472Sdonn 					macroname = s+1; goto endfor;
24624472Sdonn 				case 't':
24724472Sdonn 					temppref = s+1; goto endfor;
24824472Sdonn 				default:
24924472Sdonn 					fatali("bad option -T%c", *s);
25024472Sdonn 				}
25124472Sdonn 			break;
25224472Sdonn 
25324473Sdonn #ifdef ONLY66
25424472Sdonn 		case '6':
25524472Sdonn 			if(s[1]=='6')
25624472Sdonn 				{
25724472Sdonn 				*fflagp++ = *s++;
25824472Sdonn 				goto copyfflag;
25924472Sdonn 				}
26024472Sdonn 			else	{
26124472Sdonn 				fprintf(diagfile, "invalid flag 6%c\n", s[1]);
26224472Sdonn 				done(1);
26324472Sdonn 				}
26424473Sdonn #endif
26524472Sdonn 
26624472Sdonn 		case 'w':
26724472Sdonn 			if(s[1]=='6' && s[2]=='6')
26824472Sdonn 				{
26924472Sdonn 				*fflagp++ = *s++;
27024472Sdonn 				*fflagp++ = *s++;
27124472Sdonn 				}
27224472Sdonn 
27324472Sdonn 		copyfflag:
27424472Sdonn 		case 'u':
27524472Sdonn 		case 'U':
27624472Sdonn 		case '1':
27724472Sdonn 		case 'C':
27824472Sdonn 			*fflagp++ = *s;
27924472Sdonn 			break;
28024472Sdonn 
28124472Sdonn 		case 'O':
28224472Sdonn 			if(sdbflag)
28324472Sdonn 				{
28424472Sdonn 				fprintf(diagfile, "-O and -g are incompatible; -O ignored\n");
28524472Sdonn 				break;
28624472Sdonn 				}
28724472Sdonn 			optimflag = YES;
28824472Sdonn 			*f2flagp++ = '-';
28924472Sdonn 			*f2flagp++ = 'O';
29024472Sdonn 			*f2flagp++ = ' ';
29124472Sdonn #if TARGET == INTERDATA
29224472Sdonn 				*loadp++ = "-r";
29324472Sdonn 				*loadp++ = "-d";
29424472Sdonn #endif
29524472Sdonn 			*fflagp++ = 'O';
29624472Sdonn 			break;
29724472Sdonn 
29824472Sdonn 		case 'N':
29924472Sdonn 			*fflagp++ = 'N';
30024472Sdonn 			if( oneof(*++s, "qxscn") )
30124472Sdonn 				*fflagp++ = *s++;
30224472Sdonn 			else	{
30324472Sdonn 				fprintf(diagfile, "invalid flag -N%c\n", *s);
30424472Sdonn 				done(1);
30524472Sdonn 				}
30624472Sdonn 			while( isdigit(*s) )
30724472Sdonn 				*fflagp++ = *s++;
30824472Sdonn 			*fflagp++ = 'X';
30924472Sdonn 			goto endfor;
31024472Sdonn 
31124472Sdonn 		case 'm':
31224472Sdonn 			if(s[1] == '4')
31324472Sdonn 				++s;
31424472Sdonn 			macroflag = YES;
31524472Sdonn 			break;
31624472Sdonn 
31724472Sdonn 		case 'S':
31825734Sdonn 			(void) strcat(cflags, " -S");
31924472Sdonn 			saveasmflag = YES;
32024472Sdonn 
32124472Sdonn 		case 'c':
32224472Sdonn 			if( new_aoutname == YES ){
32324472Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
32424472Sdonn 				new_aoutname = NO;
32524472Sdonn 				}
32624472Sdonn 			loadflag = NO;
32724472Sdonn 			break;
32824472Sdonn 
32924472Sdonn 		case 'v':
33024472Sdonn 			verbose = YES;
33124472Sdonn 			fprintf(diagfile,"\nBerkeley F77, version %s\n",
33224472Sdonn 				VERSIONNUMBER);
33324472Sdonn 			break;
33424472Sdonn 
33524472Sdonn 		case 'd':
33624472Sdonn 			debugflag = YES;
33724472Sdonn 			*fflagp++ = 'd';
33824472Sdonn 			s++;
33924472Sdonn 			while( isdigit(*s) || *s == ',' )
34024472Sdonn 				*fflagp++ = *s++;
34124472Sdonn 			*fflagp++ = 'X';
34224472Sdonn 			goto endfor;
34324472Sdonn 
34424472Sdonn 		case 'M':
34524472Sdonn 			*loadp++ = "-M";
34624472Sdonn 			break;
34724472Sdonn 
34824472Sdonn 		case 'g':
34924472Sdonn 			if(optimflag)
35024472Sdonn 				{
35124472Sdonn 				fprintf(diagfile, "-g and -O are incompatible; -g ignored\n");
35224472Sdonn 				break;
35324472Sdonn 				}
35425734Sdonn 			(void) strcat(cflags," -g");
35524472Sdonn 			sdbflag = YES;
35624472Sdonn 			goto copyfflag;
35724472Sdonn 
35824472Sdonn 		case 'p':
35924472Sdonn 			profileflag = YES;
36025734Sdonn 			(void) strcat(cflags," -p");
36124472Sdonn 			*fflagp++ = 'p';
36224472Sdonn 			if(s[1] == 'g')
36324472Sdonn 				{
36424472Sdonn 				proffoot = GPRFFOOT;
36524472Sdonn 				s++;
36624472Sdonn 				}
36724472Sdonn 			break;
36824472Sdonn 
36924472Sdonn 		case 'q':
37024472Sdonn 			namesflag = NO;
37124472Sdonn 			*fflagp++ = *s;
37224472Sdonn 			break;
37324472Sdonn 
37424472Sdonn 		case 'o':
37524472Sdonn 			if( ! strcmp(s, "onetrip") )
37624472Sdonn 				{
37724472Sdonn 				*fflagp++ = '1';
37824472Sdonn 				goto endfor;
37924472Sdonn 				}
38024472Sdonn 			new_aoutname = YES;
38124472Sdonn 			aoutname = *++argv;
38224472Sdonn 			--argc;
38324472Sdonn 			if( loadflag == NO ){
38424472Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
38524472Sdonn 				new_aoutname = NO;
38624472Sdonn 				}
38724472Sdonn 			break;
38824472Sdonn 
38924472Sdonn #if TARGET == PDP11
39024472Sdonn 		case 'f':
39124472Sdonn 			nofloating = YES;
39224472Sdonn 			pass2name = NOFLPASS2;
39324472Sdonn 		break;
39424472Sdonn #endif
39524472Sdonn 
39624472Sdonn 		case 'F':
39724472Sdonn 			fortonly = YES;
39824472Sdonn 			loadflag = NO;
39924472Sdonn 			break;
40024472Sdonn 		case 'D':
40124472Sdonn 		case 'I':
40224472Sdonn 			cppargs[ncpp++] = *argv;
40324472Sdonn 			goto endfor;
40424472Sdonn 
40524472Sdonn 		case 'i':
40624472Sdonn 			if((s[1]=='2' || s[1]=='4') && s[2] == '\0')
40724472Sdonn 				{
40824472Sdonn 				*fflagp++ = *s++;
40924472Sdonn 				goto copyfflag;
41024472Sdonn 				}
41124472Sdonn 			fprintf(diagfile, "invalid flag -i%c\n", s[1]);
41224472Sdonn 			done(1);
41324472Sdonn 
41424473Sdonn 		case 'r':	/* -r8 - double the precision */
41524473Sdonn 			if(s[1] == '8' && s[2] == '\0')
41624473Sdonn 				{
41724473Sdonn 				s++;
41824473Sdonn 				goto copyfflag;
41924473Sdonn 				}
42024473Sdonn 			else
42124473Sdonn 				{
42224473Sdonn 				*loadp++ = "-r";
42324473Sdonn 				break;
42424473Sdonn 				}
42524473Sdonn 
42624472Sdonn 		case 'l':	/* letter ell--library */
42724472Sdonn 			s[-1] = '-';
42824472Sdonn 			*loadp++ = s-1;
42924472Sdonn 			goto endfor;
43024472Sdonn 
43124472Sdonn 		case 'E':	/* EFL flag argument */
43224472Sdonn 			while( *eflagp++ = *++s)
43324472Sdonn 				;
43424472Sdonn 			*eflagp++ = ' ';
43524472Sdonn 			goto endfor;
43624472Sdonn 		case 'R':
43724472Sdonn 			while( *rflagp++ = *++s )
43824472Sdonn 				;
43924472Sdonn 			*rflagp++ = ' ';
44024472Sdonn 			goto endfor;
44124472Sdonn 		default:
44224472Sdonn 			lflag[1] = *s;
44324472Sdonn 			*loadp++ = copys(lflag);
44424472Sdonn 			break;
44524472Sdonn 		}
44624472Sdonn endfor:
44724472Sdonn 	--argc;
44824472Sdonn 	++argv;
44924472Sdonn 	}
45024472Sdonn 
45124472Sdonn #ifdef	NOCORE
45224472Sdonn if(!debugflag)
45324472Sdonn 	{
45424472Sdonn 	struct rlimit r;
45524472Sdonn 
45624472Sdonn 	r.rlim_cur = r.rlim_max = 0;
45725734Sdonn 	(void) setrlimit(RLIMIT_CORE, &r);
45824472Sdonn 	}
45924472Sdonn #endif	NOCORE
46024472Sdonn 
46124472Sdonn *fflagp = '\0';
46224472Sdonn 
46324472Sdonn if (ncpp > 0)
46424472Sdonn 	cppflags = argvtos (ncpp,cppargs);
46524472Sdonn 
46624472Sdonn loadargs[0] = ldname;
46724472Sdonn #if TARGET == PDP11
46824472Sdonn 	if(nofloating)
46924472Sdonn 		*loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
47024472Sdonn 	else
47124472Sdonn #endif
47224472Sdonn *loadp++ = (profileflag ? proffoot : footname);
47324472Sdonn 
47424472Sdonn for(i = 0 ; i<argc ; ++i)
47524472Sdonn 	switch(c =  dotchar(infname = argv[i]) )
47624472Sdonn 		{
47724472Sdonn 		case 'r':	/* Ratfor file */
47824472Sdonn 		case 'e':	/* EFL file */
47924472Sdonn 			if( unreadable(argv[i]) )
48024472Sdonn 				{
48124472Sdonn 				erred = YES;
48224472Sdonn 				break;
48324472Sdonn 				}
48424472Sdonn 			s = fortfile;
48524472Sdonn 			t = lastfield(argv[i]);
48624472Sdonn 			while( *s++ = *t++)
48724472Sdonn 				;
48824472Sdonn 			s[-2] = 'f';
48924472Sdonn 
49024472Sdonn 			if(macroflag)
49124472Sdonn 				{
49224472Sdonn 				sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
49324472Sdonn 				if( sys(buff) )
49424472Sdonn 					{
49524472Sdonn 					rmf(prepfname);
49624472Sdonn 					erred = YES;
49724472Sdonn 					break;
49824472Sdonn 					}
49924472Sdonn 				infname = prepfname;
50024472Sdonn 				}
50124472Sdonn 
50224472Sdonn 			if(c == 'e')
50324472Sdonn 				sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
50424472Sdonn 			else
50524472Sdonn 				sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
50624472Sdonn 			status = sys(buff);
50724472Sdonn 			if(macroflag)
50824472Sdonn 				rmf(infname);
50924472Sdonn 			if(status)
51024472Sdonn 				{
51124472Sdonn 				erred = YES;
51224472Sdonn 				rmf(fortfile);
51324472Sdonn 				break;
51424472Sdonn 				}
51524472Sdonn 
51624472Sdonn 			if( ! fortonly )
51724472Sdonn 				{
51824472Sdonn 				infname = argv[i] = lastfield(argv[i]);
51924472Sdonn 				*lastchar(infname) = 'f';
52024472Sdonn 
52124472Sdonn 				if( dofort(argv[i]) )
52224472Sdonn 					erred = YES;
52324472Sdonn 				else	{
52424472Sdonn 					if( nodup(t = setdoto(argv[i])) )
52524472Sdonn 						*loadp++ = t;
52624472Sdonn 					rmf(fortfile);
52724472Sdonn 					}
52824472Sdonn 				}
52924472Sdonn 			break;
53024472Sdonn 
53124472Sdonn 		case 'F':	/* C preprocessor -> Fortran file */
53224472Sdonn 			if( unreadable(argv[i]) )
53324472Sdonn 				{
53424472Sdonn 				erred = YES;
53524472Sdonn 				break;
53624472Sdonn 				}
53724472Sdonn 			s = fortfile;
53824472Sdonn 			t = lastfield(argv[i]);
53924472Sdonn 			while( *s++ = *t++)
54024472Sdonn 				;
54124472Sdonn 			s[-2] = 'f';
54224472Sdonn 			sprintf(buff,"%s %s %s >%s", cppname, cppflags, infname, fortfile);
54324472Sdonn 			status = sys(buff);
54424472Sdonn 			if(status)
54524472Sdonn 				{
54624472Sdonn 				erred = YES;
54724472Sdonn 				rmf(fortfile);
54824472Sdonn 				break;
54924472Sdonn 				}
55024472Sdonn 
55124472Sdonn 			if( ! fortonly )
55224472Sdonn 				{
55324472Sdonn 				infname = argv[i] = lastfield(argv[i]);
55424472Sdonn 				*lastchar(infname) = 'f';
55524472Sdonn 
55624472Sdonn 				if ( dofort(argv[i]) )
55724472Sdonn 					erred = YES;
55824472Sdonn 				else	{
55924472Sdonn 					if (nodup(t = setdoto(argv[i])) )
56024472Sdonn 						*loadp++ = t;
56124472Sdonn 						rmf(fortfile);
56224472Sdonn 						}
56324472Sdonn 				}
56424472Sdonn 			break;
56524472Sdonn 
56624472Sdonn 		case 'f':	/* Fortran file */
56724472Sdonn 			if( unreadable(argv[i]) )
56824472Sdonn 				erred = YES;
56924472Sdonn 			else if( dofort(argv[i]) )
57024472Sdonn 				erred = YES;
57124472Sdonn 			else if( nodup(t=setdoto(argv[i])) )
57224472Sdonn 				*loadp++ = t;
57324472Sdonn 			break;
57424472Sdonn 
57524472Sdonn 		case 'c':	/* C file */
57624472Sdonn 		case 's':	/* Assembler file */
57724472Sdonn 			if( unreadable(argv[i]) )
57824472Sdonn 				{
57924472Sdonn 				erred = YES;
58024472Sdonn 				break;
58124472Sdonn 				}
58224472Sdonn #if HERE==PDP11 || HERE==VAX
58324472Sdonn 			if( namesflag == YES )
58424472Sdonn 				fprintf(diagfile, "%s:\n", argv[i]);
58524472Sdonn #endif
58624472Sdonn 			sprintf(buff, "cc %s %s", cflags, argv[i] );
58724472Sdonn 			if( sys(buff) )
58824472Sdonn 				erred = YES;
58924472Sdonn 			else
59024472Sdonn 				if( nodup(t = setdoto(argv[i])) )
59124472Sdonn 					*loadp++ = t;
59224472Sdonn 			break;
59324472Sdonn 
59424472Sdonn 		case 'o':
59524472Sdonn 			if( nodup(argv[i]) )
59624472Sdonn 				*loadp++ = argv[i];
59724472Sdonn 			break;
59824472Sdonn 
59924472Sdonn 		default:
60024472Sdonn 			if( ! strcmp(argv[i], "-o") ) {
60124472Sdonn 				aoutname = argv[++i];
60224472Sdonn 				new_aoutname = YES;
60324472Sdonn 				if( loadflag == NO ){
60424472Sdonn 					fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
60524472Sdonn 					new_aoutname = NO;
60624472Sdonn 					}
60724472Sdonn 			} else
60824472Sdonn 				*loadp++ = argv[i];
60924472Sdonn 			break;
61024472Sdonn 		}
61124472Sdonn 
61224472Sdonn if( loadflag && stupid(aoutname) )
61324472Sdonn 	erred = YES;
61424472Sdonn if(loadflag && !erred)
61524472Sdonn 	doload(loadargs, loadp);
61624472Sdonn done(erred);
61724472Sdonn }
61824472Sdonn 
61924472Sdonn 
62024472Sdonn 
62124472Sdonn /*
62224472Sdonn  * argvtos() copies a list of arguments contained in an array of character
62324472Sdonn  * strings to a single dynamically allocated string. Each argument is
62424472Sdonn  * separated by one blank space. Returns a pointer to the string or null
62524472Sdonn  * if out of memory.
62624472Sdonn  */
62724472Sdonn #define SBUFINCR	1024
62824472Sdonn #define SBUFMAX		10240
62924472Sdonn 
63024472Sdonn char *
argvtos(argc,argv)63124472Sdonn argvtos(argc, argv)
63224472Sdonn 	char **argv;
63324472Sdonn 	int  argc;
63424472Sdonn {
63524472Sdonn 	register char *s;		/* string pointer */
63624472Sdonn 	register int  i;		/* string buffer pointer */
63724472Sdonn 	char *malloc();			/* memory allocator */
63824472Sdonn 	char *realloc();		/* increase size of storage */
63924472Sdonn 	char *sbuf;			/* string buffer */
64024472Sdonn 	int nbytes;			/* bytes of memory required */
64124472Sdonn 	int nu;				/* no. of SBUFINCR units required */
64224472Sdonn 	int sbufsize;			/* current size of sbuf */
64324472Sdonn 	int strlen();			/* string length */
64424472Sdonn 
64524472Sdonn 	sbufsize = SBUFINCR;
64624472Sdonn 	if ((sbuf = malloc((unsigned)sbufsize)) == NULL)
64724472Sdonn 		{
64824472Sdonn 		fatal("out of memory (argvtos)");
64924472Sdonn 		/* NOTREACHED */
65024472Sdonn 		}
65124472Sdonn 
65224472Sdonn 	for (i = 0; argc-- > 0; ++argv)
65324472Sdonn 		{
65424472Sdonn 		if ((nbytes = (i+strlen(*argv)+1-sbufsize)) > 0)
65524472Sdonn 			{
65624472Sdonn 			nu = (nbytes+SBUFINCR-1)/SBUFINCR;
65724472Sdonn 			sbufsize += nu * SBUFINCR;
65824472Sdonn 			if (sbufsize > SBUFMAX)
65924472Sdonn 				{
66024472Sdonn 				fatal("argument length exceeded (argvtos)");
66124472Sdonn 				/* NOTREACHED */
66224472Sdonn 				}
66324472Sdonn 			if ((sbuf = realloc(sbuf, (unsigned)sbufsize)) == NULL)
66424472Sdonn 				{
66524472Sdonn 				fatal("out of memory (argvtos)");
66624472Sdonn 				/* NOTREACHED */
66724472Sdonn 				}
66824472Sdonn 			}
66924472Sdonn 		for (s = *argv; *s != '\0'; i++, s++)
67024472Sdonn 			sbuf[i] = *s;
67124472Sdonn 		sbuf[i++] = ' ';
67224472Sdonn 		}
67324472Sdonn 	sbuf[--i] = '\0';
67424472Sdonn 	return(sbuf);
67524472Sdonn }
67624472Sdonn 
dofort(s)67724472Sdonn dofort(s)
67824472Sdonn char *s;
67924472Sdonn {
68024472Sdonn int retcode;
68124472Sdonn char buff[200];
68224472Sdonn 
68324472Sdonn infname = s;
68424472Sdonn sprintf(buff, "%s %s %s %s %s %s",
68524472Sdonn 	pass1name, fflags, s, asmfname, initfname, textfname);
68624472Sdonn switch( sys(buff) )
68724472Sdonn 	{
68824472Sdonn 	case 1:
68924472Sdonn 		goto error;
69024472Sdonn 	case 0:
69124472Sdonn 		break;
69224472Sdonn 	default:
69324472Sdonn 		goto comperror;
69424472Sdonn 	}
69524472Sdonn 
69624472Sdonn if( dopass2() )
69724472Sdonn 	goto comperror;
69824472Sdonn doasm(s);
69924472Sdonn retcode = 0;
70024472Sdonn 
70124472Sdonn ret:
70224472Sdonn 	rmf(asmfname);
70324472Sdonn 	rmf(initfname);
70424472Sdonn 	rmf(textfname);
70524472Sdonn 	return(retcode);
70624472Sdonn 
70724472Sdonn error:
70824472Sdonn 	fprintf(diagfile, "\nError.  No assembly.\n");
70924472Sdonn 	retcode = 1;
71024472Sdonn 	goto ret;
71124472Sdonn 
71224472Sdonn comperror:
71324472Sdonn 	fprintf(diagfile, "\ncompiler error.\n");
71424472Sdonn 	retcode = 2;
71524472Sdonn 	goto ret;
71624472Sdonn }
71724472Sdonn 
71824472Sdonn 
71924472Sdonn 
72024472Sdonn 
dopass2()72124472Sdonn dopass2()
72224472Sdonn {
72324472Sdonn char buff[100];
72424472Sdonn 
72524472Sdonn if(verbose)
72624472Sdonn 	fprintf(diagfile, "PASS2.");
72724472Sdonn 
72824472Sdonn #if FAMILY==DMR
72924472Sdonn 	sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
73024472Sdonn 	return( sys(buff) );
73124472Sdonn #endif
73224472Sdonn 
73324472Sdonn 
73424472Sdonn #if FAMILY == PCC
73524472Sdonn #	if TARGET==INTERDATA
73624472Sdonn 	sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
73724472Sdonn #	else
73824472Sdonn 	sprintf(buff, "%s %s %s >%s",
73924472Sdonn 		pass2name, f2flags, textfname, asmpass2);
74024472Sdonn #	endif
74124472Sdonn 	return( sys(buff) );
74224472Sdonn #endif
74324472Sdonn }
74424472Sdonn 
74524472Sdonn 
74624472Sdonn 
74724472Sdonn 
doasm(s)74824472Sdonn doasm(s)
74924472Sdonn char *s;
75024472Sdonn {
75124472Sdonn register char *lastc;
75224472Sdonn char *obj;
75324472Sdonn char buff[200];
75424472Sdonn char *lastchar(), *setdoto();
75524472Sdonn 
75624472Sdonn if(*s == '\0')
75724472Sdonn 	s = objfdefault;
75824472Sdonn lastc = lastchar(s);
75924472Sdonn obj = setdoto(s);
76024472Sdonn 
76124472Sdonn #if TARGET==PDP11 || TARGET==VAX
76224472Sdonn #	ifdef PASS2OPT
76324472Sdonn 	if(optimflag)
76424472Sdonn 		{
76524472Sdonn 		sprintf(buff, "%s -f %s %s", pass2opt, asmpass2, optzfname);
76624472Sdonn 		if( sys(buff) )
76724472Sdonn 			rmf(optzfname);
76824472Sdonn 		else
76939251Sbostic 			if (rename(optzfname, asmpass2))
77025734Sdonn 				fatal("can't rename optimizer output file");
77124472Sdonn 		}
77224472Sdonn #	endif
77324472Sdonn #endif
77424472Sdonn 
77524472Sdonn if(saveasmflag)
77624472Sdonn 	{
77724472Sdonn 	*lastc = 's';
77824472Sdonn #if TARGET == INTERDATA
77924472Sdonn 	sprintf(buff, "%s %s %s %s %s >%s", CATNAME, asmfname, initfname,
78024472Sdonn 		setfname, asmpass2, obj);
78124472Sdonn #else
78224472Sdonn #if TARGET == VAX
78324472Sdonn 	if (sdbflag)
78424472Sdonn 		sprintf(buff, "%s %s %s %s >%s",
78524472Sdonn 			CATNAME, asmfname, asmpass2, initfname, obj);
78624472Sdonn 	else
78724472Sdonn 		sprintf(buff, "%s %s %s %s >%s",
78824472Sdonn 			CATNAME, asmfname, initfname, asmpass2, obj);
78924472Sdonn #else
79024472Sdonn 	sprintf(buff, "%s %s %s %s >%s",
79124472Sdonn 		CATNAME, asmfname, initfname, asmpass2, obj);
79224472Sdonn #endif
79324472Sdonn #endif
79425734Sdonn 	if( sys(buff) )
79525734Sdonn 		fatal("can't concatenate assembly files");
79624472Sdonn 	*lastc = 'o';
79724472Sdonn 	}
79824472Sdonn else
79924472Sdonn 	{
80024472Sdonn 	if(verbose)
80124472Sdonn 		fprintf(diagfile, "  ASM.");
80224472Sdonn #if TARGET == INTERDATA
80324472Sdonn 	sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname,
80424472Sdonn 		initfname, setfname, asmpass2);
80524472Sdonn #endif
80624472Sdonn 
80724472Sdonn #if TARGET == VAX
80824472Sdonn 	/* vax assembler currently accepts only one input file */
80924472Sdonn 	if (sdbflag)
81024472Sdonn 		sprintf(buff, "%s %s %s >>%s",
81124472Sdonn 			CATNAME, asmpass2, initfname, asmfname);
81224472Sdonn 	else
81324472Sdonn 		sprintf(buff, "%s %s %s >>%s",
81424472Sdonn 			CATNAME, initfname, asmpass2, asmfname);
81525734Sdonn 	if( sys(buff) )
81625734Sdonn 		fatal("can't concatenate assembly files");
81724472Sdonn #ifdef UCBVAXASM
81824472Sdonn 	sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);
81924472Sdonn #else
82024472Sdonn 	sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
82124472Sdonn #endif
82224472Sdonn #endif
82324472Sdonn 
82424472Sdonn #if TARGET == PDP11
82524472Sdonn 	sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
82624472Sdonn #endif
82724472Sdonn 
82824472Sdonn #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
82924472Sdonn 	sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
83024472Sdonn #endif
83124472Sdonn 
83224472Sdonn 	if( sys(buff) )
83324472Sdonn 		fatal("assembler error");
83424472Sdonn 	if(verbose)
83524472Sdonn 		fprintf(diagfile, "\n");
83624472Sdonn #if HERE==PDP11 && TARGET!=PDP11
83724472Sdonn 	rmf(obj);
83824472Sdonn #endif
83924472Sdonn 	}
84024472Sdonn 
84124472Sdonn rmf(asmpass2);
84224472Sdonn }
84324472Sdonn 
84424472Sdonn 
84524472Sdonn 
doload(v0,v)84624472Sdonn doload(v0, v)
84724472Sdonn register char *v0[], *v[];
84824472Sdonn {
84924472Sdonn char **p;
85024472Sdonn int waitpid;
85124472Sdonn 
85224472Sdonn if (profileflag)
85324472Sdonn 	{
85424472Sdonn 	for(p = p_liblist ; *p ; *v++ = *p++)
85524472Sdonn 		;
85624472Sdonn 	}
85724472Sdonn else	{
85824472Sdonn 	for(p = liblist ; *p ; *v++ = *p++)
85924472Sdonn 		;
86024472Sdonn 	}
86124472Sdonn 
86224472Sdonn *v++ = "-o";
86324472Sdonn *v++ = aoutname;
86424472Sdonn *v = NULL;
86524472Sdonn 
86624472Sdonn if(verbose)
86724472Sdonn 	fprintf(diagfile, "LOAD.");
86824472Sdonn if(debugflag)
86924472Sdonn 	{
87024472Sdonn 	for(p = v0 ; p<v ; ++p)
87124472Sdonn 		fprintf(diagfile, "%s ", *p);
87224472Sdonn 	fprintf(diagfile, "\n");
87324472Sdonn 	}
87424472Sdonn 
87524472Sdonn #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
87624472Sdonn 	if( (waitpid = fork()) == 0)
87724472Sdonn 		{
87824472Sdonn 		enbint(SIG_DFL);
87924472Sdonn 		execv(ldname, v0);
88024472Sdonn 		fatalstr("couldn't load %s", ldname);
88124472Sdonn 		}
88225734Sdonn 	if( await(waitpid) )
88325734Sdonn 		erred = YES;
88424472Sdonn #endif
88524472Sdonn 
88624472Sdonn #if HERE==INTERDATA
88724472Sdonn 	if(optimflag)
88824472Sdonn 		{
88924472Sdonn 		char buff1[100], buff2[100];
89024472Sdonn 		sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
89124472Sdonn 		sprintf(buff2, "mv junk.%d %s", pid, aoutname);
89224472Sdonn 		if( sys(buff1) || sys(buff2) )
89324472Sdonn 			err("bad optimization");
89424472Sdonn 		}
89524472Sdonn #endif
89624472Sdonn 
89724472Sdonn if(verbose)
89824472Sdonn 	fprintf(diagfile, "\n");
89924472Sdonn }
90024472Sdonn 
90124472Sdonn /* Process control and Shell-simulating routines */
90224472Sdonn 
sys(str)90324472Sdonn sys(str)
90424472Sdonn char *str;
90524472Sdonn {
90624472Sdonn register char *s, *t;
90737794Sbostic char *argv[100];
90824472Sdonn char *inname, *outname;
90924472Sdonn int append;
91024472Sdonn int waitpid;
91124472Sdonn int argc;
91224472Sdonn 
91324472Sdonn 
91424472Sdonn if(debugflag)
91524472Sdonn 	fprintf(diagfile, "%s\n", str);
91624472Sdonn inname  = NULL;
91724472Sdonn outname = NULL;
91824472Sdonn argv[0] = shellname;
91924472Sdonn argc = 1;
92024472Sdonn 
92124472Sdonn t = str;
92224472Sdonn while( isspace(*t) )
92324472Sdonn 	++t;
92424472Sdonn while(*t)
92524472Sdonn 	{
92624472Sdonn 	if(*t == '<')
92724472Sdonn 		inname = t+1;
92824472Sdonn 	else if(*t == '>')
92924472Sdonn 		{
93024472Sdonn 		if(t[1] == '>')
93124472Sdonn 			{
93224472Sdonn 			append = YES;
93324472Sdonn 			outname = t+2;
93424472Sdonn 			}
93524472Sdonn 		else	{
93624472Sdonn 			append = NO;
93724472Sdonn 			outname = t+1;
93824472Sdonn 			}
93924472Sdonn 		}
94024472Sdonn 	else
94124472Sdonn 		argv[argc++] = t;
94224472Sdonn 	while( !isspace(*t) && *t!='\0' )
94324472Sdonn 		++t;
94424472Sdonn 	if(*t)
94524472Sdonn 		{
94624472Sdonn 		*t++ = '\0';
94724472Sdonn 		while( isspace(*t) )
94824472Sdonn 			++t;
94924472Sdonn 		}
95024472Sdonn 	}
95124472Sdonn 
95224472Sdonn if(argc == 1)   /* no command */
95324472Sdonn 	return(-1);
95424472Sdonn argv[argc] = 0;
95524472Sdonn 
95624472Sdonn if((waitpid = fork()) == 0)
95724472Sdonn 	{
95824472Sdonn 	if(inname)
95925734Sdonn 		if(freopen(inname, "r", stdin) == NULL)
96025734Sdonn 			fatalstr("Cannot open %s", inname);
96124472Sdonn 	if(outname)
96225734Sdonn 		if(freopen(outname, (append ? "a" : "w"), stdout) == NULL)
96325734Sdonn 			fatalstr("Cannot open %s", outname);
96424472Sdonn 	enbint(SIG_DFL);
96524472Sdonn 
96637794Sbostic 	texec(argv[1], argv);
96724472Sdonn 
96837794Sbostic 	fatalstr("Cannot load %s", argv[1]);
96924472Sdonn 	}
97024472Sdonn 
97124472Sdonn return( await(waitpid) );
97224472Sdonn }
97324472Sdonn 
97424472Sdonn 
97524472Sdonn 
97624472Sdonn 
97724472Sdonn 
97824472Sdonn #include "errno.h"
97924472Sdonn 
98024472Sdonn /* modified version from the Shell */
texec(f,av)98124472Sdonn texec(f, av)
98224472Sdonn char *f;
98324472Sdonn char **av;
98424472Sdonn {
98524472Sdonn extern int errno;
98624472Sdonn 
98724472Sdonn execv(f, av+1);
98824472Sdonn 
98924472Sdonn if (errno==ENOEXEC)
99024472Sdonn 	{
99124472Sdonn 	av[1] = f;
99224472Sdonn 	execv(shellname, av);
99324472Sdonn 	fatal("No shell!");
99424472Sdonn 	}
99524472Sdonn if (errno==ENOMEM)
99624472Sdonn 	fatalstr("%s: too large", f);
99724472Sdonn }
99824472Sdonn 
99924472Sdonn 
100024472Sdonn 
100124472Sdonn 
100224472Sdonn 
100324472Sdonn 
done(k)100424472Sdonn done(k)
100524472Sdonn int k;
100624472Sdonn {
100724472Sdonn static int recurs	= NO;
100824472Sdonn 
100924472Sdonn if(recurs == NO)
101024472Sdonn 	{
101124472Sdonn 	recurs = YES;
101224472Sdonn 	rmfiles();
101324472Sdonn 	}
101424472Sdonn exit(k);
101524472Sdonn }
101624472Sdonn 
101724472Sdonn 
101824472Sdonn 
101924472Sdonn 
102024472Sdonn 
102124472Sdonn 
102224472Sdonn enbint(k)
102324472Sdonn int (*k)();
102424472Sdonn {
102524472Sdonn if(sigivalue == 0)
102625734Sdonn 	(void) signal(SIGINT,k);
102724472Sdonn if(sigqvalue == 0)
102825734Sdonn 	(void) signal(SIGQUIT,k);
102924472Sdonn if(sighvalue == 0)
103025734Sdonn 	(void) signal(SIGHUP,k);
103124472Sdonn if(sigtvalue == 0)
103225734Sdonn 	(void) signal(SIGTERM,k);
103324472Sdonn }
103424472Sdonn 
103524472Sdonn 
103624472Sdonn 
103724472Sdonn 
intrupt()103824472Sdonn intrupt()
103924472Sdonn {
104024472Sdonn done(2);
104124472Sdonn }
104224472Sdonn 
104324472Sdonn 
104424472Sdonn #ifdef PSIGNAL
104524472Sdonn /*
104624472Sdonn  * Fancy 4.2 BSD signal printing stuff.
104724472Sdonn  */
104824472Sdonn char harmless[NSIG] = { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };
104924472Sdonn #endif
105024472Sdonn 
105124472Sdonn 
await(waitpid)105224472Sdonn await(waitpid)
105324472Sdonn int waitpid;
105424472Sdonn {
105524472Sdonn 
105624472Sdonn #ifdef PSIGNAL
105724472Sdonn extern char *sys_siglist[];
105824472Sdonn union wait status;
105924472Sdonn #else PSIGNAL
106024472Sdonn int status;
106124472Sdonn #endif PSIGNAL
106224472Sdonn 
106324472Sdonn int w;
106424472Sdonn 
106524472Sdonn enbint(SIG_IGN);
106624472Sdonn while ( (w = wait(&status)) != waitpid)
106724472Sdonn 	if(w == -1)
106824472Sdonn 		fatal("bad wait code");
106924472Sdonn enbint(intrupt);
107024472Sdonn 
107124472Sdonn #ifdef PSIGNAL
107224472Sdonn if(status.w_termsig)
107324472Sdonn 	{
107424472Sdonn 	debugflag = 0;	/* Prevent us from dumping core ourselves */
107524472Sdonn 	if(status.w_termsig != SIGINT && status.w_termsig < NSIG)
107624472Sdonn 		fprintf(diagfile, "%s%s\n", sys_siglist[status.w_termsig],
107724472Sdonn 			status.w_coredump ? " -- core dumped" : "");
107824472Sdonn 	if(status.w_termsig < NSIG && ! harmless[status.w_termsig])
107924472Sdonn 		fatal("see a system manager");
108024472Sdonn 	else
108124472Sdonn 		done(3);
108224472Sdonn 	}
108324472Sdonn return(status.w_retcode);
108424472Sdonn #else PSIGNAL
108524472Sdonn if(status & 0377)
108624472Sdonn 	{
108724472Sdonn 	if(status != SIGINT)
108824472Sdonn 		fprintf(diagfile, "Termination code %d\n", status);
108924472Sdonn 	done(3);
109024472Sdonn 	}
109124472Sdonn return(status>>8);
109224472Sdonn #endif PSIGNAL
109324472Sdonn }
109424472Sdonn 
109524472Sdonn /* File Name and File Manipulation Routines */
109624472Sdonn 
unreadable(s)109724472Sdonn unreadable(s)
109824472Sdonn register char *s;
109924472Sdonn {
110024472Sdonn register FILE *fp;
110124472Sdonn 
110224472Sdonn if(fp = fopen(s, "r"))
110324472Sdonn 	{
110424472Sdonn 	fclose(fp);
110524472Sdonn 	return(NO);
110624472Sdonn 	}
110724472Sdonn 
110824472Sdonn else
110924472Sdonn 	{
111024472Sdonn 	fprintf(diagfile, "Error: Cannot read file %s\n", s);
111124472Sdonn 	return(YES);
111224472Sdonn 	}
111324472Sdonn }
111424472Sdonn 
111524472Sdonn 
111624472Sdonn 
stupid(s)111724472Sdonn stupid(s)
111824472Sdonn char *s;
111924472Sdonn {
112024472Sdonn char c;
112125734Sdonn extern char *index();
112224472Sdonn 
112324472Sdonn if( (c = dotchar(s))
112424472Sdonn   && index("focsreF", c)
112524472Sdonn   && access(s, 0) == 0 )
112624472Sdonn 	{
112724472Sdonn 	fprintf(diagfile, "Loading on %s would destroy it\n", s);
112824472Sdonn 	return(YES);
112924472Sdonn 	}
113024472Sdonn return(NO);
113124472Sdonn }
113224472Sdonn 
113324472Sdonn 
113424472Sdonn 
clf(p)113524472Sdonn clf(p)
113624472Sdonn FILEP *p;
113724472Sdonn {
113824472Sdonn if(p!=NULL && *p!=NULL && *p!=stdout)
113924472Sdonn 	{
114024472Sdonn 	if(ferror(*p))
114124472Sdonn 		fatal("writing error");
114224472Sdonn 	fclose(*p);
114324472Sdonn 	}
114424472Sdonn *p = NULL;
114524472Sdonn }
114624472Sdonn 
rmfiles()114724472Sdonn rmfiles()
114824472Sdonn {
114924472Sdonn rmf(textfname);
115024472Sdonn rmf(asmfname);
115124472Sdonn rmf(initfname);
115224472Sdonn rmf(asmpass2);
115324472Sdonn #if TARGET == INTERDATA
115424472Sdonn 	rmf(setfname);
115524472Sdonn #endif
115624472Sdonn }
115724472Sdonn 
115824472Sdonn 
115924472Sdonn 
116024472Sdonn 
116124472Sdonn 
116224472Sdonn 
116324472Sdonn 
116424472Sdonn 
116524472Sdonn /* return -1 if file does not exist, 0 if it is of zero length
116624472Sdonn    and 1 if of positive length
116724472Sdonn */
content(filename)116824472Sdonn content(filename)
116924472Sdonn char *filename;
117024472Sdonn {
117124472Sdonn #ifdef VERSION6
117224472Sdonn 	struct stat
117324472Sdonn 		{
117424472Sdonn 		char cjunk[9];
117524472Sdonn 		char size0;
117624472Sdonn 		int size1;
117724472Sdonn 		int ijunk[12];
117824472Sdonn 		} buf;
117924472Sdonn #else
118024472Sdonn 	struct stat buf;
118124472Sdonn #endif
118224472Sdonn 
118324472Sdonn if(stat(filename,&buf) < 0)
118424472Sdonn 	return(-1);
118524472Sdonn #ifdef VERSION6
118624472Sdonn 	return(buf.size0 || buf.size1);
118724472Sdonn #else
118824472Sdonn 	return( buf.st_size > 0 );
118924472Sdonn #endif
119024472Sdonn }
119124472Sdonn 
119224472Sdonn 
119324472Sdonn 
119424472Sdonn 
crfnames()119524472Sdonn crfnames()
119624472Sdonn {
119724472Sdonn fname(textfname, "x");
119824472Sdonn fname(asmfname, "s");
119924472Sdonn fname(asmpass2, "a");
120024472Sdonn fname(initfname, "d");
120124472Sdonn fname(sortfname, "S");
120224472Sdonn fname(objfdefault, "o");
120324472Sdonn fname(prepfname, "p");
120424472Sdonn fname(optzfname, "z");
120524472Sdonn fname(setfname, "A");
120624472Sdonn }
120724472Sdonn 
120824472Sdonn 
120924472Sdonn 
121024472Sdonn 
rmf(fn)121124472Sdonn rmf(fn)
121224472Sdonn register char *fn;
121324472Sdonn {
121424472Sdonn /* if(!debugflag && fn!=NULL && *fn!='\0') */
121524472Sdonn 
121624472Sdonn if(fn!=NULL && *fn!='\0')
121724472Sdonn 	unlink(fn);
121824472Sdonn }
121924472Sdonn 
122024472Sdonn 
122124472Sdonn 
122224472Sdonn 
122324472Sdonn 
fname(name,suff)122424472Sdonn LOCAL fname(name, suff)
122524472Sdonn char *name, *suff;
122624472Sdonn {
122737794Sbostic sprintf(name, "%s/%s%d.%s", _PATH_TMP, temppref, pid, suff);
122824472Sdonn }
122924472Sdonn 
123024472Sdonn 
123124472Sdonn 
123224472Sdonn 
dotchar(s)123324472Sdonn dotchar(s)
123424472Sdonn register char *s;
123524472Sdonn {
123624472Sdonn for( ; *s ; ++s)
123724472Sdonn 	if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
123824472Sdonn 		return( s[1] );
123924472Sdonn return(NO);
124024472Sdonn }
124124472Sdonn 
124224472Sdonn 
124324472Sdonn 
lastfield(s)124424472Sdonn char *lastfield(s)
124524472Sdonn register char *s;
124624472Sdonn {
124724472Sdonn register char *t;
124824472Sdonn for(t = s; *s ; ++s)
124924472Sdonn 	if(*s == '/')
125024472Sdonn 		t = s+1;
125124472Sdonn return(t);
125224472Sdonn }
125324472Sdonn 
125424472Sdonn 
125524472Sdonn 
lastchar(s)125624472Sdonn char *lastchar(s)
125724472Sdonn register char *s;
125824472Sdonn {
125924472Sdonn while(*s)
126024472Sdonn 	++s;
126124472Sdonn return(s-1);
126224472Sdonn }
126324472Sdonn 
setdoto(s)126424472Sdonn char *setdoto(s)
126524472Sdonn register char *s;
126624472Sdonn {
126724472Sdonn *lastchar(s) = 'o';
126824472Sdonn return( lastfield(s) );
126924472Sdonn }
127024472Sdonn 
127124472Sdonn 
127224472Sdonn 
badfile(s)127324472Sdonn badfile(s)
127424472Sdonn char *s;
127524472Sdonn {
127624472Sdonn fatalstr("cannot open intermediate file %s", s);
127724472Sdonn }
127824472Sdonn 
127924472Sdonn 
128024472Sdonn 
ckalloc(n)128124472Sdonn ptr ckalloc(n)
128224472Sdonn int n;
128324472Sdonn {
128425734Sdonn ptr p;
128525734Sdonn extern char *calloc();
128624472Sdonn 
128725734Sdonn if( p = (ptr) calloc(1, (unsigned) n) )
128824472Sdonn 	return(p);
128924472Sdonn 
129024472Sdonn fatal("out of memory");
129124472Sdonn /* NOTREACHED */
129224472Sdonn }
129324472Sdonn 
129424472Sdonn 
129524472Sdonn 
129624472Sdonn 
129724472Sdonn 
copyn(n,s)129824472Sdonn char *copyn(n, s)
129924472Sdonn register int n;
130024472Sdonn register char *s;
130124472Sdonn {
130224472Sdonn register char *p, *q;
130324472Sdonn 
130424472Sdonn p = q = (char *) ckalloc(n);
130524472Sdonn while(n-- > 0)
130624472Sdonn 	*q++ = *s++;
130724472Sdonn return(p);
130824472Sdonn }
130924472Sdonn 
131024472Sdonn 
131124472Sdonn 
copys(s)131224472Sdonn char *copys(s)
131324472Sdonn char *s;
131424472Sdonn {
131524472Sdonn return( copyn( strlen(s)+1 , s) );
131624472Sdonn }
131724472Sdonn 
131824472Sdonn 
131924472Sdonn 
132024472Sdonn 
132124472Sdonn 
oneof(c,s)132224472Sdonn oneof(c,s)
132324472Sdonn register c;
132424472Sdonn register char *s;
132524472Sdonn {
132624472Sdonn while( *s )
132724472Sdonn 	if(*s++ == c)
132824472Sdonn 		return(YES);
132924472Sdonn return(NO);
133024472Sdonn }
133124472Sdonn 
133224472Sdonn 
133324472Sdonn 
nodup(s)133424472Sdonn nodup(s)
133524472Sdonn char *s;
133624472Sdonn {
133724472Sdonn register char **p;
133824472Sdonn 
133924472Sdonn for(p = loadargs ; p < loadp ; ++p)
134024472Sdonn 	if( !strcmp(*p, s) )
134124472Sdonn 		return(NO);
134224472Sdonn 
134324472Sdonn return(YES);
134424472Sdonn }
134524472Sdonn 
134624472Sdonn 
134724472Sdonn 
fatal(t)134824472Sdonn static fatal(t)
134924472Sdonn char *t;
135024472Sdonn {
135124472Sdonn fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
135224472Sdonn if(debugflag)
135324472Sdonn 	abort();
135424472Sdonn done(1);
135524472Sdonn exit(1);
135624472Sdonn }
135724472Sdonn 
135824472Sdonn 
135924472Sdonn 
136024472Sdonn 
fatali(t,d)136124472Sdonn static fatali(t,d)
136224472Sdonn char *t;
136324472Sdonn int d;
136424472Sdonn {
136524472Sdonn char buff[100];
136624472Sdonn sprintf(buff, t, d);
136724472Sdonn fatal(buff);
136824472Sdonn }
136924472Sdonn 
137024472Sdonn 
137124472Sdonn 
137224472Sdonn 
fatalstr(t,s)137324472Sdonn static fatalstr(t, s)
137424472Sdonn char *t, *s;
137524472Sdonn {
137624472Sdonn char buff[100];
137724472Sdonn sprintf(buff, t, s);
137824472Sdonn fatal(buff);
137924472Sdonn }
err(s)138024472Sdonn err(s)
138124472Sdonn char *s;
138224472Sdonn {
138324472Sdonn fprintf(diagfile, "Error in file %s: %s\n", infname, s);
138424472Sdonn }
138524472Sdonn 
1386