xref: /csrg-svn/usr.bin/f77/f77.vax/f77.c (revision 24472)
1*24472Sdonn /*
2*24472Sdonn  * Copyright (c) 1980 Regents of the University of California.
3*24472Sdonn  * All rights reserved.  The Berkeley software License Agreement
4*24472Sdonn  * specifies the terms and conditions for redistribution.
5*24472Sdonn  */
6*24472Sdonn 
7*24472Sdonn #ifndef lint
8*24472Sdonn static	char sccsid[] = "@(#)f77.c	5.1 (Berkeley) 08/29/85";
9*24472Sdonn #endif
10*24472Sdonn 
11*24472Sdonn /*
12*24472Sdonn  * f77.c
13*24472Sdonn  *
14*24472Sdonn  * Driver program for the 4.2 BSD f77 compiler.
15*24472Sdonn  *
16*24472Sdonn  * University of Utah CS Dept modification history:
17*24472Sdonn  *
18*24472Sdonn  * $Log:	f77.c,v $
19*24472Sdonn  * Revision 1.14  85/03/01  00:07:57  donn
20*24472Sdonn  * Portability fix from Ralph Campbell.
21*24472Sdonn  *
22*24472Sdonn  * Revision 1.13  85/02/12  19:31:47  donn
23*24472Sdonn  * Use CATNAME to get the name of a concatenation command instead of
24*24472Sdonn  * explicitly running 'cat' -- you can get the wrong 'cat' the old way!
25*24472Sdonn  *
26*24472Sdonn  * Revision 1.12  85/01/14  06:42:30  donn
27*24472Sdonn  * Changed to call the peephole optimizer with the '-f' flag, so that
28*24472Sdonn  * floating point moves are translated to integer moves.
29*24472Sdonn  *
30*24472Sdonn  * Revision 1.11  85/01/14  04:38:59  donn
31*24472Sdonn  * Jerry's change to pass -O to f1 so it knows whether the peephole optimizer
32*24472Sdonn  * will be run.  This is necessary in order to handle movf/movl translation.
33*24472Sdonn  *
34*24472Sdonn  * Revision 1.10  85/01/14  03:59:12  donn
35*24472Sdonn  * Added Jerry Berkman's fix for the '-q' flag.
36*24472Sdonn  *
37*24472Sdonn  * Revision 1.9  84/11/09  01:51:26  donn
38*24472Sdonn  * Cosmetic change to stupid() suggested by John McCarthy at Memorial
39*24472Sdonn  * University, St. Johns.
40*24472Sdonn  *
41*24472Sdonn  * Revision 1.8  84/09/14  16:02:34  donn
42*24472Sdonn  * Added changes to notice when people do 'f77 -c foo.f -o bar.o' and tell
43*24472Sdonn  * them why it doesn't do what they think it does.
44*24472Sdonn  *
45*24472Sdonn  * Revision 1.7  84/08/24  21:08:31  donn
46*24472Sdonn  * Added call to setrlimit() to prevent core dumps when not debugging.
47*24472Sdonn  * Reorganized the include file arrangment somewhat.
48*24472Sdonn  *
49*24472Sdonn  * Revision 1.6  84/08/24  20:20:24  donn
50*24472Sdonn  * Changed stupidity check on Jerry Berkman's suggestion -- now it balks if
51*24472Sdonn  * the load file exists and has a sensitive suffix.
52*24472Sdonn  *
53*24472Sdonn  * Revision 1.5  84/08/15  18:56:44  donn
54*24472Sdonn  * Added test for -O combined with -g, suggested by Raleigh Romine.  To keep
55*24472Sdonn  * things simple, if both are specified then the second in the list is thrown
56*24472Sdonn  * out and the user is warned.
57*24472Sdonn  *
58*24472Sdonn  * Revision 1.4  84/08/05  21:33:15  donn
59*24472Sdonn  * Added stupidity check -- f77 won't load on a file that it's asked to
60*24472Sdonn  * compile as well.
61*24472Sdonn  *
62*24472Sdonn  * Revision 1.3  84/08/04  22:58:24  donn
63*24472Sdonn  * Improved error reporting -- we now explain why we died and what we did.
64*24472Sdonn  * Only works on 4.2.  Added at the instigation of Jerry Berkman.
65*24472Sdonn  *
66*24472Sdonn  * Revision 1.2  84/07/28  13:11:24  donn
67*24472Sdonn  * Added Ralph Campbell's changes to reduce offsets to data.
68*24472Sdonn  *
69*24472Sdonn  */
70*24472Sdonn 
71*24472Sdonn char *xxxvers[] = "\n@(#) F77 DRIVER, VERSION 4.2,   1984 JULY 28\n";
72*24472Sdonn #include <stdio.h>
73*24472Sdonn #include <sys/types.h>
74*24472Sdonn #include <sys/stat.h>
75*24472Sdonn #include <ctype.h>
76*24472Sdonn #include <signal.h>
77*24472Sdonn 
78*24472Sdonn #ifdef	SIGPROF
79*24472Sdonn /*
80*24472Sdonn  * Some 4.2 BSD capabilities.
81*24472Sdonn  */
82*24472Sdonn #include <sys/time.h>
83*24472Sdonn #include <sys/resource.h>
84*24472Sdonn #define	NOCORE		1
85*24472Sdonn #include <sys/wait.h>
86*24472Sdonn #define PSIGNAL		1
87*24472Sdonn #endif
88*24472Sdonn 
89*24472Sdonn #include "defines.h"
90*24472Sdonn #include "machdefs.h"
91*24472Sdonn #include "drivedefs.h"
92*24472Sdonn #include "version.h"
93*24472Sdonn 
94*24472Sdonn static FILEP diagfile	= {stderr} ;
95*24472Sdonn static int pid;
96*24472Sdonn static int sigivalue	= 0;
97*24472Sdonn static int sigqvalue	= 0;
98*24472Sdonn static int sighvalue	= 0;
99*24472Sdonn static int sigtvalue	= 0;
100*24472Sdonn 
101*24472Sdonn static char *pass1name	= PASS1NAME ;
102*24472Sdonn static char *pass2name	= PASS2NAME ;
103*24472Sdonn static char *pass2opt	= PASS2OPT ;
104*24472Sdonn static char *asmname	= ASMNAME ;
105*24472Sdonn static char *ldname	= LDNAME ;
106*24472Sdonn static char *footname	= FOOTNAME;
107*24472Sdonn static char *proffoot	= PROFFOOT;
108*24472Sdonn static char *macroname	= "m4";
109*24472Sdonn static char *shellname	= "/bin/sh";
110*24472Sdonn static char *cppname	= "/lib/cpp";
111*24472Sdonn static char *aoutname	= "a.out" ;
112*24472Sdonn static char *temppref	= TEMPPREF;
113*24472Sdonn 
114*24472Sdonn static char *infname;
115*24472Sdonn static char textfname[44];
116*24472Sdonn static char asmfname[44];
117*24472Sdonn static char asmpass2[44];
118*24472Sdonn static char initfname[44];
119*24472Sdonn static char sortfname[44];
120*24472Sdonn static char prepfname[44];
121*24472Sdonn static char objfdefault[44];
122*24472Sdonn static char optzfname[44];
123*24472Sdonn static char setfname[44];
124*24472Sdonn 
125*24472Sdonn static char fflags[50]	= "-";
126*24472Sdonn static char f2flags[50];
127*24472Sdonn static char cflags[50]	= "-c";
128*24472Sdonn #if TARGET == GCOS
129*24472Sdonn 	static char eflags[30]	= "system=gcos ";
130*24472Sdonn #else
131*24472Sdonn 	static char eflags[30]	= "system=unix ";
132*24472Sdonn #endif
133*24472Sdonn static char rflags[30]	= "";
134*24472Sdonn static char lflag[3]	= "-x";
135*24472Sdonn static char *fflagp	= fflags+1;
136*24472Sdonn static char *f2flagp	= f2flags;
137*24472Sdonn static char *cflagp	= cflags+2;
138*24472Sdonn static char *eflagp	= eflags+12;
139*24472Sdonn static char *rflagp	= rflags;
140*24472Sdonn static char *cppflags	= "";
141*24472Sdonn static char **cppargs;
142*24472Sdonn static char **loadargs;
143*24472Sdonn static char **loadp;
144*24472Sdonn 
145*24472Sdonn static flag erred	= NO;
146*24472Sdonn static flag loadflag	= YES;
147*24472Sdonn static flag saveasmflag	= NO;
148*24472Sdonn static flag profileflag	= NO;
149*24472Sdonn static flag optimflag	= NO;
150*24472Sdonn static flag debugflag	= NO;
151*24472Sdonn static flag verbose	= NO;
152*24472Sdonn static flag nofloating	= NO;
153*24472Sdonn static flag fortonly	= NO;
154*24472Sdonn static flag macroflag	= NO;
155*24472Sdonn static flag sdbflag	= NO;
156*24472Sdonn static flag namesflag	= YES;
157*24472Sdonn 
158*24472Sdonn static int ncpp;
159*24472Sdonn 
160*24472Sdonn 
161*24472Sdonn main(argc, argv)
162*24472Sdonn int argc;
163*24472Sdonn char **argv;
164*24472Sdonn {
165*24472Sdonn int i, c, status;
166*24472Sdonn char *setdoto(), *lastchar(), *lastfield(), *copys(), *argvtos();
167*24472Sdonn ptr ckalloc();
168*24472Sdonn register char *s;
169*24472Sdonn char fortfile[20], *t;
170*24472Sdonn char buff[100];
171*24472Sdonn int intrupt();
172*24472Sdonn int new_aoutname = NO;
173*24472Sdonn 
174*24472Sdonn sigivalue = signal(SIGINT, SIG_IGN) == SIG_IGN;
175*24472Sdonn sigqvalue = signal(SIGQUIT,SIG_IGN) == SIG_IGN;
176*24472Sdonn sighvalue = signal(SIGHUP, SIG_IGN) == SIG_IGN;
177*24472Sdonn sigtvalue = signal(SIGTERM,SIG_IGN) == SIG_IGN;
178*24472Sdonn enbint(intrupt);
179*24472Sdonn 
180*24472Sdonn pid = getpid();
181*24472Sdonn crfnames();
182*24472Sdonn 
183*24472Sdonn cppargs  = (char **) ckalloc( argc * sizeof(*cppargs) );
184*24472Sdonn loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
185*24472Sdonn loadargs[1] = "-X";
186*24472Sdonn loadargs[2] = "-u";
187*24472Sdonn #if HERE==PDP11 || HERE==VAX
188*24472Sdonn 	loadargs[3] = "_MAIN_";
189*24472Sdonn #endif
190*24472Sdonn #if HERE == INTERDATA
191*24472Sdonn 	loadargs[3] = "main";
192*24472Sdonn #endif
193*24472Sdonn loadp = loadargs + 4;
194*24472Sdonn 
195*24472Sdonn --argc;
196*24472Sdonn ++argv;
197*24472Sdonn 
198*24472Sdonn while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
199*24472Sdonn 	{
200*24472Sdonn 	for(s = argv[0]+1 ; *s ; ++s) switch(*s)
201*24472Sdonn 		{
202*24472Sdonn 		case 'T':  /* use special passes */
203*24472Sdonn 			switch(*++s)
204*24472Sdonn 				{
205*24472Sdonn 				case '1':
206*24472Sdonn 					pass1name = s+1; goto endfor;
207*24472Sdonn 				case '2':
208*24472Sdonn 					pass2name = s+1; goto endfor;
209*24472Sdonn 				case 'p':
210*24472Sdonn 					pass2opt = s+1; goto endfor;
211*24472Sdonn 				case 'a':
212*24472Sdonn 					asmname = s+1; goto endfor;
213*24472Sdonn 				case 'l':
214*24472Sdonn 					ldname = s+1; goto endfor;
215*24472Sdonn 				case 'F':
216*24472Sdonn 					footname = s+1; goto endfor;
217*24472Sdonn 				case 'm':
218*24472Sdonn 					macroname = s+1; goto endfor;
219*24472Sdonn 				case 't':
220*24472Sdonn 					temppref = s+1; goto endfor;
221*24472Sdonn 				default:
222*24472Sdonn 					fatali("bad option -T%c", *s);
223*24472Sdonn 				}
224*24472Sdonn 			break;
225*24472Sdonn 
226*24472Sdonn 		case '6':
227*24472Sdonn 			if(s[1]=='6')
228*24472Sdonn 				{
229*24472Sdonn 				*fflagp++ = *s++;
230*24472Sdonn 				goto copyfflag;
231*24472Sdonn 				}
232*24472Sdonn 			else	{
233*24472Sdonn 				fprintf(diagfile, "invalid flag 6%c\n", s[1]);
234*24472Sdonn 				done(1);
235*24472Sdonn 				}
236*24472Sdonn 
237*24472Sdonn 		case 'w':
238*24472Sdonn 			if(s[1]=='6' && s[2]=='6')
239*24472Sdonn 				{
240*24472Sdonn 				*fflagp++ = *s++;
241*24472Sdonn 				*fflagp++ = *s++;
242*24472Sdonn 				}
243*24472Sdonn 
244*24472Sdonn 		copyfflag:
245*24472Sdonn 		case 'u':
246*24472Sdonn 		case 'U':
247*24472Sdonn 		case '1':
248*24472Sdonn 		case 'C':
249*24472Sdonn 			*fflagp++ = *s;
250*24472Sdonn 			break;
251*24472Sdonn 
252*24472Sdonn 		case 'O':
253*24472Sdonn 			if(sdbflag)
254*24472Sdonn 				{
255*24472Sdonn 				fprintf(diagfile, "-O and -g are incompatible; -O ignored\n");
256*24472Sdonn 				break;
257*24472Sdonn 				}
258*24472Sdonn 			optimflag = YES;
259*24472Sdonn 			*f2flagp++ = '-';
260*24472Sdonn 			*f2flagp++ = 'O';
261*24472Sdonn 			*f2flagp++ = ' ';
262*24472Sdonn #if TARGET == INTERDATA
263*24472Sdonn 				*loadp++ = "-r";
264*24472Sdonn 				*loadp++ = "-d";
265*24472Sdonn #endif
266*24472Sdonn 			*fflagp++ = 'O';
267*24472Sdonn 			break;
268*24472Sdonn 
269*24472Sdonn 		case 'N':
270*24472Sdonn 			*fflagp++ = 'N';
271*24472Sdonn 			if( oneof(*++s, "qxscn") )
272*24472Sdonn 				*fflagp++ = *s++;
273*24472Sdonn 			else	{
274*24472Sdonn 				fprintf(diagfile, "invalid flag -N%c\n", *s);
275*24472Sdonn 				done(1);
276*24472Sdonn 				}
277*24472Sdonn 			while( isdigit(*s) )
278*24472Sdonn 				*fflagp++ = *s++;
279*24472Sdonn 			*fflagp++ = 'X';
280*24472Sdonn 			goto endfor;
281*24472Sdonn 
282*24472Sdonn 		case 'm':
283*24472Sdonn 			if(s[1] == '4')
284*24472Sdonn 				++s;
285*24472Sdonn 			macroflag = YES;
286*24472Sdonn 			break;
287*24472Sdonn 
288*24472Sdonn 		case 'S':
289*24472Sdonn 			strcat(cflags, " -S");
290*24472Sdonn 			saveasmflag = YES;
291*24472Sdonn 
292*24472Sdonn 		case 'c':
293*24472Sdonn 			if( new_aoutname == YES ){
294*24472Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
295*24472Sdonn 				new_aoutname = NO;
296*24472Sdonn 				}
297*24472Sdonn 			loadflag = NO;
298*24472Sdonn 			break;
299*24472Sdonn 
300*24472Sdonn 		case 'v':
301*24472Sdonn 			verbose = YES;
302*24472Sdonn 			fprintf(diagfile,"\nBerkeley F77, version %s\n",
303*24472Sdonn 				VERSIONNUMBER);
304*24472Sdonn 			break;
305*24472Sdonn 
306*24472Sdonn 		case 'd':
307*24472Sdonn 			debugflag = YES;
308*24472Sdonn 			*fflagp++ = 'd';
309*24472Sdonn 			s++;
310*24472Sdonn 			while( isdigit(*s) || *s == ',' )
311*24472Sdonn 				*fflagp++ = *s++;
312*24472Sdonn 			*fflagp++ = 'X';
313*24472Sdonn 			goto endfor;
314*24472Sdonn 
315*24472Sdonn 		case 'M':
316*24472Sdonn 			*loadp++ = "-M";
317*24472Sdonn 			break;
318*24472Sdonn 
319*24472Sdonn 		case 'g':
320*24472Sdonn 			if(optimflag)
321*24472Sdonn 				{
322*24472Sdonn 				fprintf(diagfile, "-g and -O are incompatible; -g ignored\n");
323*24472Sdonn 				break;
324*24472Sdonn 				}
325*24472Sdonn 			strcat(cflags," -g");
326*24472Sdonn 			sdbflag = YES;
327*24472Sdonn 			goto copyfflag;
328*24472Sdonn 
329*24472Sdonn 		case 'p':
330*24472Sdonn 			profileflag = YES;
331*24472Sdonn 			strcat(cflags," -p");
332*24472Sdonn 			*fflagp++ = 'p';
333*24472Sdonn 			if(s[1] == 'g')
334*24472Sdonn 				{
335*24472Sdonn 				proffoot = GPRFFOOT;
336*24472Sdonn 				s++;
337*24472Sdonn 				}
338*24472Sdonn 			break;
339*24472Sdonn 
340*24472Sdonn 		case 'q':
341*24472Sdonn 			namesflag = NO;
342*24472Sdonn 			*fflagp++ = *s;
343*24472Sdonn 			break;
344*24472Sdonn 
345*24472Sdonn 		case 'o':
346*24472Sdonn 			if( ! strcmp(s, "onetrip") )
347*24472Sdonn 				{
348*24472Sdonn 				*fflagp++ = '1';
349*24472Sdonn 				goto endfor;
350*24472Sdonn 				}
351*24472Sdonn 			new_aoutname = YES;
352*24472Sdonn 			aoutname = *++argv;
353*24472Sdonn 			--argc;
354*24472Sdonn 			if( loadflag == NO ){
355*24472Sdonn 				fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
356*24472Sdonn 				new_aoutname = NO;
357*24472Sdonn 				}
358*24472Sdonn 			break;
359*24472Sdonn 
360*24472Sdonn #if TARGET == PDP11
361*24472Sdonn 		case 'f':
362*24472Sdonn 			nofloating = YES;
363*24472Sdonn 			pass2name = NOFLPASS2;
364*24472Sdonn 		break;
365*24472Sdonn #endif
366*24472Sdonn 
367*24472Sdonn 		case 'F':
368*24472Sdonn 			fortonly = YES;
369*24472Sdonn 			loadflag = NO;
370*24472Sdonn 			break;
371*24472Sdonn 		case 'D':
372*24472Sdonn 		case 'I':
373*24472Sdonn 			cppargs[ncpp++] = *argv;
374*24472Sdonn 			goto endfor;
375*24472Sdonn 
376*24472Sdonn 		case 'i':
377*24472Sdonn 			if((s[1]=='2' || s[1]=='4') && s[2] == '\0')
378*24472Sdonn 				{
379*24472Sdonn 				*fflagp++ = *s++;
380*24472Sdonn 				goto copyfflag;
381*24472Sdonn 				}
382*24472Sdonn 			fprintf(diagfile, "invalid flag -i%c\n", s[1]);
383*24472Sdonn 			done(1);
384*24472Sdonn 
385*24472Sdonn 		case 'l':	/* letter ell--library */
386*24472Sdonn 			s[-1] = '-';
387*24472Sdonn 			*loadp++ = s-1;
388*24472Sdonn 			goto endfor;
389*24472Sdonn 
390*24472Sdonn 		case 'E':	/* EFL flag argument */
391*24472Sdonn 			while( *eflagp++ = *++s)
392*24472Sdonn 				;
393*24472Sdonn 			*eflagp++ = ' ';
394*24472Sdonn 			goto endfor;
395*24472Sdonn 		case 'R':
396*24472Sdonn 			while( *rflagp++ = *++s )
397*24472Sdonn 				;
398*24472Sdonn 			*rflagp++ = ' ';
399*24472Sdonn 			goto endfor;
400*24472Sdonn 		default:
401*24472Sdonn 			lflag[1] = *s;
402*24472Sdonn 			*loadp++ = copys(lflag);
403*24472Sdonn 			break;
404*24472Sdonn 		}
405*24472Sdonn endfor:
406*24472Sdonn 	--argc;
407*24472Sdonn 	++argv;
408*24472Sdonn 	}
409*24472Sdonn 
410*24472Sdonn #ifdef	NOCORE
411*24472Sdonn if(!debugflag)
412*24472Sdonn 	{
413*24472Sdonn 	struct rlimit r;
414*24472Sdonn 
415*24472Sdonn 	r.rlim_cur = r.rlim_max = 0;
416*24472Sdonn 	setrlimit(RLIMIT_CORE, &r);
417*24472Sdonn 	}
418*24472Sdonn #endif	NOCORE
419*24472Sdonn 
420*24472Sdonn *fflagp = '\0';
421*24472Sdonn 
422*24472Sdonn if (ncpp > 0)
423*24472Sdonn 	cppflags = argvtos (ncpp,cppargs);
424*24472Sdonn 
425*24472Sdonn loadargs[0] = ldname;
426*24472Sdonn #if TARGET == PDP11
427*24472Sdonn 	if(nofloating)
428*24472Sdonn 		*loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
429*24472Sdonn 	else
430*24472Sdonn #endif
431*24472Sdonn *loadp++ = (profileflag ? proffoot : footname);
432*24472Sdonn 
433*24472Sdonn for(i = 0 ; i<argc ; ++i)
434*24472Sdonn 	switch(c =  dotchar(infname = argv[i]) )
435*24472Sdonn 		{
436*24472Sdonn 		case 'r':	/* Ratfor file */
437*24472Sdonn 		case 'e':	/* EFL file */
438*24472Sdonn 			if( unreadable(argv[i]) )
439*24472Sdonn 				{
440*24472Sdonn 				erred = YES;
441*24472Sdonn 				break;
442*24472Sdonn 				}
443*24472Sdonn 			s = fortfile;
444*24472Sdonn 			t = lastfield(argv[i]);
445*24472Sdonn 			while( *s++ = *t++)
446*24472Sdonn 				;
447*24472Sdonn 			s[-2] = 'f';
448*24472Sdonn 
449*24472Sdonn 			if(macroflag)
450*24472Sdonn 				{
451*24472Sdonn 				sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
452*24472Sdonn 				if( sys(buff) )
453*24472Sdonn 					{
454*24472Sdonn 					rmf(prepfname);
455*24472Sdonn 					erred = YES;
456*24472Sdonn 					break;
457*24472Sdonn 					}
458*24472Sdonn 				infname = prepfname;
459*24472Sdonn 				}
460*24472Sdonn 
461*24472Sdonn 			if(c == 'e')
462*24472Sdonn 				sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
463*24472Sdonn 			else
464*24472Sdonn 				sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
465*24472Sdonn 			status = sys(buff);
466*24472Sdonn 			if(macroflag)
467*24472Sdonn 				rmf(infname);
468*24472Sdonn 			if(status)
469*24472Sdonn 				{
470*24472Sdonn 				erred = YES;
471*24472Sdonn 				rmf(fortfile);
472*24472Sdonn 				break;
473*24472Sdonn 				}
474*24472Sdonn 
475*24472Sdonn 			if( ! fortonly )
476*24472Sdonn 				{
477*24472Sdonn 				infname = argv[i] = lastfield(argv[i]);
478*24472Sdonn 				*lastchar(infname) = 'f';
479*24472Sdonn 
480*24472Sdonn 				if( dofort(argv[i]) )
481*24472Sdonn 					erred = YES;
482*24472Sdonn 				else	{
483*24472Sdonn 					if( nodup(t = setdoto(argv[i])) )
484*24472Sdonn 						*loadp++ = t;
485*24472Sdonn 					rmf(fortfile);
486*24472Sdonn 					}
487*24472Sdonn 				}
488*24472Sdonn 			break;
489*24472Sdonn 
490*24472Sdonn 		case 'F':	/* C preprocessor -> Fortran file */
491*24472Sdonn 			if( unreadable(argv[i]) )
492*24472Sdonn 				{
493*24472Sdonn 				erred = YES;
494*24472Sdonn 				break;
495*24472Sdonn 				}
496*24472Sdonn 			s = fortfile;
497*24472Sdonn 			t = lastfield(argv[i]);
498*24472Sdonn 			while( *s++ = *t++)
499*24472Sdonn 				;
500*24472Sdonn 			s[-2] = 'f';
501*24472Sdonn 			sprintf(buff,"%s %s %s >%s", cppname, cppflags, infname, fortfile);
502*24472Sdonn 			status = sys(buff);
503*24472Sdonn 			if(status)
504*24472Sdonn 				{
505*24472Sdonn 				erred = YES;
506*24472Sdonn 				rmf(fortfile);
507*24472Sdonn 				break;
508*24472Sdonn 				}
509*24472Sdonn 
510*24472Sdonn 			if( ! fortonly )
511*24472Sdonn 				{
512*24472Sdonn 				infname = argv[i] = lastfield(argv[i]);
513*24472Sdonn 				*lastchar(infname) = 'f';
514*24472Sdonn 
515*24472Sdonn 				if ( dofort(argv[i]) )
516*24472Sdonn 					erred = YES;
517*24472Sdonn 				else	{
518*24472Sdonn 					if (nodup(t = setdoto(argv[i])) )
519*24472Sdonn 						*loadp++ = t;
520*24472Sdonn 						rmf(fortfile);
521*24472Sdonn 						}
522*24472Sdonn 				}
523*24472Sdonn 			break;
524*24472Sdonn 
525*24472Sdonn 		case 'f':	/* Fortran file */
526*24472Sdonn 			if( unreadable(argv[i]) )
527*24472Sdonn 				erred = YES;
528*24472Sdonn 			else if( dofort(argv[i]) )
529*24472Sdonn 				erred = YES;
530*24472Sdonn 			else if( nodup(t=setdoto(argv[i])) )
531*24472Sdonn 				*loadp++ = t;
532*24472Sdonn 			break;
533*24472Sdonn 
534*24472Sdonn 		case 'c':	/* C file */
535*24472Sdonn 		case 's':	/* Assembler file */
536*24472Sdonn 			if( unreadable(argv[i]) )
537*24472Sdonn 				{
538*24472Sdonn 				erred = YES;
539*24472Sdonn 				break;
540*24472Sdonn 				}
541*24472Sdonn #if HERE==PDP11 || HERE==VAX
542*24472Sdonn 			if( namesflag == YES )
543*24472Sdonn 				fprintf(diagfile, "%s:\n", argv[i]);
544*24472Sdonn #endif
545*24472Sdonn 			sprintf(buff, "cc %s %s", cflags, argv[i] );
546*24472Sdonn 			if( sys(buff) )
547*24472Sdonn 				erred = YES;
548*24472Sdonn 			else
549*24472Sdonn 				if( nodup(t = setdoto(argv[i])) )
550*24472Sdonn 					*loadp++ = t;
551*24472Sdonn 			break;
552*24472Sdonn 
553*24472Sdonn 		case 'o':
554*24472Sdonn 			if( nodup(argv[i]) )
555*24472Sdonn 				*loadp++ = argv[i];
556*24472Sdonn 			break;
557*24472Sdonn 
558*24472Sdonn 		default:
559*24472Sdonn 			if( ! strcmp(argv[i], "-o") ) {
560*24472Sdonn 				aoutname = argv[++i];
561*24472Sdonn 				new_aoutname = YES;
562*24472Sdonn 				if( loadflag == NO ){
563*24472Sdonn 					fprintf(diagfile, "-c prevents loading, -o %s ignored\n", aoutname);
564*24472Sdonn 					new_aoutname = NO;
565*24472Sdonn 					}
566*24472Sdonn 			} else
567*24472Sdonn 				*loadp++ = argv[i];
568*24472Sdonn 			break;
569*24472Sdonn 		}
570*24472Sdonn 
571*24472Sdonn if( loadflag && stupid(aoutname) )
572*24472Sdonn 	erred = YES;
573*24472Sdonn if(loadflag && !erred)
574*24472Sdonn 	doload(loadargs, loadp);
575*24472Sdonn done(erred);
576*24472Sdonn }
577*24472Sdonn 
578*24472Sdonn 
579*24472Sdonn 
580*24472Sdonn /*
581*24472Sdonn  * argvtos() copies a list of arguments contained in an array of character
582*24472Sdonn  * strings to a single dynamically allocated string. Each argument is
583*24472Sdonn  * separated by one blank space. Returns a pointer to the string or null
584*24472Sdonn  * if out of memory.
585*24472Sdonn  */
586*24472Sdonn #define SBUFINCR	1024
587*24472Sdonn #define SBUFMAX		10240
588*24472Sdonn 
589*24472Sdonn char *
590*24472Sdonn argvtos(argc, argv)
591*24472Sdonn 	char **argv;
592*24472Sdonn 	int  argc;
593*24472Sdonn {
594*24472Sdonn 	register char *s;		/* string pointer */
595*24472Sdonn 	register int  i;		/* string buffer pointer */
596*24472Sdonn 	char *malloc();			/* memory allocator */
597*24472Sdonn 	char *realloc();		/* increase size of storage */
598*24472Sdonn 	char *sbuf;			/* string buffer */
599*24472Sdonn 	int nbytes;			/* bytes of memory required */
600*24472Sdonn 	int nu;				/* no. of SBUFINCR units required */
601*24472Sdonn 	int sbufsize;			/* current size of sbuf */
602*24472Sdonn 	int strlen();			/* string length */
603*24472Sdonn 
604*24472Sdonn 	sbufsize = SBUFINCR;
605*24472Sdonn 	if ((sbuf = malloc((unsigned)sbufsize)) == NULL)
606*24472Sdonn 		{
607*24472Sdonn 		fatal("out of memory (argvtos)");
608*24472Sdonn 		/* NOTREACHED */
609*24472Sdonn 		}
610*24472Sdonn 
611*24472Sdonn 	for (i = 0; argc-- > 0; ++argv)
612*24472Sdonn 		{
613*24472Sdonn 		if ((nbytes = (i+strlen(*argv)+1-sbufsize)) > 0)
614*24472Sdonn 			{
615*24472Sdonn 			nu = (nbytes+SBUFINCR-1)/SBUFINCR;
616*24472Sdonn 			sbufsize += nu * SBUFINCR;
617*24472Sdonn 			if (sbufsize > SBUFMAX)
618*24472Sdonn 				{
619*24472Sdonn 				fatal("argument length exceeded (argvtos)");
620*24472Sdonn 				/* NOTREACHED */
621*24472Sdonn 				}
622*24472Sdonn 			if ((sbuf = realloc(sbuf, (unsigned)sbufsize)) == NULL)
623*24472Sdonn 				{
624*24472Sdonn 				fatal("out of memory (argvtos)");
625*24472Sdonn 				/* NOTREACHED */
626*24472Sdonn 				}
627*24472Sdonn 			}
628*24472Sdonn 		for (s = *argv; *s != '\0'; i++, s++)
629*24472Sdonn 			sbuf[i] = *s;
630*24472Sdonn 		sbuf[i++] = ' ';
631*24472Sdonn 		}
632*24472Sdonn 	sbuf[--i] = '\0';
633*24472Sdonn 	return(sbuf);
634*24472Sdonn }
635*24472Sdonn 
636*24472Sdonn dofort(s)
637*24472Sdonn char *s;
638*24472Sdonn {
639*24472Sdonn int retcode;
640*24472Sdonn char buff[200];
641*24472Sdonn 
642*24472Sdonn infname = s;
643*24472Sdonn sprintf(buff, "%s %s %s %s %s %s",
644*24472Sdonn 	pass1name, fflags, s, asmfname, initfname, textfname);
645*24472Sdonn switch( sys(buff) )
646*24472Sdonn 	{
647*24472Sdonn 	case 1:
648*24472Sdonn 		goto error;
649*24472Sdonn 	case 0:
650*24472Sdonn 		break;
651*24472Sdonn 	default:
652*24472Sdonn 		goto comperror;
653*24472Sdonn 	}
654*24472Sdonn 
655*24472Sdonn if( dopass2() )
656*24472Sdonn 	goto comperror;
657*24472Sdonn doasm(s);
658*24472Sdonn retcode = 0;
659*24472Sdonn 
660*24472Sdonn ret:
661*24472Sdonn 	rmf(asmfname);
662*24472Sdonn 	rmf(initfname);
663*24472Sdonn 	rmf(textfname);
664*24472Sdonn 	return(retcode);
665*24472Sdonn 
666*24472Sdonn error:
667*24472Sdonn 	fprintf(diagfile, "\nError.  No assembly.\n");
668*24472Sdonn 	retcode = 1;
669*24472Sdonn 	goto ret;
670*24472Sdonn 
671*24472Sdonn comperror:
672*24472Sdonn 	fprintf(diagfile, "\ncompiler error.\n");
673*24472Sdonn 	retcode = 2;
674*24472Sdonn 	goto ret;
675*24472Sdonn }
676*24472Sdonn 
677*24472Sdonn 
678*24472Sdonn 
679*24472Sdonn 
680*24472Sdonn dopass2()
681*24472Sdonn {
682*24472Sdonn char buff[100];
683*24472Sdonn 
684*24472Sdonn if(verbose)
685*24472Sdonn 	fprintf(diagfile, "PASS2.");
686*24472Sdonn 
687*24472Sdonn #if FAMILY==DMR
688*24472Sdonn 	sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
689*24472Sdonn 	return( sys(buff) );
690*24472Sdonn #endif
691*24472Sdonn 
692*24472Sdonn 
693*24472Sdonn #if FAMILY == PCC
694*24472Sdonn #	if TARGET==INTERDATA
695*24472Sdonn 	sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
696*24472Sdonn #	else
697*24472Sdonn 	sprintf(buff, "%s %s %s >%s",
698*24472Sdonn 		pass2name, f2flags, textfname, asmpass2);
699*24472Sdonn #	endif
700*24472Sdonn 	return( sys(buff) );
701*24472Sdonn #endif
702*24472Sdonn }
703*24472Sdonn 
704*24472Sdonn 
705*24472Sdonn 
706*24472Sdonn 
707*24472Sdonn doasm(s)
708*24472Sdonn char *s;
709*24472Sdonn {
710*24472Sdonn register char *lastc;
711*24472Sdonn char *obj;
712*24472Sdonn char buff[200];
713*24472Sdonn char *lastchar(), *setdoto();
714*24472Sdonn 
715*24472Sdonn if(*s == '\0')
716*24472Sdonn 	s = objfdefault;
717*24472Sdonn lastc = lastchar(s);
718*24472Sdonn obj = setdoto(s);
719*24472Sdonn 
720*24472Sdonn #if TARGET==PDP11 || TARGET==VAX
721*24472Sdonn #	ifdef PASS2OPT
722*24472Sdonn 	if(optimflag)
723*24472Sdonn 		{
724*24472Sdonn 		sprintf(buff, "%s -f %s %s", pass2opt, asmpass2, optzfname);
725*24472Sdonn 		if( sys(buff) )
726*24472Sdonn 			rmf(optzfname);
727*24472Sdonn 		else
728*24472Sdonn 			{
729*24472Sdonn 			sprintf(buff,"mv %s %s", optzfname, asmpass2);
730*24472Sdonn 			sys(buff);
731*24472Sdonn 			}
732*24472Sdonn 		}
733*24472Sdonn #	endif
734*24472Sdonn #endif
735*24472Sdonn 
736*24472Sdonn if(saveasmflag)
737*24472Sdonn 	{
738*24472Sdonn 	*lastc = 's';
739*24472Sdonn #if TARGET == INTERDATA
740*24472Sdonn 	sprintf(buff, "%s %s %s %s %s >%s", CATNAME, asmfname, initfname,
741*24472Sdonn 		setfname, asmpass2, obj);
742*24472Sdonn #else
743*24472Sdonn #if TARGET == VAX
744*24472Sdonn 	if (sdbflag)
745*24472Sdonn 		sprintf(buff, "%s %s %s %s >%s",
746*24472Sdonn 			CATNAME, asmfname, asmpass2, initfname, obj);
747*24472Sdonn 	else
748*24472Sdonn 		sprintf(buff, "%s %s %s %s >%s",
749*24472Sdonn 			CATNAME, asmfname, initfname, asmpass2, obj);
750*24472Sdonn #else
751*24472Sdonn 	sprintf(buff, "%s %s %s %s >%s",
752*24472Sdonn 		CATNAME, asmfname, initfname, asmpass2, obj);
753*24472Sdonn #endif
754*24472Sdonn #endif
755*24472Sdonn 	sys(buff);
756*24472Sdonn 	*lastc = 'o';
757*24472Sdonn 	}
758*24472Sdonn else
759*24472Sdonn 	{
760*24472Sdonn 	if(verbose)
761*24472Sdonn 		fprintf(diagfile, "  ASM.");
762*24472Sdonn #if TARGET == INTERDATA
763*24472Sdonn 	sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname,
764*24472Sdonn 		initfname, setfname, asmpass2);
765*24472Sdonn #endif
766*24472Sdonn 
767*24472Sdonn #if TARGET == VAX
768*24472Sdonn 	/* vax assembler currently accepts only one input file */
769*24472Sdonn 	if (sdbflag)
770*24472Sdonn 		sprintf(buff, "%s %s %s >>%s",
771*24472Sdonn 			CATNAME, asmpass2, initfname, asmfname);
772*24472Sdonn 	else
773*24472Sdonn 		sprintf(buff, "%s %s %s >>%s",
774*24472Sdonn 			CATNAME, initfname, asmpass2, asmfname);
775*24472Sdonn 	sys(buff);
776*24472Sdonn #ifdef UCBVAXASM
777*24472Sdonn 	sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);
778*24472Sdonn #else
779*24472Sdonn 	sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
780*24472Sdonn #endif
781*24472Sdonn #endif
782*24472Sdonn 
783*24472Sdonn #if TARGET == PDP11
784*24472Sdonn 	sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
785*24472Sdonn #endif
786*24472Sdonn 
787*24472Sdonn #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
788*24472Sdonn 	sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
789*24472Sdonn #endif
790*24472Sdonn 
791*24472Sdonn 	if( sys(buff) )
792*24472Sdonn 		fatal("assembler error");
793*24472Sdonn 	if(verbose)
794*24472Sdonn 		fprintf(diagfile, "\n");
795*24472Sdonn #if HERE==PDP11 && TARGET!=PDP11
796*24472Sdonn 	rmf(obj);
797*24472Sdonn #endif
798*24472Sdonn 	}
799*24472Sdonn 
800*24472Sdonn rmf(asmpass2);
801*24472Sdonn }
802*24472Sdonn 
803*24472Sdonn 
804*24472Sdonn 
805*24472Sdonn doload(v0, v)
806*24472Sdonn register char *v0[], *v[];
807*24472Sdonn {
808*24472Sdonn char **p;
809*24472Sdonn int waitpid;
810*24472Sdonn 
811*24472Sdonn if(sdbflag)
812*24472Sdonn 	*v++ = "-lg";
813*24472Sdonn if (profileflag)
814*24472Sdonn 	{
815*24472Sdonn 	for(p = p_liblist ; *p ; *v++ = *p++)
816*24472Sdonn 		;
817*24472Sdonn 	}
818*24472Sdonn else	{
819*24472Sdonn 	for(p = liblist ; *p ; *v++ = *p++)
820*24472Sdonn 		;
821*24472Sdonn 	}
822*24472Sdonn 
823*24472Sdonn *v++ = "-o";
824*24472Sdonn *v++ = aoutname;
825*24472Sdonn *v = NULL;
826*24472Sdonn 
827*24472Sdonn if(verbose)
828*24472Sdonn 	fprintf(diagfile, "LOAD.");
829*24472Sdonn if(debugflag)
830*24472Sdonn 	{
831*24472Sdonn 	for(p = v0 ; p<v ; ++p)
832*24472Sdonn 		fprintf(diagfile, "%s ", *p);
833*24472Sdonn 	fprintf(diagfile, "\n");
834*24472Sdonn 	}
835*24472Sdonn 
836*24472Sdonn #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
837*24472Sdonn 	if( (waitpid = fork()) == 0)
838*24472Sdonn 		{
839*24472Sdonn 		enbint(SIG_DFL);
840*24472Sdonn 		execv(ldname, v0);
841*24472Sdonn 		fatalstr("couldn't load %s", ldname);
842*24472Sdonn 		}
843*24472Sdonn 	await(waitpid);
844*24472Sdonn #endif
845*24472Sdonn 
846*24472Sdonn #if HERE==INTERDATA
847*24472Sdonn 	if(optimflag)
848*24472Sdonn 		{
849*24472Sdonn 		char buff1[100], buff2[100];
850*24472Sdonn 		sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
851*24472Sdonn 		sprintf(buff2, "mv junk.%d %s", pid, aoutname);
852*24472Sdonn 		if( sys(buff1) || sys(buff2) )
853*24472Sdonn 			err("bad optimization");
854*24472Sdonn 		}
855*24472Sdonn #endif
856*24472Sdonn 
857*24472Sdonn if(verbose)
858*24472Sdonn 	fprintf(diagfile, "\n");
859*24472Sdonn }
860*24472Sdonn 
861*24472Sdonn /* Process control and Shell-simulating routines */
862*24472Sdonn 
863*24472Sdonn sys(str)
864*24472Sdonn char *str;
865*24472Sdonn {
866*24472Sdonn register char *s, *t;
867*24472Sdonn char *argv[100], path[100];
868*24472Sdonn char *inname, *outname;
869*24472Sdonn int append;
870*24472Sdonn int waitpid;
871*24472Sdonn int argc;
872*24472Sdonn 
873*24472Sdonn 
874*24472Sdonn if(debugflag)
875*24472Sdonn 	fprintf(diagfile, "%s\n", str);
876*24472Sdonn inname  = NULL;
877*24472Sdonn outname = NULL;
878*24472Sdonn argv[0] = shellname;
879*24472Sdonn argc = 1;
880*24472Sdonn 
881*24472Sdonn t = str;
882*24472Sdonn while( isspace(*t) )
883*24472Sdonn 	++t;
884*24472Sdonn while(*t)
885*24472Sdonn 	{
886*24472Sdonn 	if(*t == '<')
887*24472Sdonn 		inname = t+1;
888*24472Sdonn 	else if(*t == '>')
889*24472Sdonn 		{
890*24472Sdonn 		if(t[1] == '>')
891*24472Sdonn 			{
892*24472Sdonn 			append = YES;
893*24472Sdonn 			outname = t+2;
894*24472Sdonn 			}
895*24472Sdonn 		else	{
896*24472Sdonn 			append = NO;
897*24472Sdonn 			outname = t+1;
898*24472Sdonn 			}
899*24472Sdonn 		}
900*24472Sdonn 	else
901*24472Sdonn 		argv[argc++] = t;
902*24472Sdonn 	while( !isspace(*t) && *t!='\0' )
903*24472Sdonn 		++t;
904*24472Sdonn 	if(*t)
905*24472Sdonn 		{
906*24472Sdonn 		*t++ = '\0';
907*24472Sdonn 		while( isspace(*t) )
908*24472Sdonn 			++t;
909*24472Sdonn 		}
910*24472Sdonn 	}
911*24472Sdonn 
912*24472Sdonn if(argc == 1)   /* no command */
913*24472Sdonn 	return(-1);
914*24472Sdonn argv[argc] = 0;
915*24472Sdonn 
916*24472Sdonn s = path;
917*24472Sdonn t = "/usr/bin/";
918*24472Sdonn while(*t)
919*24472Sdonn 	*s++ = *t++;
920*24472Sdonn for(t = argv[1] ; *s++ = *t++ ; )
921*24472Sdonn 	;
922*24472Sdonn if((waitpid = fork()) == 0)
923*24472Sdonn 	{
924*24472Sdonn 	if(inname)
925*24472Sdonn 		freopen(inname, "r", stdin);
926*24472Sdonn 	if(outname)
927*24472Sdonn 		freopen(outname, (append ? "a" : "w"), stdout);
928*24472Sdonn 	enbint(SIG_DFL);
929*24472Sdonn 
930*24472Sdonn 	texec(path+9, argv);  /* command */
931*24472Sdonn 	texec(path+4, argv);  /*  /bin/command */
932*24472Sdonn 	texec(path  , argv);  /* /usr/bin/command */
933*24472Sdonn 
934*24472Sdonn 	fatalstr("Cannot load %s",path+9);
935*24472Sdonn 	}
936*24472Sdonn 
937*24472Sdonn return( await(waitpid) );
938*24472Sdonn }
939*24472Sdonn 
940*24472Sdonn 
941*24472Sdonn 
942*24472Sdonn 
943*24472Sdonn 
944*24472Sdonn #include "errno.h"
945*24472Sdonn 
946*24472Sdonn /* modified version from the Shell */
947*24472Sdonn texec(f, av)
948*24472Sdonn char *f;
949*24472Sdonn char **av;
950*24472Sdonn {
951*24472Sdonn extern int errno;
952*24472Sdonn 
953*24472Sdonn execv(f, av+1);
954*24472Sdonn 
955*24472Sdonn if (errno==ENOEXEC)
956*24472Sdonn 	{
957*24472Sdonn 	av[1] = f;
958*24472Sdonn 	execv(shellname, av);
959*24472Sdonn 	fatal("No shell!");
960*24472Sdonn 	}
961*24472Sdonn if (errno==ENOMEM)
962*24472Sdonn 	fatalstr("%s: too large", f);
963*24472Sdonn }
964*24472Sdonn 
965*24472Sdonn 
966*24472Sdonn 
967*24472Sdonn 
968*24472Sdonn 
969*24472Sdonn 
970*24472Sdonn done(k)
971*24472Sdonn int k;
972*24472Sdonn {
973*24472Sdonn static int recurs	= NO;
974*24472Sdonn 
975*24472Sdonn if(recurs == NO)
976*24472Sdonn 	{
977*24472Sdonn 	recurs = YES;
978*24472Sdonn 	rmfiles();
979*24472Sdonn 	}
980*24472Sdonn exit(k);
981*24472Sdonn }
982*24472Sdonn 
983*24472Sdonn 
984*24472Sdonn 
985*24472Sdonn 
986*24472Sdonn 
987*24472Sdonn 
988*24472Sdonn enbint(k)
989*24472Sdonn int (*k)();
990*24472Sdonn {
991*24472Sdonn if(sigivalue == 0)
992*24472Sdonn 	signal(SIGINT,k);
993*24472Sdonn if(sigqvalue == 0)
994*24472Sdonn 	signal(SIGQUIT,k);
995*24472Sdonn if(sighvalue == 0)
996*24472Sdonn 	signal(SIGHUP,k);
997*24472Sdonn if(sigtvalue == 0)
998*24472Sdonn 	signal(SIGTERM,k);
999*24472Sdonn }
1000*24472Sdonn 
1001*24472Sdonn 
1002*24472Sdonn 
1003*24472Sdonn 
1004*24472Sdonn intrupt()
1005*24472Sdonn {
1006*24472Sdonn done(2);
1007*24472Sdonn }
1008*24472Sdonn 
1009*24472Sdonn 
1010*24472Sdonn #ifdef PSIGNAL
1011*24472Sdonn /*
1012*24472Sdonn  * Fancy 4.2 BSD signal printing stuff.
1013*24472Sdonn  */
1014*24472Sdonn char harmless[NSIG] = { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };
1015*24472Sdonn #endif
1016*24472Sdonn 
1017*24472Sdonn 
1018*24472Sdonn await(waitpid)
1019*24472Sdonn int waitpid;
1020*24472Sdonn {
1021*24472Sdonn 
1022*24472Sdonn #ifdef PSIGNAL
1023*24472Sdonn extern char *sys_siglist[];
1024*24472Sdonn union wait status;
1025*24472Sdonn #else PSIGNAL
1026*24472Sdonn int status;
1027*24472Sdonn #endif PSIGNAL
1028*24472Sdonn 
1029*24472Sdonn int w;
1030*24472Sdonn 
1031*24472Sdonn enbint(SIG_IGN);
1032*24472Sdonn while ( (w = wait(&status)) != waitpid)
1033*24472Sdonn 	if(w == -1)
1034*24472Sdonn 		fatal("bad wait code");
1035*24472Sdonn enbint(intrupt);
1036*24472Sdonn 
1037*24472Sdonn #ifdef PSIGNAL
1038*24472Sdonn if(status.w_termsig)
1039*24472Sdonn 	{
1040*24472Sdonn 	debugflag = 0;	/* Prevent us from dumping core ourselves */
1041*24472Sdonn 	if(status.w_termsig != SIGINT && status.w_termsig < NSIG)
1042*24472Sdonn 		fprintf(diagfile, "%s%s\n", sys_siglist[status.w_termsig],
1043*24472Sdonn 			status.w_coredump ? " -- core dumped" : "");
1044*24472Sdonn 	if(status.w_termsig < NSIG && ! harmless[status.w_termsig])
1045*24472Sdonn 		fatal("see a system manager");
1046*24472Sdonn 	else
1047*24472Sdonn 		done(3);
1048*24472Sdonn 	}
1049*24472Sdonn return(status.w_retcode);
1050*24472Sdonn #else PSIGNAL
1051*24472Sdonn if(status & 0377)
1052*24472Sdonn 	{
1053*24472Sdonn 	if(status != SIGINT)
1054*24472Sdonn 		fprintf(diagfile, "Termination code %d\n", status);
1055*24472Sdonn 	done(3);
1056*24472Sdonn 	}
1057*24472Sdonn return(status>>8);
1058*24472Sdonn #endif PSIGNAL
1059*24472Sdonn }
1060*24472Sdonn 
1061*24472Sdonn /* File Name and File Manipulation Routines */
1062*24472Sdonn 
1063*24472Sdonn unreadable(s)
1064*24472Sdonn register char *s;
1065*24472Sdonn {
1066*24472Sdonn register FILE *fp;
1067*24472Sdonn 
1068*24472Sdonn if(fp = fopen(s, "r"))
1069*24472Sdonn 	{
1070*24472Sdonn 	fclose(fp);
1071*24472Sdonn 	return(NO);
1072*24472Sdonn 	}
1073*24472Sdonn 
1074*24472Sdonn else
1075*24472Sdonn 	{
1076*24472Sdonn 	fprintf(diagfile, "Error: Cannot read file %s\n", s);
1077*24472Sdonn 	return(YES);
1078*24472Sdonn 	}
1079*24472Sdonn }
1080*24472Sdonn 
1081*24472Sdonn 
1082*24472Sdonn 
1083*24472Sdonn stupid(s)
1084*24472Sdonn char *s;
1085*24472Sdonn {
1086*24472Sdonn char c;
1087*24472Sdonn 
1088*24472Sdonn if( (c = dotchar(s))
1089*24472Sdonn   && index("focsreF", c)
1090*24472Sdonn   && access(s, 0) == 0 )
1091*24472Sdonn 	{
1092*24472Sdonn 	fprintf(diagfile, "Loading on %s would destroy it\n", s);
1093*24472Sdonn 	return(YES);
1094*24472Sdonn 	}
1095*24472Sdonn return(NO);
1096*24472Sdonn }
1097*24472Sdonn 
1098*24472Sdonn 
1099*24472Sdonn 
1100*24472Sdonn clf(p)
1101*24472Sdonn FILEP *p;
1102*24472Sdonn {
1103*24472Sdonn if(p!=NULL && *p!=NULL && *p!=stdout)
1104*24472Sdonn 	{
1105*24472Sdonn 	if(ferror(*p))
1106*24472Sdonn 		fatal("writing error");
1107*24472Sdonn 	fclose(*p);
1108*24472Sdonn 	}
1109*24472Sdonn *p = NULL;
1110*24472Sdonn }
1111*24472Sdonn 
1112*24472Sdonn rmfiles()
1113*24472Sdonn {
1114*24472Sdonn rmf(textfname);
1115*24472Sdonn rmf(asmfname);
1116*24472Sdonn rmf(initfname);
1117*24472Sdonn rmf(asmpass2);
1118*24472Sdonn #if TARGET == INTERDATA
1119*24472Sdonn 	rmf(setfname);
1120*24472Sdonn #endif
1121*24472Sdonn }
1122*24472Sdonn 
1123*24472Sdonn 
1124*24472Sdonn 
1125*24472Sdonn 
1126*24472Sdonn 
1127*24472Sdonn 
1128*24472Sdonn 
1129*24472Sdonn 
1130*24472Sdonn /* return -1 if file does not exist, 0 if it is of zero length
1131*24472Sdonn    and 1 if of positive length
1132*24472Sdonn */
1133*24472Sdonn content(filename)
1134*24472Sdonn char *filename;
1135*24472Sdonn {
1136*24472Sdonn #ifdef VERSION6
1137*24472Sdonn 	struct stat
1138*24472Sdonn 		{
1139*24472Sdonn 		char cjunk[9];
1140*24472Sdonn 		char size0;
1141*24472Sdonn 		int size1;
1142*24472Sdonn 		int ijunk[12];
1143*24472Sdonn 		} buf;
1144*24472Sdonn #else
1145*24472Sdonn 	struct stat buf;
1146*24472Sdonn #endif
1147*24472Sdonn 
1148*24472Sdonn if(stat(filename,&buf) < 0)
1149*24472Sdonn 	return(-1);
1150*24472Sdonn #ifdef VERSION6
1151*24472Sdonn 	return(buf.size0 || buf.size1);
1152*24472Sdonn #else
1153*24472Sdonn 	return( buf.st_size > 0 );
1154*24472Sdonn #endif
1155*24472Sdonn }
1156*24472Sdonn 
1157*24472Sdonn 
1158*24472Sdonn 
1159*24472Sdonn 
1160*24472Sdonn crfnames()
1161*24472Sdonn {
1162*24472Sdonn fname(textfname, "x");
1163*24472Sdonn fname(asmfname, "s");
1164*24472Sdonn fname(asmpass2, "a");
1165*24472Sdonn fname(initfname, "d");
1166*24472Sdonn fname(sortfname, "S");
1167*24472Sdonn fname(objfdefault, "o");
1168*24472Sdonn fname(prepfname, "p");
1169*24472Sdonn fname(optzfname, "z");
1170*24472Sdonn fname(setfname, "A");
1171*24472Sdonn }
1172*24472Sdonn 
1173*24472Sdonn 
1174*24472Sdonn 
1175*24472Sdonn 
1176*24472Sdonn rmf(fn)
1177*24472Sdonn register char *fn;
1178*24472Sdonn {
1179*24472Sdonn /* if(!debugflag && fn!=NULL && *fn!='\0') */
1180*24472Sdonn 
1181*24472Sdonn if(fn!=NULL && *fn!='\0')
1182*24472Sdonn 	unlink(fn);
1183*24472Sdonn }
1184*24472Sdonn 
1185*24472Sdonn 
1186*24472Sdonn 
1187*24472Sdonn 
1188*24472Sdonn 
1189*24472Sdonn LOCAL fname(name, suff)
1190*24472Sdonn char *name, *suff;
1191*24472Sdonn {
1192*24472Sdonn sprintf(name, "/tmp/%s%d.%s", temppref, pid, suff);
1193*24472Sdonn }
1194*24472Sdonn 
1195*24472Sdonn 
1196*24472Sdonn 
1197*24472Sdonn 
1198*24472Sdonn dotchar(s)
1199*24472Sdonn register char *s;
1200*24472Sdonn {
1201*24472Sdonn for( ; *s ; ++s)
1202*24472Sdonn 	if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
1203*24472Sdonn 		return( s[1] );
1204*24472Sdonn return(NO);
1205*24472Sdonn }
1206*24472Sdonn 
1207*24472Sdonn 
1208*24472Sdonn 
1209*24472Sdonn char *lastfield(s)
1210*24472Sdonn register char *s;
1211*24472Sdonn {
1212*24472Sdonn register char *t;
1213*24472Sdonn for(t = s; *s ; ++s)
1214*24472Sdonn 	if(*s == '/')
1215*24472Sdonn 		t = s+1;
1216*24472Sdonn return(t);
1217*24472Sdonn }
1218*24472Sdonn 
1219*24472Sdonn 
1220*24472Sdonn 
1221*24472Sdonn char *lastchar(s)
1222*24472Sdonn register char *s;
1223*24472Sdonn {
1224*24472Sdonn while(*s)
1225*24472Sdonn 	++s;
1226*24472Sdonn return(s-1);
1227*24472Sdonn }
1228*24472Sdonn 
1229*24472Sdonn char *setdoto(s)
1230*24472Sdonn register char *s;
1231*24472Sdonn {
1232*24472Sdonn *lastchar(s) = 'o';
1233*24472Sdonn return( lastfield(s) );
1234*24472Sdonn }
1235*24472Sdonn 
1236*24472Sdonn 
1237*24472Sdonn 
1238*24472Sdonn badfile(s)
1239*24472Sdonn char *s;
1240*24472Sdonn {
1241*24472Sdonn fatalstr("cannot open intermediate file %s", s);
1242*24472Sdonn }
1243*24472Sdonn 
1244*24472Sdonn 
1245*24472Sdonn 
1246*24472Sdonn ptr ckalloc(n)
1247*24472Sdonn int n;
1248*24472Sdonn {
1249*24472Sdonn ptr p, calloc();
1250*24472Sdonn 
1251*24472Sdonn if( p = calloc(1, (unsigned) n) )
1252*24472Sdonn 	return(p);
1253*24472Sdonn 
1254*24472Sdonn fatal("out of memory");
1255*24472Sdonn /* NOTREACHED */
1256*24472Sdonn }
1257*24472Sdonn 
1258*24472Sdonn 
1259*24472Sdonn 
1260*24472Sdonn 
1261*24472Sdonn 
1262*24472Sdonn char *copyn(n, s)
1263*24472Sdonn register int n;
1264*24472Sdonn register char *s;
1265*24472Sdonn {
1266*24472Sdonn register char *p, *q;
1267*24472Sdonn 
1268*24472Sdonn p = q = (char *) ckalloc(n);
1269*24472Sdonn while(n-- > 0)
1270*24472Sdonn 	*q++ = *s++;
1271*24472Sdonn return(p);
1272*24472Sdonn }
1273*24472Sdonn 
1274*24472Sdonn 
1275*24472Sdonn 
1276*24472Sdonn char *copys(s)
1277*24472Sdonn char *s;
1278*24472Sdonn {
1279*24472Sdonn return( copyn( strlen(s)+1 , s) );
1280*24472Sdonn }
1281*24472Sdonn 
1282*24472Sdonn 
1283*24472Sdonn 
1284*24472Sdonn 
1285*24472Sdonn 
1286*24472Sdonn oneof(c,s)
1287*24472Sdonn register c;
1288*24472Sdonn register char *s;
1289*24472Sdonn {
1290*24472Sdonn while( *s )
1291*24472Sdonn 	if(*s++ == c)
1292*24472Sdonn 		return(YES);
1293*24472Sdonn return(NO);
1294*24472Sdonn }
1295*24472Sdonn 
1296*24472Sdonn 
1297*24472Sdonn 
1298*24472Sdonn nodup(s)
1299*24472Sdonn char *s;
1300*24472Sdonn {
1301*24472Sdonn register char **p;
1302*24472Sdonn 
1303*24472Sdonn for(p = loadargs ; p < loadp ; ++p)
1304*24472Sdonn 	if( !strcmp(*p, s) )
1305*24472Sdonn 		return(NO);
1306*24472Sdonn 
1307*24472Sdonn return(YES);
1308*24472Sdonn }
1309*24472Sdonn 
1310*24472Sdonn 
1311*24472Sdonn 
1312*24472Sdonn static fatal(t)
1313*24472Sdonn char *t;
1314*24472Sdonn {
1315*24472Sdonn fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
1316*24472Sdonn if(debugflag)
1317*24472Sdonn 	abort();
1318*24472Sdonn done(1);
1319*24472Sdonn exit(1);
1320*24472Sdonn }
1321*24472Sdonn 
1322*24472Sdonn 
1323*24472Sdonn 
1324*24472Sdonn 
1325*24472Sdonn static fatali(t,d)
1326*24472Sdonn char *t;
1327*24472Sdonn int d;
1328*24472Sdonn {
1329*24472Sdonn char buff[100];
1330*24472Sdonn sprintf(buff, t, d);
1331*24472Sdonn fatal(buff);
1332*24472Sdonn }
1333*24472Sdonn 
1334*24472Sdonn 
1335*24472Sdonn 
1336*24472Sdonn 
1337*24472Sdonn static fatalstr(t, s)
1338*24472Sdonn char *t, *s;
1339*24472Sdonn {
1340*24472Sdonn char buff[100];
1341*24472Sdonn sprintf(buff, t, s);
1342*24472Sdonn fatal(buff);
1343*24472Sdonn }
1344*24472Sdonn err(s)
1345*24472Sdonn char *s;
1346*24472Sdonn {
1347*24472Sdonn fprintf(diagfile, "Error in file %s: %s\n", infname, s);
1348*24472Sdonn }
1349*24472Sdonn 
1350