xref: /original-bsd/usr.bin/f77/f77.vax/f77.c (revision 9189691c)
1*9189691cSbostic /*-
2*9189691cSbostic  * Copyright (c) 1985 The Regents of the University of California.
3*9189691cSbostic  * All rights reserved.
4*9189691cSbostic  *
5*9189691cSbostic  * %sccs.include.proprietary.c%
65ccb3b52Sdonn  */
75ccb3b52Sdonn 
85ccb3b52Sdonn #ifndef lint
9*9189691cSbostic char copyright[] =
10*9189691cSbostic "@(#) Copyright (c) 1985 The Regents of the University of California.\n\
11*9189691cSbostic  All rights reserved.\n";
12*9189691cSbostic #endif /* not lint */
13*9189691cSbostic 
14*9189691cSbostic #ifndef lint
15*9189691cSbostic static char sccsid[] = "@(#)f77.c	5.8 (Berkeley) 04/12/91";
16*9189691cSbostic #endif /* not lint */
175ccb3b52Sdonn 
185ccb3b52Sdonn /*
195ccb3b52Sdonn  * f77.c
205ccb3b52Sdonn  *
215ccb3b52Sdonn  * Driver program for the 4.2 BSD f77 compiler.
225ccb3b52Sdonn  *
235ccb3b52Sdonn  * University of Utah CS Dept modification history:
245ccb3b52Sdonn  *
255ccb3b52Sdonn  * $Log:	f77.c,v $
2657e5e7d2Sdonn  * Revision 5.4  85/12/17  19:12:14  donn
2757e5e7d2Sdonn  * Dynamically allocate buffer; add lint fixes.
2857e5e7d2Sdonn  *
2957e5e7d2Sdonn  * Revision 5.3  85/11/25  00:00:02  donn
3057e5e7d2Sdonn  * 4.3 beta
3157e5e7d2Sdonn  *
329fcaa7ddSdonn  * Revision 5.2  85/08/10  05:16:14  donn
339fcaa7ddSdonn  * Ifdeffed 66 code, added -r8 flag.  From Jerry Berkman.
349fcaa7ddSdonn  *
359fcaa7ddSdonn  * Revision 5.1  85/08/10  03:32:12  donn
369fcaa7ddSdonn  * 4.3 alpha
379fcaa7ddSdonn  *
385ccb3b52Sdonn  * Revision 1.14  85/03/01  00:07:57  donn
395ccb3b52Sdonn  * Portability fix from Ralph Campbell.
405ccb3b52Sdonn  *
415ccb3b52Sdonn  * Revision 1.13  85/02/12  19:31:47  donn
425ccb3b52Sdonn  * Use CATNAME to get the name of a concatenation command instead of
435ccb3b52Sdonn  * explicitly running 'cat' -- you can get the wrong 'cat' the old way!
445ccb3b52Sdonn  *
455ccb3b52Sdonn  * Revision 1.12  85/01/14  06:42:30  donn
465ccb3b52Sdonn  * Changed to call the peephole optimizer with the '-f' flag, so that
475ccb3b52Sdonn  * floating point moves are translated to integer moves.
485ccb3b52Sdonn  *
495ccb3b52Sdonn  * Revision 1.11  85/01/14  04:38:59  donn
505ccb3b52Sdonn  * Jerry's change to pass -O to f1 so it knows whether the peephole optimizer
515ccb3b52Sdonn  * will be run.  This is necessary in order to handle movf/movl translation.
525ccb3b52Sdonn  *
535ccb3b52Sdonn  * Revision 1.10  85/01/14  03:59:12  donn
545ccb3b52Sdonn  * Added Jerry Berkman's fix for the '-q' flag.
555ccb3b52Sdonn  *
565ccb3b52Sdonn  * Revision 1.9  84/11/09  01:51:26  donn
575ccb3b52Sdonn  * Cosmetic change to stupid() suggested by John McCarthy at Memorial
585ccb3b52Sdonn  * University, St. Johns.
595ccb3b52Sdonn  *
605ccb3b52Sdonn  * Revision 1.8  84/09/14  16:02:34  donn
615ccb3b52Sdonn  * Added changes to notice when people do 'f77 -c foo.f -o bar.o' and tell
625ccb3b52Sdonn  * them why it doesn't do what they think it does.
635ccb3b52Sdonn  *
645ccb3b52Sdonn  * Revision 1.7  84/08/24  21:08:31  donn
655ccb3b52Sdonn  * Added call to setrlimit() to prevent core dumps when not debugging.
665ccb3b52Sdonn  * Reorganized the include file arrangment somewhat.
675ccb3b52Sdonn  *
685ccb3b52Sdonn  * Revision 1.6  84/08/24  20:20:24  donn
695ccb3b52Sdonn  * Changed stupidity check on Jerry Berkman's suggestion -- now it balks if
705ccb3b52Sdonn  * the load file exists and has a sensitive suffix.
715ccb3b52Sdonn  *
725ccb3b52Sdonn  * Revision 1.5  84/08/15  18:56:44  donn
735ccb3b52Sdonn  * Added test for -O combined with -g, suggested by Raleigh Romine.  To keep
745ccb3b52Sdonn  * things simple, if both are specified then the second in the list is thrown
755ccb3b52Sdonn  * out and the user is warned.
765ccb3b52Sdonn  *
775ccb3b52Sdonn  * Revision 1.4  84/08/05  21:33:15  donn
785ccb3b52Sdonn  * Added stupidity check -- f77 won't load on a file that it's asked to
795ccb3b52Sdonn  * compile as well.
805ccb3b52Sdonn  *
815ccb3b52Sdonn  * Revision 1.3  84/08/04  22:58:24  donn
825ccb3b52Sdonn  * Improved error reporting -- we now explain why we died and what we did.
835ccb3b52Sdonn  * Only works on 4.2.  Added at the instigation of Jerry Berkman.
845ccb3b52Sdonn  *
855ccb3b52Sdonn  * Revision 1.2  84/07/28  13:11:24  donn
865ccb3b52Sdonn  * Added Ralph Campbell's changes to reduce offsets to data.
875ccb3b52Sdonn  *
885ccb3b52Sdonn  */
895ccb3b52Sdonn 
90c87c1baaSbostic char *xxxvers = "\n@(#) F77 DRIVER, VERSION 4.2,   1984 JULY 28\n";
915ccb3b52Sdonn #include <sys/types.h>
925ccb3b52Sdonn #include <sys/stat.h>
93f6b8b9daSbostic #include <sys/signal.h>
945ccb3b52Sdonn #include <ctype.h>
95f6b8b9daSbostic #include <stdio.h>
965ccb3b52Sdonn 
975ccb3b52Sdonn #ifdef	SIGPROF
985ccb3b52Sdonn /*
995ccb3b52Sdonn  * Some 4.2 BSD capabilities.
1005ccb3b52Sdonn  */
1015ccb3b52Sdonn #include <sys/time.h>
1025ccb3b52Sdonn #include <sys/resource.h>
1035ccb3b52Sdonn #define	NOCORE		1
1045ccb3b52Sdonn #include <sys/wait.h>
1055ccb3b52Sdonn #define PSIGNAL		1
1065ccb3b52Sdonn #endif
1075ccb3b52Sdonn 
1085ccb3b52Sdonn #include "defines.h"
1095ccb3b52Sdonn #include "machdefs.h"
110f6b8b9daSbostic #include "pathnames.h"
1115ccb3b52Sdonn #include "version.h"
1125ccb3b52Sdonn 
1135ccb3b52Sdonn static FILEP diagfile	= {stderr} ;
1145ccb3b52Sdonn static int pid;
1155ccb3b52Sdonn static int sigivalue	= 0;
1165ccb3b52Sdonn static int sigqvalue	= 0;
1175ccb3b52Sdonn static int sighvalue	= 0;
1185ccb3b52Sdonn static int sigtvalue	= 0;
1195ccb3b52Sdonn 
1205ccb3b52Sdonn static char *pass1name	= PASS1NAME ;
1215ccb3b52Sdonn static char *pass2name	= PASS2NAME ;
1225ccb3b52Sdonn static char *pass2opt	= PASS2OPT ;
1235ccb3b52Sdonn static char *asmname	= ASMNAME ;
1245ccb3b52Sdonn static char *ldname	= LDNAME ;
1255ccb3b52Sdonn static char *footname	= FOOTNAME;
1265ccb3b52Sdonn static char *proffoot	= PROFFOOT;
1275ccb3b52Sdonn static char *macroname	= "m4";
128f6b8b9daSbostic static char *shellname	= _PATH_BSHELL;
129f6b8b9daSbostic static char *cppname	= _PATH_CPP;
1305ccb3b52Sdonn static char *aoutname	= "a.out" ;
1315ccb3b52Sdonn static char *temppref	= TEMPPREF;
1325ccb3b52Sdonn 
1335ccb3b52Sdonn static char *infname;
1345ccb3b52Sdonn static char textfname[44];
1355ccb3b52Sdonn static char asmfname[44];
1365ccb3b52Sdonn static char asmpass2[44];
1375ccb3b52Sdonn static char initfname[44];
1385ccb3b52Sdonn static char sortfname[44];
1395ccb3b52Sdonn static char prepfname[44];
1405ccb3b52Sdonn static char objfdefault[44];
1415ccb3b52Sdonn static char optzfname[44];
1425ccb3b52Sdonn static char setfname[44];
1435ccb3b52Sdonn 
1445ccb3b52Sdonn static char fflags[50]	= "-";
1455ccb3b52Sdonn static char f2flags[50];
1465ccb3b52Sdonn static char cflags[50]	= "-c";
1475ccb3b52Sdonn #if TARGET == GCOS
1485ccb3b52Sdonn 	static char eflags[30]	= "system=gcos ";
1495ccb3b52Sdonn #else
1505ccb3b52Sdonn 	static char eflags[30]	= "system=unix ";
1515ccb3b52Sdonn #endif
1525ccb3b52Sdonn static char rflags[30]	= "";
1535ccb3b52Sdonn static char lflag[3]	= "-x";
1545ccb3b52Sdonn static char *fflagp	= fflags+1;
1555ccb3b52Sdonn static char *f2flagp	= f2flags;
1565ccb3b52Sdonn static char *eflagp	= eflags+12;
1575ccb3b52Sdonn static char *rflagp	= rflags;
1585ccb3b52Sdonn static char *cppflags	= "";
1595ccb3b52Sdonn static char **cppargs;
1605ccb3b52Sdonn static char **loadargs;
1615ccb3b52Sdonn static char **loadp;
1625ccb3b52Sdonn 
1635ccb3b52Sdonn static flag erred	= NO;
1645ccb3b52Sdonn static flag loadflag	= YES;
1655ccb3b52Sdonn static flag saveasmflag	= NO;
1665ccb3b52Sdonn static flag profileflag	= NO;
1675ccb3b52Sdonn static flag optimflag	= NO;
1685ccb3b52Sdonn static flag debugflag	= NO;
1695ccb3b52Sdonn static flag verbose	= NO;
1705ccb3b52Sdonn static flag fortonly	= NO;
1715ccb3b52Sdonn static flag macroflag	= NO;
1725ccb3b52Sdonn static flag sdbflag	= NO;
1735ccb3b52Sdonn static flag namesflag	= YES;
1745ccb3b52Sdonn 
17557e5e7d2Sdonn #if TARGET == PDP11
17657e5e7d2Sdonn static flag nofloating	= NO;
17757e5e7d2Sdonn #endif
17857e5e7d2Sdonn 
1795ccb3b52Sdonn static int ncpp;
1805ccb3b52Sdonn 
1815ccb3b52Sdonn 
main(argc,argv)1825ccb3b52Sdonn main(argc, argv)
1835ccb3b52Sdonn int argc;
1845ccb3b52Sdonn char **argv;
1855ccb3b52Sdonn {
18657e5e7d2Sdonn register int i, n;
18757e5e7d2Sdonn int c, status;
1885ccb3b52Sdonn char *setdoto(), *lastchar(), *lastfield(), *copys(), *argvtos();
1895ccb3b52Sdonn ptr ckalloc();
19057e5e7d2Sdonn char *strcat();
1915ccb3b52Sdonn register char *s;
1925ccb3b52Sdonn char fortfile[20], *t;
19357e5e7d2Sdonn char *buff;
1945ccb3b52Sdonn int intrupt();
1955ccb3b52Sdonn int new_aoutname = NO;
1965ccb3b52Sdonn 
1975ccb3b52Sdonn sigivalue = signal(SIGINT, SIG_IGN) == SIG_IGN;
1985ccb3b52Sdonn sigqvalue = signal(SIGQUIT,SIG_IGN) == SIG_IGN;
1995ccb3b52Sdonn sighvalue = signal(SIGHUP, SIG_IGN) == SIG_IGN;
2005ccb3b52Sdonn sigtvalue = signal(SIGTERM,SIG_IGN) == SIG_IGN;
2015ccb3b52Sdonn enbint(intrupt);
2025ccb3b52Sdonn 
2035ccb3b52Sdonn pid = getpid();
2045ccb3b52Sdonn crfnames();
2055ccb3b52Sdonn 
2065ccb3b52Sdonn cppargs  = (char **) ckalloc( argc * sizeof(*cppargs) );
2075ccb3b52Sdonn loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
2085ccb3b52Sdonn loadargs[1] = "-X";
2095ccb3b52Sdonn loadargs[2] = "-u";
2105ccb3b52Sdonn #if HERE==PDP11 || HERE==VAX
2115ccb3b52Sdonn 	loadargs[3] = "_MAIN_";
2125ccb3b52Sdonn #endif
2135ccb3b52Sdonn #if HERE == INTERDATA
2145ccb3b52Sdonn 	loadargs[3] = "main";
2155ccb3b52Sdonn #endif
2165ccb3b52Sdonn loadp = loadargs + 4;
2175ccb3b52Sdonn 
2185ccb3b52Sdonn --argc;
2195ccb3b52Sdonn ++argv;
2205ccb3b52Sdonn 
22157e5e7d2Sdonn for (i = 0, n = 50; i < argc; ++i)
22257e5e7d2Sdonn 	n += strlen(argv[i]) + 1;
22357e5e7d2Sdonn buff = (char *) ckalloc(n);
22457e5e7d2Sdonn 
2255ccb3b52Sdonn while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
2265ccb3b52Sdonn 	{
2275ccb3b52Sdonn 	for(s = argv[0]+1 ; *s ; ++s) switch(*s)
2285ccb3b52Sdonn 		{
2295ccb3b52Sdonn 		case 'T':  /* use special passes */
2305ccb3b52Sdonn 			switch(*++s)
2315ccb3b52Sdonn 				{
2325ccb3b52Sdonn 				case '1':
2335ccb3b52Sdonn 					pass1name = s+1; goto endfor;
2345ccb3b52Sdonn 				case '2':
2355ccb3b52Sdonn 					pass2name = s+1; goto endfor;
2365ccb3b52Sdonn 				case 'p':
2375ccb3b52Sdonn 					pass2opt = s+1; goto endfor;
2385ccb3b52Sdonn 				case 'a':
2395ccb3b52Sdonn 					asmname = s+1; goto endfor;
2405ccb3b52Sdonn 				case 'l':
2415ccb3b52Sdonn 					ldname = s+1; goto endfor;
2425ccb3b52Sdonn 				case 'F':
2435ccb3b52Sdonn 					footname = s+1; goto endfor;
2445ccb3b52Sdonn 				case 'm':
2455ccb3b52Sdonn 					macroname = s+1; goto endfor;
2465ccb3b52Sdonn 				case 't':
2475ccb3b52Sdonn 					temppref = s+1; goto endfor;
2485ccb3b52Sdonn 				default:
2495ccb3b52Sdonn 					fatali("bad option -T%c", *s);
2505ccb3b52Sdonn 				}
2515ccb3b52Sdonn 			break;
2525ccb3b52Sdonn 
2539fcaa7ddSdonn #ifdef ONLY66
2545ccb3b52Sdonn 		case '6':
2555ccb3b52Sdonn 			if(s[1]=='6')
2565ccb3b52Sdonn 				{
2575ccb3b52Sdonn 				*fflagp++ = *s++;
2585ccb3b52Sdonn 				goto copyfflag;
2595ccb3b52Sdonn 				}
2605ccb3b52Sdonn 			else	{
2615ccb3b52Sdonn 				fprintf(diagfile, "invalid flag 6%c\n", s[1]);
2625ccb3b52Sdonn 				done(1);
2635ccb3b52Sdonn 				}
2649fcaa7ddSdonn #endif
2655ccb3b52Sdonn 
2665ccb3b52Sdonn 		case 'w':
2675ccb3b52Sdonn 			if(s[1]=='6' && s[2]=='6')
2685ccb3b52Sdonn 				{
2695ccb3b52Sdonn 				*fflagp++ = *s++;
2705ccb3b52Sdonn 				*fflagp++ = *s++;
2715ccb3b52Sdonn 				}
2725ccb3b52Sdonn 
2735ccb3b52Sdonn 		copyfflag:
2745ccb3b52Sdonn 		case 'u':
2755ccb3b52Sdonn 		case 'U':
2765ccb3b52Sdonn 		case '1':
2775ccb3b52Sdonn 		case 'C':
2785ccb3b52Sdonn 			*fflagp++ = *s;
2795ccb3b52Sdonn 			break;
2805ccb3b52Sdonn 
2815ccb3b52Sdonn 		case 'O':
2825ccb3b52Sdonn 			if(sdbflag)
2835ccb3b52Sdonn 				{
2845ccb3b52Sdonn 				fprintf(diagfile, "-O and -g are incompatible; -O ignored\n");
2855ccb3b52Sdonn 				break;
2865ccb3b52Sdonn 				}
2875ccb3b52Sdonn 			optimflag = YES;
2885ccb3b52Sdonn 			*f2flagp++ = '-';
2895ccb3b52Sdonn 			*f2flagp++ = 'O';
2905ccb3b52Sdonn 			*f2flagp++ = ' ';
2915ccb3b52Sdonn #if TARGET == INTERDATA
2925ccb3b52Sdonn 				*loadp++ = "-r";
2935ccb3b52Sdonn 				*loadp++ = "-d";
2945ccb3b52Sdonn #endif
2955ccb3b52Sdonn 			*fflagp++ = 'O';
2965ccb3b52Sdonn 			break;
2975ccb3b52Sdonn 
2985ccb3b52Sdonn 		case 'N':
2995ccb3b52Sdonn 			*fflagp++ = 'N';
3005ccb3b52Sdonn 			if( oneof(*++s, "qxscn") )
3015ccb3b52Sdonn 				*fflagp++ = *s++;
3025ccb3b52Sdonn 			else	{
3035ccb3b52Sdonn 				fprintf(diagfile, "invalid flag -N%c\n", *s);
3045ccb3b52Sdonn 				done(1);
3055ccb3b52Sdonn 				}
3065ccb3b52Sdonn 			while( isdigit(*s) )
3075ccb3b52Sdonn 				*fflagp++ = *s++;
3085ccb3b52Sdonn 			*fflagp++ = 'X';
3095ccb3b52Sdonn 			goto endfor;
3105ccb3b52Sdonn 
3115ccb3b52Sdonn 		case 'm':
3125ccb3b52Sdonn 			if(s[1] == '4')
3135ccb3b52Sdonn 				++s;
3145ccb3b52Sdonn 			macroflag = YES;
3155ccb3b52Sdonn 			break;
3165ccb3b52Sdonn 
3175ccb3b52Sdonn 		case 'S':
31857e5e7d2Sdonn 			(void) strcat(cflags, " -S");
3195ccb3b52Sdonn 			saveasmflag = YES;
3205ccb3b52Sdonn 
3215ccb3b52Sdonn 		case 'c':
3225ccb3b52Sdonn 			if( new_aoutname == YES ){
3235ccb3b52Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
3245ccb3b52Sdonn 				new_aoutname = NO;
3255ccb3b52Sdonn 				}
3265ccb3b52Sdonn 			loadflag = NO;
3275ccb3b52Sdonn 			break;
3285ccb3b52Sdonn 
3295ccb3b52Sdonn 		case 'v':
3305ccb3b52Sdonn 			verbose = YES;
3315ccb3b52Sdonn 			fprintf(diagfile,"\nBerkeley F77, version %s\n",
3325ccb3b52Sdonn 				VERSIONNUMBER);
3335ccb3b52Sdonn 			break;
3345ccb3b52Sdonn 
3355ccb3b52Sdonn 		case 'd':
3365ccb3b52Sdonn 			debugflag = YES;
3375ccb3b52Sdonn 			*fflagp++ = 'd';
3385ccb3b52Sdonn 			s++;
3395ccb3b52Sdonn 			while( isdigit(*s) || *s == ',' )
3405ccb3b52Sdonn 				*fflagp++ = *s++;
3415ccb3b52Sdonn 			*fflagp++ = 'X';
3425ccb3b52Sdonn 			goto endfor;
3435ccb3b52Sdonn 
3445ccb3b52Sdonn 		case 'M':
3455ccb3b52Sdonn 			*loadp++ = "-M";
3465ccb3b52Sdonn 			break;
3475ccb3b52Sdonn 
3485ccb3b52Sdonn 		case 'g':
3495ccb3b52Sdonn 			if(optimflag)
3505ccb3b52Sdonn 				{
3515ccb3b52Sdonn 				fprintf(diagfile, "-g and -O are incompatible; -g ignored\n");
3525ccb3b52Sdonn 				break;
3535ccb3b52Sdonn 				}
35457e5e7d2Sdonn 			(void) strcat(cflags," -g");
3555ccb3b52Sdonn 			sdbflag = YES;
3565ccb3b52Sdonn 			goto copyfflag;
3575ccb3b52Sdonn 
3585ccb3b52Sdonn 		case 'p':
3595ccb3b52Sdonn 			profileflag = YES;
36057e5e7d2Sdonn 			(void) strcat(cflags," -p");
3615ccb3b52Sdonn 			*fflagp++ = 'p';
3625ccb3b52Sdonn 			if(s[1] == 'g')
3635ccb3b52Sdonn 				{
3645ccb3b52Sdonn 				proffoot = GPRFFOOT;
3655ccb3b52Sdonn 				s++;
3665ccb3b52Sdonn 				}
3675ccb3b52Sdonn 			break;
3685ccb3b52Sdonn 
3695ccb3b52Sdonn 		case 'q':
3705ccb3b52Sdonn 			namesflag = NO;
3715ccb3b52Sdonn 			*fflagp++ = *s;
3725ccb3b52Sdonn 			break;
3735ccb3b52Sdonn 
3745ccb3b52Sdonn 		case 'o':
3755ccb3b52Sdonn 			if( ! strcmp(s, "onetrip") )
3765ccb3b52Sdonn 				{
3775ccb3b52Sdonn 				*fflagp++ = '1';
3785ccb3b52Sdonn 				goto endfor;
3795ccb3b52Sdonn 				}
3805ccb3b52Sdonn 			new_aoutname = YES;
3815ccb3b52Sdonn 			aoutname = *++argv;
3825ccb3b52Sdonn 			--argc;
3835ccb3b52Sdonn 			if( loadflag == NO ){
3845ccb3b52Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
3855ccb3b52Sdonn 				new_aoutname = NO;
3865ccb3b52Sdonn 				}
3875ccb3b52Sdonn 			break;
3885ccb3b52Sdonn 
3895ccb3b52Sdonn #if TARGET == PDP11
3905ccb3b52Sdonn 		case 'f':
3915ccb3b52Sdonn 			nofloating = YES;
3925ccb3b52Sdonn 			pass2name = NOFLPASS2;
3935ccb3b52Sdonn 		break;
3945ccb3b52Sdonn #endif
3955ccb3b52Sdonn 
3965ccb3b52Sdonn 		case 'F':
3975ccb3b52Sdonn 			fortonly = YES;
3985ccb3b52Sdonn 			loadflag = NO;
3995ccb3b52Sdonn 			break;
4005ccb3b52Sdonn 		case 'D':
4015ccb3b52Sdonn 		case 'I':
4025ccb3b52Sdonn 			cppargs[ncpp++] = *argv;
4035ccb3b52Sdonn 			goto endfor;
4045ccb3b52Sdonn 
4055ccb3b52Sdonn 		case 'i':
4065ccb3b52Sdonn 			if((s[1]=='2' || s[1]=='4') && s[2] == '\0')
4075ccb3b52Sdonn 				{
4085ccb3b52Sdonn 				*fflagp++ = *s++;
4095ccb3b52Sdonn 				goto copyfflag;
4105ccb3b52Sdonn 				}
4115ccb3b52Sdonn 			fprintf(diagfile, "invalid flag -i%c\n", s[1]);
4125ccb3b52Sdonn 			done(1);
4135ccb3b52Sdonn 
4149fcaa7ddSdonn 		case 'r':	/* -r8 - double the precision */
4159fcaa7ddSdonn 			if(s[1] == '8' && s[2] == '\0')
4169fcaa7ddSdonn 				{
4179fcaa7ddSdonn 				s++;
4189fcaa7ddSdonn 				goto copyfflag;
4199fcaa7ddSdonn 				}
4209fcaa7ddSdonn 			else
4219fcaa7ddSdonn 				{
4229fcaa7ddSdonn 				*loadp++ = "-r";
4239fcaa7ddSdonn 				break;
4249fcaa7ddSdonn 				}
4259fcaa7ddSdonn 
4265ccb3b52Sdonn 		case 'l':	/* letter ell--library */
4275ccb3b52Sdonn 			s[-1] = '-';
4285ccb3b52Sdonn 			*loadp++ = s-1;
4295ccb3b52Sdonn 			goto endfor;
4305ccb3b52Sdonn 
4315ccb3b52Sdonn 		case 'E':	/* EFL flag argument */
4325ccb3b52Sdonn 			while( *eflagp++ = *++s)
4335ccb3b52Sdonn 				;
4345ccb3b52Sdonn 			*eflagp++ = ' ';
4355ccb3b52Sdonn 			goto endfor;
4365ccb3b52Sdonn 		case 'R':
4375ccb3b52Sdonn 			while( *rflagp++ = *++s )
4385ccb3b52Sdonn 				;
4395ccb3b52Sdonn 			*rflagp++ = ' ';
4405ccb3b52Sdonn 			goto endfor;
4415ccb3b52Sdonn 		default:
4425ccb3b52Sdonn 			lflag[1] = *s;
4435ccb3b52Sdonn 			*loadp++ = copys(lflag);
4445ccb3b52Sdonn 			break;
4455ccb3b52Sdonn 		}
4465ccb3b52Sdonn endfor:
4475ccb3b52Sdonn 	--argc;
4485ccb3b52Sdonn 	++argv;
4495ccb3b52Sdonn 	}
4505ccb3b52Sdonn 
4515ccb3b52Sdonn #ifdef	NOCORE
4525ccb3b52Sdonn if(!debugflag)
4535ccb3b52Sdonn 	{
4545ccb3b52Sdonn 	struct rlimit r;
4555ccb3b52Sdonn 
4565ccb3b52Sdonn 	r.rlim_cur = r.rlim_max = 0;
45757e5e7d2Sdonn 	(void) setrlimit(RLIMIT_CORE, &r);
4585ccb3b52Sdonn 	}
4595ccb3b52Sdonn #endif	NOCORE
4605ccb3b52Sdonn 
4615ccb3b52Sdonn *fflagp = '\0';
4625ccb3b52Sdonn 
4635ccb3b52Sdonn if (ncpp > 0)
4645ccb3b52Sdonn 	cppflags = argvtos (ncpp,cppargs);
4655ccb3b52Sdonn 
4665ccb3b52Sdonn loadargs[0] = ldname;
4675ccb3b52Sdonn #if TARGET == PDP11
4685ccb3b52Sdonn 	if(nofloating)
4695ccb3b52Sdonn 		*loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
4705ccb3b52Sdonn 	else
4715ccb3b52Sdonn #endif
4725ccb3b52Sdonn *loadp++ = (profileflag ? proffoot : footname);
4735ccb3b52Sdonn 
4745ccb3b52Sdonn for(i = 0 ; i<argc ; ++i)
4755ccb3b52Sdonn 	switch(c =  dotchar(infname = argv[i]) )
4765ccb3b52Sdonn 		{
4775ccb3b52Sdonn 		case 'r':	/* Ratfor file */
4785ccb3b52Sdonn 		case 'e':	/* EFL file */
4795ccb3b52Sdonn 			if( unreadable(argv[i]) )
4805ccb3b52Sdonn 				{
4815ccb3b52Sdonn 				erred = YES;
4825ccb3b52Sdonn 				break;
4835ccb3b52Sdonn 				}
4845ccb3b52Sdonn 			s = fortfile;
4855ccb3b52Sdonn 			t = lastfield(argv[i]);
4865ccb3b52Sdonn 			while( *s++ = *t++)
4875ccb3b52Sdonn 				;
4885ccb3b52Sdonn 			s[-2] = 'f';
4895ccb3b52Sdonn 
4905ccb3b52Sdonn 			if(macroflag)
4915ccb3b52Sdonn 				{
4925ccb3b52Sdonn 				sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
4935ccb3b52Sdonn 				if( sys(buff) )
4945ccb3b52Sdonn 					{
4955ccb3b52Sdonn 					rmf(prepfname);
4965ccb3b52Sdonn 					erred = YES;
4975ccb3b52Sdonn 					break;
4985ccb3b52Sdonn 					}
4995ccb3b52Sdonn 				infname = prepfname;
5005ccb3b52Sdonn 				}
5015ccb3b52Sdonn 
5025ccb3b52Sdonn 			if(c == 'e')
5035ccb3b52Sdonn 				sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
5045ccb3b52Sdonn 			else
5055ccb3b52Sdonn 				sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
5065ccb3b52Sdonn 			status = sys(buff);
5075ccb3b52Sdonn 			if(macroflag)
5085ccb3b52Sdonn 				rmf(infname);
5095ccb3b52Sdonn 			if(status)
5105ccb3b52Sdonn 				{
5115ccb3b52Sdonn 				erred = YES;
5125ccb3b52Sdonn 				rmf(fortfile);
5135ccb3b52Sdonn 				break;
5145ccb3b52Sdonn 				}
5155ccb3b52Sdonn 
5165ccb3b52Sdonn 			if( ! fortonly )
5175ccb3b52Sdonn 				{
5185ccb3b52Sdonn 				infname = argv[i] = lastfield(argv[i]);
5195ccb3b52Sdonn 				*lastchar(infname) = 'f';
5205ccb3b52Sdonn 
5215ccb3b52Sdonn 				if( dofort(argv[i]) )
5225ccb3b52Sdonn 					erred = YES;
5235ccb3b52Sdonn 				else	{
5245ccb3b52Sdonn 					if( nodup(t = setdoto(argv[i])) )
5255ccb3b52Sdonn 						*loadp++ = t;
5265ccb3b52Sdonn 					rmf(fortfile);
5275ccb3b52Sdonn 					}
5285ccb3b52Sdonn 				}
5295ccb3b52Sdonn 			break;
5305ccb3b52Sdonn 
5315ccb3b52Sdonn 		case 'F':	/* C preprocessor -> Fortran file */
5325ccb3b52Sdonn 			if( unreadable(argv[i]) )
5335ccb3b52Sdonn 				{
5345ccb3b52Sdonn 				erred = YES;
5355ccb3b52Sdonn 				break;
5365ccb3b52Sdonn 				}
5375ccb3b52Sdonn 			s = fortfile;
5385ccb3b52Sdonn 			t = lastfield(argv[i]);
5395ccb3b52Sdonn 			while( *s++ = *t++)
5405ccb3b52Sdonn 				;
5415ccb3b52Sdonn 			s[-2] = 'f';
5425ccb3b52Sdonn 			sprintf(buff,"%s %s %s >%s", cppname, cppflags, infname, fortfile);
5435ccb3b52Sdonn 			status = sys(buff);
5445ccb3b52Sdonn 			if(status)
5455ccb3b52Sdonn 				{
5465ccb3b52Sdonn 				erred = YES;
5475ccb3b52Sdonn 				rmf(fortfile);
5485ccb3b52Sdonn 				break;
5495ccb3b52Sdonn 				}
5505ccb3b52Sdonn 
5515ccb3b52Sdonn 			if( ! fortonly )
5525ccb3b52Sdonn 				{
5535ccb3b52Sdonn 				infname = argv[i] = lastfield(argv[i]);
5545ccb3b52Sdonn 				*lastchar(infname) = 'f';
5555ccb3b52Sdonn 
5565ccb3b52Sdonn 				if ( dofort(argv[i]) )
5575ccb3b52Sdonn 					erred = YES;
5585ccb3b52Sdonn 				else	{
5595ccb3b52Sdonn 					if (nodup(t = setdoto(argv[i])) )
5605ccb3b52Sdonn 						*loadp++ = t;
5615ccb3b52Sdonn 						rmf(fortfile);
5625ccb3b52Sdonn 						}
5635ccb3b52Sdonn 				}
5645ccb3b52Sdonn 			break;
5655ccb3b52Sdonn 
5665ccb3b52Sdonn 		case 'f':	/* Fortran file */
5675ccb3b52Sdonn 			if( unreadable(argv[i]) )
5685ccb3b52Sdonn 				erred = YES;
5695ccb3b52Sdonn 			else if( dofort(argv[i]) )
5705ccb3b52Sdonn 				erred = YES;
5715ccb3b52Sdonn 			else if( nodup(t=setdoto(argv[i])) )
5725ccb3b52Sdonn 				*loadp++ = t;
5735ccb3b52Sdonn 			break;
5745ccb3b52Sdonn 
5755ccb3b52Sdonn 		case 'c':	/* C file */
5765ccb3b52Sdonn 		case 's':	/* Assembler file */
5775ccb3b52Sdonn 			if( unreadable(argv[i]) )
5785ccb3b52Sdonn 				{
5795ccb3b52Sdonn 				erred = YES;
5805ccb3b52Sdonn 				break;
5815ccb3b52Sdonn 				}
5825ccb3b52Sdonn #if HERE==PDP11 || HERE==VAX
5835ccb3b52Sdonn 			if( namesflag == YES )
5845ccb3b52Sdonn 				fprintf(diagfile, "%s:\n", argv[i]);
5855ccb3b52Sdonn #endif
5865ccb3b52Sdonn 			sprintf(buff, "cc %s %s", cflags, argv[i] );
5875ccb3b52Sdonn 			if( sys(buff) )
5885ccb3b52Sdonn 				erred = YES;
5895ccb3b52Sdonn 			else
5905ccb3b52Sdonn 				if( nodup(t = setdoto(argv[i])) )
5915ccb3b52Sdonn 					*loadp++ = t;
5925ccb3b52Sdonn 			break;
5935ccb3b52Sdonn 
5945ccb3b52Sdonn 		case 'o':
5955ccb3b52Sdonn 			if( nodup(argv[i]) )
5965ccb3b52Sdonn 				*loadp++ = argv[i];
5975ccb3b52Sdonn 			break;
5985ccb3b52Sdonn 
5995ccb3b52Sdonn 		default:
6005ccb3b52Sdonn 			if( ! strcmp(argv[i], "-o") ) {
6015ccb3b52Sdonn 				aoutname = argv[++i];
6025ccb3b52Sdonn 				new_aoutname = YES;
6035ccb3b52Sdonn 				if( loadflag == NO ){
6045ccb3b52Sdonn 					fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
6055ccb3b52Sdonn 					new_aoutname = NO;
6065ccb3b52Sdonn 					}
6075ccb3b52Sdonn 			} else
6085ccb3b52Sdonn 				*loadp++ = argv[i];
6095ccb3b52Sdonn 			break;
6105ccb3b52Sdonn 		}
6115ccb3b52Sdonn 
6125ccb3b52Sdonn if( loadflag && stupid(aoutname) )
6135ccb3b52Sdonn 	erred = YES;
6145ccb3b52Sdonn if(loadflag && !erred)
6155ccb3b52Sdonn 	doload(loadargs, loadp);
6165ccb3b52Sdonn done(erred);
6175ccb3b52Sdonn }
6185ccb3b52Sdonn 
6195ccb3b52Sdonn 
6205ccb3b52Sdonn 
6215ccb3b52Sdonn /*
6225ccb3b52Sdonn  * argvtos() copies a list of arguments contained in an array of character
6235ccb3b52Sdonn  * strings to a single dynamically allocated string. Each argument is
6245ccb3b52Sdonn  * separated by one blank space. Returns a pointer to the string or null
6255ccb3b52Sdonn  * if out of memory.
6265ccb3b52Sdonn  */
6275ccb3b52Sdonn #define SBUFINCR	1024
6285ccb3b52Sdonn #define SBUFMAX		10240
6295ccb3b52Sdonn 
6305ccb3b52Sdonn char *
argvtos(argc,argv)6315ccb3b52Sdonn argvtos(argc, argv)
6325ccb3b52Sdonn 	char **argv;
6335ccb3b52Sdonn 	int  argc;
6345ccb3b52Sdonn {
6355ccb3b52Sdonn 	register char *s;		/* string pointer */
6365ccb3b52Sdonn 	register int  i;		/* string buffer pointer */
6375ccb3b52Sdonn 	char *malloc();			/* memory allocator */
6385ccb3b52Sdonn 	char *realloc();		/* increase size of storage */
6395ccb3b52Sdonn 	char *sbuf;			/* string buffer */
6405ccb3b52Sdonn 	int nbytes;			/* bytes of memory required */
6415ccb3b52Sdonn 	int nu;				/* no. of SBUFINCR units required */
6425ccb3b52Sdonn 	int sbufsize;			/* current size of sbuf */
6435ccb3b52Sdonn 	int strlen();			/* string length */
6445ccb3b52Sdonn 
6455ccb3b52Sdonn 	sbufsize = SBUFINCR;
6465ccb3b52Sdonn 	if ((sbuf = malloc((unsigned)sbufsize)) == NULL)
6475ccb3b52Sdonn 		{
6485ccb3b52Sdonn 		fatal("out of memory (argvtos)");
6495ccb3b52Sdonn 		/* NOTREACHED */
6505ccb3b52Sdonn 		}
6515ccb3b52Sdonn 
6525ccb3b52Sdonn 	for (i = 0; argc-- > 0; ++argv)
6535ccb3b52Sdonn 		{
6545ccb3b52Sdonn 		if ((nbytes = (i+strlen(*argv)+1-sbufsize)) > 0)
6555ccb3b52Sdonn 			{
6565ccb3b52Sdonn 			nu = (nbytes+SBUFINCR-1)/SBUFINCR;
6575ccb3b52Sdonn 			sbufsize += nu * SBUFINCR;
6585ccb3b52Sdonn 			if (sbufsize > SBUFMAX)
6595ccb3b52Sdonn 				{
6605ccb3b52Sdonn 				fatal("argument length exceeded (argvtos)");
6615ccb3b52Sdonn 				/* NOTREACHED */
6625ccb3b52Sdonn 				}
6635ccb3b52Sdonn 			if ((sbuf = realloc(sbuf, (unsigned)sbufsize)) == NULL)
6645ccb3b52Sdonn 				{
6655ccb3b52Sdonn 				fatal("out of memory (argvtos)");
6665ccb3b52Sdonn 				/* NOTREACHED */
6675ccb3b52Sdonn 				}
6685ccb3b52Sdonn 			}
6695ccb3b52Sdonn 		for (s = *argv; *s != '\0'; i++, s++)
6705ccb3b52Sdonn 			sbuf[i] = *s;
6715ccb3b52Sdonn 		sbuf[i++] = ' ';
6725ccb3b52Sdonn 		}
6735ccb3b52Sdonn 	sbuf[--i] = '\0';
6745ccb3b52Sdonn 	return(sbuf);
6755ccb3b52Sdonn }
6765ccb3b52Sdonn 
dofort(s)6775ccb3b52Sdonn dofort(s)
6785ccb3b52Sdonn char *s;
6795ccb3b52Sdonn {
6805ccb3b52Sdonn int retcode;
6815ccb3b52Sdonn char buff[200];
6825ccb3b52Sdonn 
6835ccb3b52Sdonn infname = s;
6845ccb3b52Sdonn sprintf(buff, "%s %s %s %s %s %s",
6855ccb3b52Sdonn 	pass1name, fflags, s, asmfname, initfname, textfname);
6865ccb3b52Sdonn switch( sys(buff) )
6875ccb3b52Sdonn 	{
6885ccb3b52Sdonn 	case 1:
6895ccb3b52Sdonn 		goto error;
6905ccb3b52Sdonn 	case 0:
6915ccb3b52Sdonn 		break;
6925ccb3b52Sdonn 	default:
6935ccb3b52Sdonn 		goto comperror;
6945ccb3b52Sdonn 	}
6955ccb3b52Sdonn 
6965ccb3b52Sdonn if( dopass2() )
6975ccb3b52Sdonn 	goto comperror;
6985ccb3b52Sdonn doasm(s);
6995ccb3b52Sdonn retcode = 0;
7005ccb3b52Sdonn 
7015ccb3b52Sdonn ret:
7025ccb3b52Sdonn 	rmf(asmfname);
7035ccb3b52Sdonn 	rmf(initfname);
7045ccb3b52Sdonn 	rmf(textfname);
7055ccb3b52Sdonn 	return(retcode);
7065ccb3b52Sdonn 
7075ccb3b52Sdonn error:
7085ccb3b52Sdonn 	fprintf(diagfile, "\nError.  No assembly.\n");
7095ccb3b52Sdonn 	retcode = 1;
7105ccb3b52Sdonn 	goto ret;
7115ccb3b52Sdonn 
7125ccb3b52Sdonn comperror:
7135ccb3b52Sdonn 	fprintf(diagfile, "\ncompiler error.\n");
7145ccb3b52Sdonn 	retcode = 2;
7155ccb3b52Sdonn 	goto ret;
7165ccb3b52Sdonn }
7175ccb3b52Sdonn 
7185ccb3b52Sdonn 
7195ccb3b52Sdonn 
7205ccb3b52Sdonn 
dopass2()7215ccb3b52Sdonn dopass2()
7225ccb3b52Sdonn {
7235ccb3b52Sdonn char buff[100];
7245ccb3b52Sdonn 
7255ccb3b52Sdonn if(verbose)
7265ccb3b52Sdonn 	fprintf(diagfile, "PASS2.");
7275ccb3b52Sdonn 
7285ccb3b52Sdonn #if FAMILY==DMR
7295ccb3b52Sdonn 	sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
7305ccb3b52Sdonn 	return( sys(buff) );
7315ccb3b52Sdonn #endif
7325ccb3b52Sdonn 
7335ccb3b52Sdonn 
7345ccb3b52Sdonn #if FAMILY == PCC
7355ccb3b52Sdonn #	if TARGET==INTERDATA
7365ccb3b52Sdonn 	sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
7375ccb3b52Sdonn #	else
7385ccb3b52Sdonn 	sprintf(buff, "%s %s %s >%s",
7395ccb3b52Sdonn 		pass2name, f2flags, textfname, asmpass2);
7405ccb3b52Sdonn #	endif
7415ccb3b52Sdonn 	return( sys(buff) );
7425ccb3b52Sdonn #endif
7435ccb3b52Sdonn }
7445ccb3b52Sdonn 
7455ccb3b52Sdonn 
7465ccb3b52Sdonn 
7475ccb3b52Sdonn 
doasm(s)7485ccb3b52Sdonn doasm(s)
7495ccb3b52Sdonn char *s;
7505ccb3b52Sdonn {
7515ccb3b52Sdonn register char *lastc;
7525ccb3b52Sdonn char *obj;
7535ccb3b52Sdonn char buff[200];
7545ccb3b52Sdonn char *lastchar(), *setdoto();
7555ccb3b52Sdonn 
7565ccb3b52Sdonn if(*s == '\0')
7575ccb3b52Sdonn 	s = objfdefault;
7585ccb3b52Sdonn lastc = lastchar(s);
7595ccb3b52Sdonn obj = setdoto(s);
7605ccb3b52Sdonn 
7615ccb3b52Sdonn #if TARGET==PDP11 || TARGET==VAX
7625ccb3b52Sdonn #	ifdef PASS2OPT
7635ccb3b52Sdonn 	if(optimflag)
7645ccb3b52Sdonn 		{
7655ccb3b52Sdonn 		sprintf(buff, "%s -f %s %s", pass2opt, asmpass2, optzfname);
7665ccb3b52Sdonn 		if( sys(buff) )
7675ccb3b52Sdonn 			rmf(optzfname);
7685ccb3b52Sdonn 		else
769de9535d7Sbostic 			if (rename(optzfname, asmpass2))
77057e5e7d2Sdonn 				fatal("can't rename optimizer output file");
7715ccb3b52Sdonn 		}
7725ccb3b52Sdonn #	endif
7735ccb3b52Sdonn #endif
7745ccb3b52Sdonn 
7755ccb3b52Sdonn if(saveasmflag)
7765ccb3b52Sdonn 	{
7775ccb3b52Sdonn 	*lastc = 's';
7785ccb3b52Sdonn #if TARGET == INTERDATA
7795ccb3b52Sdonn 	sprintf(buff, "%s %s %s %s %s >%s", CATNAME, asmfname, initfname,
7805ccb3b52Sdonn 		setfname, asmpass2, obj);
7815ccb3b52Sdonn #else
7825ccb3b52Sdonn #if TARGET == VAX
7835ccb3b52Sdonn 	if (sdbflag)
7845ccb3b52Sdonn 		sprintf(buff, "%s %s %s %s >%s",
7855ccb3b52Sdonn 			CATNAME, asmfname, asmpass2, initfname, obj);
7865ccb3b52Sdonn 	else
7875ccb3b52Sdonn 		sprintf(buff, "%s %s %s %s >%s",
7885ccb3b52Sdonn 			CATNAME, asmfname, initfname, asmpass2, obj);
7895ccb3b52Sdonn #else
7905ccb3b52Sdonn 	sprintf(buff, "%s %s %s %s >%s",
7915ccb3b52Sdonn 		CATNAME, asmfname, initfname, asmpass2, obj);
7925ccb3b52Sdonn #endif
7935ccb3b52Sdonn #endif
79457e5e7d2Sdonn 	if( sys(buff) )
79557e5e7d2Sdonn 		fatal("can't concatenate assembly files");
7965ccb3b52Sdonn 	*lastc = 'o';
7975ccb3b52Sdonn 	}
7985ccb3b52Sdonn else
7995ccb3b52Sdonn 	{
8005ccb3b52Sdonn 	if(verbose)
8015ccb3b52Sdonn 		fprintf(diagfile, "  ASM.");
8025ccb3b52Sdonn #if TARGET == INTERDATA
8035ccb3b52Sdonn 	sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname,
8045ccb3b52Sdonn 		initfname, setfname, asmpass2);
8055ccb3b52Sdonn #endif
8065ccb3b52Sdonn 
8075ccb3b52Sdonn #if TARGET == VAX
8085ccb3b52Sdonn 	/* vax assembler currently accepts only one input file */
8095ccb3b52Sdonn 	if (sdbflag)
8105ccb3b52Sdonn 		sprintf(buff, "%s %s %s >>%s",
8115ccb3b52Sdonn 			CATNAME, asmpass2, initfname, asmfname);
8125ccb3b52Sdonn 	else
8135ccb3b52Sdonn 		sprintf(buff, "%s %s %s >>%s",
8145ccb3b52Sdonn 			CATNAME, initfname, asmpass2, asmfname);
81557e5e7d2Sdonn 	if( sys(buff) )
81657e5e7d2Sdonn 		fatal("can't concatenate assembly files");
8175ccb3b52Sdonn #ifdef UCBVAXASM
8185ccb3b52Sdonn 	sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);
8195ccb3b52Sdonn #else
8205ccb3b52Sdonn 	sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
8215ccb3b52Sdonn #endif
8225ccb3b52Sdonn #endif
8235ccb3b52Sdonn 
8245ccb3b52Sdonn #if TARGET == PDP11
8255ccb3b52Sdonn 	sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
8265ccb3b52Sdonn #endif
8275ccb3b52Sdonn 
8285ccb3b52Sdonn #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
8295ccb3b52Sdonn 	sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
8305ccb3b52Sdonn #endif
8315ccb3b52Sdonn 
8325ccb3b52Sdonn 	if( sys(buff) )
8335ccb3b52Sdonn 		fatal("assembler error");
8345ccb3b52Sdonn 	if(verbose)
8355ccb3b52Sdonn 		fprintf(diagfile, "\n");
8365ccb3b52Sdonn #if HERE==PDP11 && TARGET!=PDP11
8375ccb3b52Sdonn 	rmf(obj);
8385ccb3b52Sdonn #endif
8395ccb3b52Sdonn 	}
8405ccb3b52Sdonn 
8415ccb3b52Sdonn rmf(asmpass2);
8425ccb3b52Sdonn }
8435ccb3b52Sdonn 
8445ccb3b52Sdonn 
8455ccb3b52Sdonn 
doload(v0,v)8465ccb3b52Sdonn doload(v0, v)
8475ccb3b52Sdonn register char *v0[], *v[];
8485ccb3b52Sdonn {
8495ccb3b52Sdonn char **p;
8505ccb3b52Sdonn int waitpid;
8515ccb3b52Sdonn 
8525ccb3b52Sdonn if (profileflag)
8535ccb3b52Sdonn 	{
8545ccb3b52Sdonn 	for(p = p_liblist ; *p ; *v++ = *p++)
8555ccb3b52Sdonn 		;
8565ccb3b52Sdonn 	}
8575ccb3b52Sdonn else	{
8585ccb3b52Sdonn 	for(p = liblist ; *p ; *v++ = *p++)
8595ccb3b52Sdonn 		;
8605ccb3b52Sdonn 	}
8615ccb3b52Sdonn 
8625ccb3b52Sdonn *v++ = "-o";
8635ccb3b52Sdonn *v++ = aoutname;
8645ccb3b52Sdonn *v = NULL;
8655ccb3b52Sdonn 
8665ccb3b52Sdonn if(verbose)
8675ccb3b52Sdonn 	fprintf(diagfile, "LOAD.");
8685ccb3b52Sdonn if(debugflag)
8695ccb3b52Sdonn 	{
8705ccb3b52Sdonn 	for(p = v0 ; p<v ; ++p)
8715ccb3b52Sdonn 		fprintf(diagfile, "%s ", *p);
8725ccb3b52Sdonn 	fprintf(diagfile, "\n");
8735ccb3b52Sdonn 	}
8745ccb3b52Sdonn 
8755ccb3b52Sdonn #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
8765ccb3b52Sdonn 	if( (waitpid = fork()) == 0)
8775ccb3b52Sdonn 		{
8785ccb3b52Sdonn 		enbint(SIG_DFL);
8795ccb3b52Sdonn 		execv(ldname, v0);
8805ccb3b52Sdonn 		fatalstr("couldn't load %s", ldname);
8815ccb3b52Sdonn 		}
88257e5e7d2Sdonn 	if( await(waitpid) )
88357e5e7d2Sdonn 		erred = YES;
8845ccb3b52Sdonn #endif
8855ccb3b52Sdonn 
8865ccb3b52Sdonn #if HERE==INTERDATA
8875ccb3b52Sdonn 	if(optimflag)
8885ccb3b52Sdonn 		{
8895ccb3b52Sdonn 		char buff1[100], buff2[100];
8905ccb3b52Sdonn 		sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
8915ccb3b52Sdonn 		sprintf(buff2, "mv junk.%d %s", pid, aoutname);
8925ccb3b52Sdonn 		if( sys(buff1) || sys(buff2) )
8935ccb3b52Sdonn 			err("bad optimization");
8945ccb3b52Sdonn 		}
8955ccb3b52Sdonn #endif
8965ccb3b52Sdonn 
8975ccb3b52Sdonn if(verbose)
8985ccb3b52Sdonn 	fprintf(diagfile, "\n");
8995ccb3b52Sdonn }
9005ccb3b52Sdonn 
9015ccb3b52Sdonn /* Process control and Shell-simulating routines */
9025ccb3b52Sdonn 
sys(str)9035ccb3b52Sdonn sys(str)
9045ccb3b52Sdonn char *str;
9055ccb3b52Sdonn {
9065ccb3b52Sdonn register char *s, *t;
907f6b8b9daSbostic char *argv[100];
9085ccb3b52Sdonn char *inname, *outname;
9095ccb3b52Sdonn int append;
9105ccb3b52Sdonn int waitpid;
9115ccb3b52Sdonn int argc;
9125ccb3b52Sdonn 
9135ccb3b52Sdonn 
9145ccb3b52Sdonn if(debugflag)
9155ccb3b52Sdonn 	fprintf(diagfile, "%s\n", str);
9165ccb3b52Sdonn inname  = NULL;
9175ccb3b52Sdonn outname = NULL;
9185ccb3b52Sdonn argv[0] = shellname;
9195ccb3b52Sdonn argc = 1;
9205ccb3b52Sdonn 
9215ccb3b52Sdonn t = str;
9225ccb3b52Sdonn while( isspace(*t) )
9235ccb3b52Sdonn 	++t;
9245ccb3b52Sdonn while(*t)
9255ccb3b52Sdonn 	{
9265ccb3b52Sdonn 	if(*t == '<')
9275ccb3b52Sdonn 		inname = t+1;
9285ccb3b52Sdonn 	else if(*t == '>')
9295ccb3b52Sdonn 		{
9305ccb3b52Sdonn 		if(t[1] == '>')
9315ccb3b52Sdonn 			{
9325ccb3b52Sdonn 			append = YES;
9335ccb3b52Sdonn 			outname = t+2;
9345ccb3b52Sdonn 			}
9355ccb3b52Sdonn 		else	{
9365ccb3b52Sdonn 			append = NO;
9375ccb3b52Sdonn 			outname = t+1;
9385ccb3b52Sdonn 			}
9395ccb3b52Sdonn 		}
9405ccb3b52Sdonn 	else
9415ccb3b52Sdonn 		argv[argc++] = t;
9425ccb3b52Sdonn 	while( !isspace(*t) && *t!='\0' )
9435ccb3b52Sdonn 		++t;
9445ccb3b52Sdonn 	if(*t)
9455ccb3b52Sdonn 		{
9465ccb3b52Sdonn 		*t++ = '\0';
9475ccb3b52Sdonn 		while( isspace(*t) )
9485ccb3b52Sdonn 			++t;
9495ccb3b52Sdonn 		}
9505ccb3b52Sdonn 	}
9515ccb3b52Sdonn 
9525ccb3b52Sdonn if(argc == 1)   /* no command */
9535ccb3b52Sdonn 	return(-1);
9545ccb3b52Sdonn argv[argc] = 0;
9555ccb3b52Sdonn 
9565ccb3b52Sdonn if((waitpid = fork()) == 0)
9575ccb3b52Sdonn 	{
9585ccb3b52Sdonn 	if(inname)
95957e5e7d2Sdonn 		if(freopen(inname, "r", stdin) == NULL)
96057e5e7d2Sdonn 			fatalstr("Cannot open %s", inname);
9615ccb3b52Sdonn 	if(outname)
96257e5e7d2Sdonn 		if(freopen(outname, (append ? "a" : "w"), stdout) == NULL)
96357e5e7d2Sdonn 			fatalstr("Cannot open %s", outname);
9645ccb3b52Sdonn 	enbint(SIG_DFL);
9655ccb3b52Sdonn 
966f6b8b9daSbostic 	texec(argv[1], argv);
9675ccb3b52Sdonn 
968f6b8b9daSbostic 	fatalstr("Cannot load %s", argv[1]);
9695ccb3b52Sdonn 	}
9705ccb3b52Sdonn 
9715ccb3b52Sdonn return( await(waitpid) );
9725ccb3b52Sdonn }
9735ccb3b52Sdonn 
9745ccb3b52Sdonn 
9755ccb3b52Sdonn 
9765ccb3b52Sdonn 
9775ccb3b52Sdonn 
9785ccb3b52Sdonn #include "errno.h"
9795ccb3b52Sdonn 
9805ccb3b52Sdonn /* modified version from the Shell */
texec(f,av)9815ccb3b52Sdonn texec(f, av)
9825ccb3b52Sdonn char *f;
9835ccb3b52Sdonn char **av;
9845ccb3b52Sdonn {
9855ccb3b52Sdonn extern int errno;
9865ccb3b52Sdonn 
9875ccb3b52Sdonn execv(f, av+1);
9885ccb3b52Sdonn 
9895ccb3b52Sdonn if (errno==ENOEXEC)
9905ccb3b52Sdonn 	{
9915ccb3b52Sdonn 	av[1] = f;
9925ccb3b52Sdonn 	execv(shellname, av);
9935ccb3b52Sdonn 	fatal("No shell!");
9945ccb3b52Sdonn 	}
9955ccb3b52Sdonn if (errno==ENOMEM)
9965ccb3b52Sdonn 	fatalstr("%s: too large", f);
9975ccb3b52Sdonn }
9985ccb3b52Sdonn 
9995ccb3b52Sdonn 
10005ccb3b52Sdonn 
10015ccb3b52Sdonn 
10025ccb3b52Sdonn 
10035ccb3b52Sdonn 
done(k)10045ccb3b52Sdonn done(k)
10055ccb3b52Sdonn int k;
10065ccb3b52Sdonn {
10075ccb3b52Sdonn static int recurs	= NO;
10085ccb3b52Sdonn 
10095ccb3b52Sdonn if(recurs == NO)
10105ccb3b52Sdonn 	{
10115ccb3b52Sdonn 	recurs = YES;
10125ccb3b52Sdonn 	rmfiles();
10135ccb3b52Sdonn 	}
10145ccb3b52Sdonn exit(k);
10155ccb3b52Sdonn }
10165ccb3b52Sdonn 
10175ccb3b52Sdonn 
10185ccb3b52Sdonn 
10195ccb3b52Sdonn 
10205ccb3b52Sdonn 
10215ccb3b52Sdonn 
10225ccb3b52Sdonn enbint(k)
10235ccb3b52Sdonn int (*k)();
10245ccb3b52Sdonn {
10255ccb3b52Sdonn if(sigivalue == 0)
102657e5e7d2Sdonn 	(void) signal(SIGINT,k);
10275ccb3b52Sdonn if(sigqvalue == 0)
102857e5e7d2Sdonn 	(void) signal(SIGQUIT,k);
10295ccb3b52Sdonn if(sighvalue == 0)
103057e5e7d2Sdonn 	(void) signal(SIGHUP,k);
10315ccb3b52Sdonn if(sigtvalue == 0)
103257e5e7d2Sdonn 	(void) signal(SIGTERM,k);
10335ccb3b52Sdonn }
10345ccb3b52Sdonn 
10355ccb3b52Sdonn 
10365ccb3b52Sdonn 
10375ccb3b52Sdonn 
intrupt()10385ccb3b52Sdonn intrupt()
10395ccb3b52Sdonn {
10405ccb3b52Sdonn done(2);
10415ccb3b52Sdonn }
10425ccb3b52Sdonn 
10435ccb3b52Sdonn 
10445ccb3b52Sdonn #ifdef PSIGNAL
10455ccb3b52Sdonn /*
10465ccb3b52Sdonn  * Fancy 4.2 BSD signal printing stuff.
10475ccb3b52Sdonn  */
10485ccb3b52Sdonn char harmless[NSIG] = { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };
10495ccb3b52Sdonn #endif
10505ccb3b52Sdonn 
10515ccb3b52Sdonn 
await(waitpid)10525ccb3b52Sdonn await(waitpid)
10535ccb3b52Sdonn int waitpid;
10545ccb3b52Sdonn {
10555ccb3b52Sdonn 
10565ccb3b52Sdonn #ifdef PSIGNAL
10575ccb3b52Sdonn extern char *sys_siglist[];
10585ccb3b52Sdonn union wait status;
10595ccb3b52Sdonn #else PSIGNAL
10605ccb3b52Sdonn int status;
10615ccb3b52Sdonn #endif PSIGNAL
10625ccb3b52Sdonn 
10635ccb3b52Sdonn int w;
10645ccb3b52Sdonn 
10655ccb3b52Sdonn enbint(SIG_IGN);
10665ccb3b52Sdonn while ( (w = wait(&status)) != waitpid)
10675ccb3b52Sdonn 	if(w == -1)
10685ccb3b52Sdonn 		fatal("bad wait code");
10695ccb3b52Sdonn enbint(intrupt);
10705ccb3b52Sdonn 
10715ccb3b52Sdonn #ifdef PSIGNAL
10725ccb3b52Sdonn if(status.w_termsig)
10735ccb3b52Sdonn 	{
10745ccb3b52Sdonn 	debugflag = 0;	/* Prevent us from dumping core ourselves */
10755ccb3b52Sdonn 	if(status.w_termsig != SIGINT && status.w_termsig < NSIG)
10765ccb3b52Sdonn 		fprintf(diagfile, "%s%s\n", sys_siglist[status.w_termsig],
10775ccb3b52Sdonn 			status.w_coredump ? " -- core dumped" : "");
10785ccb3b52Sdonn 	if(status.w_termsig < NSIG && ! harmless[status.w_termsig])
10795ccb3b52Sdonn 		fatal("see a system manager");
10805ccb3b52Sdonn 	else
10815ccb3b52Sdonn 		done(3);
10825ccb3b52Sdonn 	}
10835ccb3b52Sdonn return(status.w_retcode);
10845ccb3b52Sdonn #else PSIGNAL
10855ccb3b52Sdonn if(status & 0377)
10865ccb3b52Sdonn 	{
10875ccb3b52Sdonn 	if(status != SIGINT)
10885ccb3b52Sdonn 		fprintf(diagfile, "Termination code %d\n", status);
10895ccb3b52Sdonn 	done(3);
10905ccb3b52Sdonn 	}
10915ccb3b52Sdonn return(status>>8);
10925ccb3b52Sdonn #endif PSIGNAL
10935ccb3b52Sdonn }
10945ccb3b52Sdonn 
10955ccb3b52Sdonn /* File Name and File Manipulation Routines */
10965ccb3b52Sdonn 
unreadable(s)10975ccb3b52Sdonn unreadable(s)
10985ccb3b52Sdonn register char *s;
10995ccb3b52Sdonn {
11005ccb3b52Sdonn register FILE *fp;
11015ccb3b52Sdonn 
11025ccb3b52Sdonn if(fp = fopen(s, "r"))
11035ccb3b52Sdonn 	{
11045ccb3b52Sdonn 	fclose(fp);
11055ccb3b52Sdonn 	return(NO);
11065ccb3b52Sdonn 	}
11075ccb3b52Sdonn 
11085ccb3b52Sdonn else
11095ccb3b52Sdonn 	{
11105ccb3b52Sdonn 	fprintf(diagfile, "Error: Cannot read file %s\n", s);
11115ccb3b52Sdonn 	return(YES);
11125ccb3b52Sdonn 	}
11135ccb3b52Sdonn }
11145ccb3b52Sdonn 
11155ccb3b52Sdonn 
11165ccb3b52Sdonn 
stupid(s)11175ccb3b52Sdonn stupid(s)
11185ccb3b52Sdonn char *s;
11195ccb3b52Sdonn {
11205ccb3b52Sdonn char c;
112157e5e7d2Sdonn extern char *index();
11225ccb3b52Sdonn 
11235ccb3b52Sdonn if( (c = dotchar(s))
11245ccb3b52Sdonn   && index("focsreF", c)
11255ccb3b52Sdonn   && access(s, 0) == 0 )
11265ccb3b52Sdonn 	{
11275ccb3b52Sdonn 	fprintf(diagfile, "Loading on %s would destroy it\n", s);
11285ccb3b52Sdonn 	return(YES);
11295ccb3b52Sdonn 	}
11305ccb3b52Sdonn return(NO);
11315ccb3b52Sdonn }
11325ccb3b52Sdonn 
11335ccb3b52Sdonn 
11345ccb3b52Sdonn 
clf(p)11355ccb3b52Sdonn clf(p)
11365ccb3b52Sdonn FILEP *p;
11375ccb3b52Sdonn {
11385ccb3b52Sdonn if(p!=NULL && *p!=NULL && *p!=stdout)
11395ccb3b52Sdonn 	{
11405ccb3b52Sdonn 	if(ferror(*p))
11415ccb3b52Sdonn 		fatal("writing error");
11425ccb3b52Sdonn 	fclose(*p);
11435ccb3b52Sdonn 	}
11445ccb3b52Sdonn *p = NULL;
11455ccb3b52Sdonn }
11465ccb3b52Sdonn 
rmfiles()11475ccb3b52Sdonn rmfiles()
11485ccb3b52Sdonn {
11495ccb3b52Sdonn rmf(textfname);
11505ccb3b52Sdonn rmf(asmfname);
11515ccb3b52Sdonn rmf(initfname);
11525ccb3b52Sdonn rmf(asmpass2);
11535ccb3b52Sdonn #if TARGET == INTERDATA
11545ccb3b52Sdonn 	rmf(setfname);
11555ccb3b52Sdonn #endif
11565ccb3b52Sdonn }
11575ccb3b52Sdonn 
11585ccb3b52Sdonn 
11595ccb3b52Sdonn 
11605ccb3b52Sdonn 
11615ccb3b52Sdonn 
11625ccb3b52Sdonn 
11635ccb3b52Sdonn 
11645ccb3b52Sdonn 
11655ccb3b52Sdonn /* return -1 if file does not exist, 0 if it is of zero length
11665ccb3b52Sdonn    and 1 if of positive length
11675ccb3b52Sdonn */
content(filename)11685ccb3b52Sdonn content(filename)
11695ccb3b52Sdonn char *filename;
11705ccb3b52Sdonn {
11715ccb3b52Sdonn #ifdef VERSION6
11725ccb3b52Sdonn 	struct stat
11735ccb3b52Sdonn 		{
11745ccb3b52Sdonn 		char cjunk[9];
11755ccb3b52Sdonn 		char size0;
11765ccb3b52Sdonn 		int size1;
11775ccb3b52Sdonn 		int ijunk[12];
11785ccb3b52Sdonn 		} buf;
11795ccb3b52Sdonn #else
11805ccb3b52Sdonn 	struct stat buf;
11815ccb3b52Sdonn #endif
11825ccb3b52Sdonn 
11835ccb3b52Sdonn if(stat(filename,&buf) < 0)
11845ccb3b52Sdonn 	return(-1);
11855ccb3b52Sdonn #ifdef VERSION6
11865ccb3b52Sdonn 	return(buf.size0 || buf.size1);
11875ccb3b52Sdonn #else
11885ccb3b52Sdonn 	return( buf.st_size > 0 );
11895ccb3b52Sdonn #endif
11905ccb3b52Sdonn }
11915ccb3b52Sdonn 
11925ccb3b52Sdonn 
11935ccb3b52Sdonn 
11945ccb3b52Sdonn 
crfnames()11955ccb3b52Sdonn crfnames()
11965ccb3b52Sdonn {
11975ccb3b52Sdonn fname(textfname, "x");
11985ccb3b52Sdonn fname(asmfname, "s");
11995ccb3b52Sdonn fname(asmpass2, "a");
12005ccb3b52Sdonn fname(initfname, "d");
12015ccb3b52Sdonn fname(sortfname, "S");
12025ccb3b52Sdonn fname(objfdefault, "o");
12035ccb3b52Sdonn fname(prepfname, "p");
12045ccb3b52Sdonn fname(optzfname, "z");
12055ccb3b52Sdonn fname(setfname, "A");
12065ccb3b52Sdonn }
12075ccb3b52Sdonn 
12085ccb3b52Sdonn 
12095ccb3b52Sdonn 
12105ccb3b52Sdonn 
rmf(fn)12115ccb3b52Sdonn rmf(fn)
12125ccb3b52Sdonn register char *fn;
12135ccb3b52Sdonn {
12145ccb3b52Sdonn /* if(!debugflag && fn!=NULL && *fn!='\0') */
12155ccb3b52Sdonn 
12165ccb3b52Sdonn if(fn!=NULL && *fn!='\0')
12175ccb3b52Sdonn 	unlink(fn);
12185ccb3b52Sdonn }
12195ccb3b52Sdonn 
12205ccb3b52Sdonn 
12215ccb3b52Sdonn 
12225ccb3b52Sdonn 
12235ccb3b52Sdonn 
fname(name,suff)12245ccb3b52Sdonn LOCAL fname(name, suff)
12255ccb3b52Sdonn char *name, *suff;
12265ccb3b52Sdonn {
1227f6b8b9daSbostic sprintf(name, "%s/%s%d.%s", _PATH_TMP, temppref, pid, suff);
12285ccb3b52Sdonn }
12295ccb3b52Sdonn 
12305ccb3b52Sdonn 
12315ccb3b52Sdonn 
12325ccb3b52Sdonn 
dotchar(s)12335ccb3b52Sdonn dotchar(s)
12345ccb3b52Sdonn register char *s;
12355ccb3b52Sdonn {
12365ccb3b52Sdonn for( ; *s ; ++s)
12375ccb3b52Sdonn 	if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
12385ccb3b52Sdonn 		return( s[1] );
12395ccb3b52Sdonn return(NO);
12405ccb3b52Sdonn }
12415ccb3b52Sdonn 
12425ccb3b52Sdonn 
12435ccb3b52Sdonn 
lastfield(s)12445ccb3b52Sdonn char *lastfield(s)
12455ccb3b52Sdonn register char *s;
12465ccb3b52Sdonn {
12475ccb3b52Sdonn register char *t;
12485ccb3b52Sdonn for(t = s; *s ; ++s)
12495ccb3b52Sdonn 	if(*s == '/')
12505ccb3b52Sdonn 		t = s+1;
12515ccb3b52Sdonn return(t);
12525ccb3b52Sdonn }
12535ccb3b52Sdonn 
12545ccb3b52Sdonn 
12555ccb3b52Sdonn 
lastchar(s)12565ccb3b52Sdonn char *lastchar(s)
12575ccb3b52Sdonn register char *s;
12585ccb3b52Sdonn {
12595ccb3b52Sdonn while(*s)
12605ccb3b52Sdonn 	++s;
12615ccb3b52Sdonn return(s-1);
12625ccb3b52Sdonn }
12635ccb3b52Sdonn 
setdoto(s)12645ccb3b52Sdonn char *setdoto(s)
12655ccb3b52Sdonn register char *s;
12665ccb3b52Sdonn {
12675ccb3b52Sdonn *lastchar(s) = 'o';
12685ccb3b52Sdonn return( lastfield(s) );
12695ccb3b52Sdonn }
12705ccb3b52Sdonn 
12715ccb3b52Sdonn 
12725ccb3b52Sdonn 
badfile(s)12735ccb3b52Sdonn badfile(s)
12745ccb3b52Sdonn char *s;
12755ccb3b52Sdonn {
12765ccb3b52Sdonn fatalstr("cannot open intermediate file %s", s);
12775ccb3b52Sdonn }
12785ccb3b52Sdonn 
12795ccb3b52Sdonn 
12805ccb3b52Sdonn 
ckalloc(n)12815ccb3b52Sdonn ptr ckalloc(n)
12825ccb3b52Sdonn int n;
12835ccb3b52Sdonn {
128457e5e7d2Sdonn ptr p;
128557e5e7d2Sdonn extern char *calloc();
12865ccb3b52Sdonn 
128757e5e7d2Sdonn if( p = (ptr) calloc(1, (unsigned) n) )
12885ccb3b52Sdonn 	return(p);
12895ccb3b52Sdonn 
12905ccb3b52Sdonn fatal("out of memory");
12915ccb3b52Sdonn /* NOTREACHED */
12925ccb3b52Sdonn }
12935ccb3b52Sdonn 
12945ccb3b52Sdonn 
12955ccb3b52Sdonn 
12965ccb3b52Sdonn 
12975ccb3b52Sdonn 
copyn(n,s)12985ccb3b52Sdonn char *copyn(n, s)
12995ccb3b52Sdonn register int n;
13005ccb3b52Sdonn register char *s;
13015ccb3b52Sdonn {
13025ccb3b52Sdonn register char *p, *q;
13035ccb3b52Sdonn 
13045ccb3b52Sdonn p = q = (char *) ckalloc(n);
13055ccb3b52Sdonn while(n-- > 0)
13065ccb3b52Sdonn 	*q++ = *s++;
13075ccb3b52Sdonn return(p);
13085ccb3b52Sdonn }
13095ccb3b52Sdonn 
13105ccb3b52Sdonn 
13115ccb3b52Sdonn 
copys(s)13125ccb3b52Sdonn char *copys(s)
13135ccb3b52Sdonn char *s;
13145ccb3b52Sdonn {
13155ccb3b52Sdonn return( copyn( strlen(s)+1 , s) );
13165ccb3b52Sdonn }
13175ccb3b52Sdonn 
13185ccb3b52Sdonn 
13195ccb3b52Sdonn 
13205ccb3b52Sdonn 
13215ccb3b52Sdonn 
oneof(c,s)13225ccb3b52Sdonn oneof(c,s)
13235ccb3b52Sdonn register c;
13245ccb3b52Sdonn register char *s;
13255ccb3b52Sdonn {
13265ccb3b52Sdonn while( *s )
13275ccb3b52Sdonn 	if(*s++ == c)
13285ccb3b52Sdonn 		return(YES);
13295ccb3b52Sdonn return(NO);
13305ccb3b52Sdonn }
13315ccb3b52Sdonn 
13325ccb3b52Sdonn 
13335ccb3b52Sdonn 
nodup(s)13345ccb3b52Sdonn nodup(s)
13355ccb3b52Sdonn char *s;
13365ccb3b52Sdonn {
13375ccb3b52Sdonn register char **p;
13385ccb3b52Sdonn 
13395ccb3b52Sdonn for(p = loadargs ; p < loadp ; ++p)
13405ccb3b52Sdonn 	if( !strcmp(*p, s) )
13415ccb3b52Sdonn 		return(NO);
13425ccb3b52Sdonn 
13435ccb3b52Sdonn return(YES);
13445ccb3b52Sdonn }
13455ccb3b52Sdonn 
13465ccb3b52Sdonn 
13475ccb3b52Sdonn 
fatal(t)13485ccb3b52Sdonn static fatal(t)
13495ccb3b52Sdonn char *t;
13505ccb3b52Sdonn {
13515ccb3b52Sdonn fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
13525ccb3b52Sdonn if(debugflag)
13535ccb3b52Sdonn 	abort();
13545ccb3b52Sdonn done(1);
13555ccb3b52Sdonn exit(1);
13565ccb3b52Sdonn }
13575ccb3b52Sdonn 
13585ccb3b52Sdonn 
13595ccb3b52Sdonn 
13605ccb3b52Sdonn 
fatali(t,d)13615ccb3b52Sdonn static fatali(t,d)
13625ccb3b52Sdonn char *t;
13635ccb3b52Sdonn int d;
13645ccb3b52Sdonn {
13655ccb3b52Sdonn char buff[100];
13665ccb3b52Sdonn sprintf(buff, t, d);
13675ccb3b52Sdonn fatal(buff);
13685ccb3b52Sdonn }
13695ccb3b52Sdonn 
13705ccb3b52Sdonn 
13715ccb3b52Sdonn 
13725ccb3b52Sdonn 
fatalstr(t,s)13735ccb3b52Sdonn static fatalstr(t, s)
13745ccb3b52Sdonn char *t, *s;
13755ccb3b52Sdonn {
13765ccb3b52Sdonn char buff[100];
13775ccb3b52Sdonn sprintf(buff, t, s);
13785ccb3b52Sdonn fatal(buff);
13795ccb3b52Sdonn }
err(s)13805ccb3b52Sdonn err(s)
13815ccb3b52Sdonn char *s;
13825ccb3b52Sdonn {
13835ccb3b52Sdonn fprintf(diagfile, "Error in file %s: %s\n", infname, s);
13845ccb3b52Sdonn }
13855ccb3b52Sdonn 
1386