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