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