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