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