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