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