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