|
|
1.1 ! root 1: char *xxxvers[] = "\n@(#) FORTRAN 77 DRIVER, VERSION 2.03.5, 7 NOVEMBER 1980\n"; ! 2: #include <stdio.h> ! 3: #include <ctype.h> ! 4: #include "defines" ! 5: #include "machdefs" ! 6: #include "drivedefs" ! 7: #include "ftypes" ! 8: #include <signal.h> ! 9: ! 10: static FILEP diagfile = {stderr} ; ! 11: static int pid; ! 12: static int sigivalue = 0; ! 13: static int sigqvalue = 0; ! 14: static int sighvalue = 0; ! 15: static int sigtvalue = 0; ! 16: ! 17: static char *pass1name = PASS1NAME ; ! 18: static char *pass2name = PASS2NAME ; ! 19: static char *asmname = ASMNAME ; ! 20: static char *ldname = LDNAME ; ! 21: static char *footname = FOOTNAME; ! 22: static char *proffoot = PROFFOOT; ! 23: static char *macroname = "m4"; ! 24: static char *shellname = "/bin/sh"; ! 25: static char *aoutname = "a.out" ; ! 26: static char *temppref = TEMPPREF; ! 27: ! 28: static char *infname; ! 29: static char textfname[40]; ! 30: static char asmfname[40]; ! 31: static char asmpass2[40]; ! 32: static char initfname[40]; ! 33: static char sortfname[40]; ! 34: static char prepfname[40]; ! 35: static char objfdefault[40]; ! 36: static char optzfname[40]; ! 37: static char setfname[40]; ! 38: ! 39: static char fflags[50] = "-"; ! 40: static char cflags[50] = "-c"; ! 41: #if TARGET == GCOS ! 42: static char eflags[30] = "system=gcos "; ! 43: #else ! 44: static char eflags[30] = "system=unix "; ! 45: #endif ! 46: static char rflags[30] = ""; ! 47: static char lflag[3] = "-x"; ! 48: static char *fflagp = fflags+1; ! 49: static char *cflagp = cflags+2; ! 50: static char *eflagp = eflags+12; ! 51: static char *rflagp = rflags; ! 52: static char **loadargs; ! 53: static char **loadp; ! 54: ! 55: static flag erred = NO; ! 56: static flag loadflag = YES; ! 57: static flag saveasmflag = NO; ! 58: static flag profileflag = NO; ! 59: static flag optimflag = NO; ! 60: static flag debugflag = NO; ! 61: static flag verbose = NO; ! 62: static flag nofloating = NO; ! 63: static flag fortonly = NO; ! 64: static flag macroflag = NO; ! 65: static flag sdbflag = NO; ! 66: ! 67: ! 68: ! 69: main(argc, argv) ! 70: int argc; ! 71: char **argv; ! 72: { ! 73: int i, c, status; ! 74: char *setdoto(), *lastchar(), *lastfield(), *copys(); ! 75: ptr ckalloc(); ! 76: register char *s; ! 77: char fortfile[20], *t; ! 78: char buff[100]; ! 79: int intrupt(); ! 80: ! 81: sigivalue = (int) signal(SIGINT, SIG_IGN) & 01; ! 82: sigqvalue = (int) signal(SIGQUIT,SIG_IGN) & 01; ! 83: sighvalue = (int) signal(SIGHUP, SIG_IGN) & 01; ! 84: sigtvalue = (int) signal(SIGTERM,SIG_IGN) & 01; ! 85: enbint(intrupt); ! 86: ! 87: pid = getpid(); ! 88: crfnames(); ! 89: ! 90: loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) ); ! 91: loadargs[1] = "-X"; ! 92: loadargs[2] = "-u"; ! 93: #if HERE==PDP11 || HERE==VAX ! 94: loadargs[3] = "_MAIN__"; ! 95: #endif ! 96: #if HERE == INTERDATA ! 97: loadargs[3] = "main"; ! 98: #endif ! 99: loadp = loadargs + 4; ! 100: ! 101: --argc; ! 102: ++argv; ! 103: ! 104: while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0') ! 105: { ! 106: for(s = argv[0]+1 ; *s ; ++s) switch(*s) ! 107: { ! 108: case 'T': /* use special passes */ ! 109: switch(*++s) ! 110: { ! 111: case '1': ! 112: pass1name = s+1; goto endfor; ! 113: case '2': ! 114: pass2name = s+1; goto endfor; ! 115: case 'a': ! 116: asmname = s+1; goto endfor; ! 117: case 'l': ! 118: ldname = s+1; goto endfor; ! 119: case 'F': ! 120: footname = s+1; goto endfor; ! 121: case 'm': ! 122: macroname = s+1; goto endfor; ! 123: case 't': ! 124: temppref = s+1; goto endfor; ! 125: default: ! 126: fatali("bad option -T%c", *s); ! 127: } ! 128: break; ! 129: ! 130: case '6': ! 131: if(s[1]=='6') ! 132: { ! 133: *fflagp++ = *s++; ! 134: goto copyfflag; ! 135: } ! 136: else { ! 137: fprintf(diagfile, "invalid flag 6%c\n", s[1]); ! 138: done(1); ! 139: } ! 140: ! 141: case 'w': ! 142: if(s[1]=='6' && s[2]=='6') ! 143: { ! 144: *fflagp++ = *s++; ! 145: *fflagp++ = *s++; ! 146: } ! 147: ! 148: copyfflag: ! 149: case 'u': ! 150: case 'U': ! 151: case '1': ! 152: case 'C': ! 153: *fflagp++ = *s; ! 154: break; ! 155: ! 156: case 'O': ! 157: optimflag = YES; ! 158: #if TARGET == INTERDATA ! 159: *loadp++ = "-r"; ! 160: *loadp++ = "-d"; ! 161: #endif ! 162: *fflagp++ = 'O'; ! 163: if( isdigit(s[1]) ) ! 164: *fflagp++ = *++s; ! 165: break; ! 166: ! 167: case 'N': ! 168: *fflagp++ = 'N'; ! 169: if( oneof(*++s, "qxscn") ) ! 170: *fflagp++ = *s++; ! 171: else { ! 172: fprintf(diagfile, "invalid flag -N%c\n", *s); ! 173: done(1); ! 174: } ! 175: while( isdigit(*s) ) ! 176: *fflagp++ = *s++; ! 177: *fflagp++ = 'X'; ! 178: goto endfor; ! 179: ! 180: case 'm': ! 181: if(s[1] == '4') ! 182: ++s; ! 183: macroflag = YES; ! 184: break; ! 185: ! 186: case 'S': ! 187: strcat(cflags, " -S"); ! 188: saveasmflag = YES; ! 189: ! 190: case 'c': ! 191: loadflag = NO; ! 192: break; ! 193: ! 194: case 'v': ! 195: verbose = YES; ! 196: break; ! 197: ! 198: case 'd': ! 199: debugflag = YES; ! 200: goto copyfflag; ! 201: ! 202: case 'M': ! 203: *loadp++ = "-M"; ! 204: break; ! 205: ! 206: case 'g': ! 207: strcat(cflags," -g"); ! 208: sdbflag = YES; ! 209: goto copyfflag; ! 210: ! 211: case 'p': ! 212: profileflag = YES; ! 213: strcat(cflags," -p"); ! 214: goto copyfflag; ! 215: ! 216: case 'o': ! 217: if( ! strcmp(s, "onetrip") ) ! 218: { ! 219: *fflagp++ = '1'; ! 220: goto endfor; ! 221: } ! 222: aoutname = *++argv; ! 223: --argc; ! 224: break; ! 225: ! 226: #if TARGET == PDP11 ! 227: case 'f': ! 228: nofloating = YES; ! 229: pass2name = NOFLPASS2; ! 230: break; ! 231: #endif ! 232: ! 233: case 'F': ! 234: fortonly = YES; ! 235: loadflag = NO; ! 236: break; ! 237: ! 238: case 'I': ! 239: if(s[1]=='2' || s[1]=='4' || s[1]=='s') ! 240: { ! 241: *fflagp++ = *s++; ! 242: goto copyfflag; ! 243: } ! 244: fprintf(diagfile, "invalid flag -I%c\n", s[1]); ! 245: done(1); ! 246: ! 247: case 'l': /* letter ell--library */ ! 248: s[-1] = '-'; ! 249: *loadp++ = s-1; ! 250: goto endfor; ! 251: ! 252: case 'E': /* EFL flag argument */ ! 253: while( *eflagp++ = *++s) ! 254: ; ! 255: *eflagp++ = ' '; ! 256: goto endfor; ! 257: case 'R': ! 258: while( *rflagp++ = *++s ) ! 259: ; ! 260: *rflagp++ = ' '; ! 261: goto endfor; ! 262: default: ! 263: lflag[1] = *s; ! 264: *loadp++ = copys(lflag); ! 265: break; ! 266: } ! 267: endfor: ! 268: --argc; ! 269: ++argv; ! 270: } ! 271: ! 272: *fflagp = '\0'; ! 273: ! 274: loadargs[0] = ldname; ! 275: #if TARGET == PDP11 ! 276: if(nofloating) ! 277: *loadp++ = (profileflag ? NOFLPROF : NOFLFOOT); ! 278: else ! 279: #endif ! 280: *loadp++ = (profileflag ? proffoot : footname); ! 281: ! 282: for(i = 0 ; i<argc ; ++i) ! 283: switch(c = dotchar(infname = argv[i]) ) ! 284: { ! 285: case 'r': /* Ratfor file */ ! 286: case 'e': /* EFL file */ ! 287: if( unreadable(argv[i]) ) ! 288: { ! 289: erred = YES; ! 290: break; ! 291: } ! 292: s = fortfile; ! 293: t = lastfield(argv[i]); ! 294: while( *s++ = *t++) ! 295: ; ! 296: s[-2] = 'f'; ! 297: ! 298: if(macroflag) ! 299: { ! 300: sprintf(buff, "%s %s >%s", macroname, infname, prepfname); ! 301: if( sys(buff) ) ! 302: { ! 303: rmf(prepfname); ! 304: erred = YES; ! 305: break; ! 306: } ! 307: infname = prepfname; ! 308: } ! 309: ! 310: if(c == 'e') ! 311: sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile); ! 312: else ! 313: sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile); ! 314: status = sys(buff); ! 315: if(macroflag) ! 316: rmf(infname); ! 317: if(status) ! 318: { ! 319: erred = YES; ! 320: rmf(fortfile); ! 321: break; ! 322: } ! 323: ! 324: if( ! fortonly ) ! 325: { ! 326: infname = argv[i] = lastfield(argv[i]); ! 327: *lastchar(infname) = 'f'; ! 328: ! 329: if( dofort(argv[i]) ) ! 330: erred = YES; ! 331: else { ! 332: if( nodup(t = setdoto(argv[i])) ) ! 333: *loadp++ = t; ! 334: rmf(fortfile); ! 335: } ! 336: } ! 337: break; ! 338: ! 339: case 'f': /* Fortran file */ ! 340: case 'F': ! 341: if( unreadable(argv[i]) ) ! 342: erred = YES; ! 343: else if( dofort(argv[i]) ) ! 344: erred = YES; ! 345: else if( nodup(t=setdoto(argv[i])) ) ! 346: *loadp++ = t; ! 347: break; ! 348: ! 349: case 'c': /* C file */ ! 350: case 's': /* Assembler file */ ! 351: if( unreadable(argv[i]) ) ! 352: { ! 353: erred = YES; ! 354: break; ! 355: } ! 356: #if HERE==PDP11 || HERE==VAX ! 357: fprintf(diagfile, "%s:\n", argv[i]); ! 358: #endif ! 359: sprintf(buff, "cc %s %s", cflags, argv[i] ); ! 360: if( sys(buff) ) ! 361: erred = YES; ! 362: else ! 363: if( nodup(t = setdoto(argv[i])) ) ! 364: *loadp++ = t; ! 365: break; ! 366: ! 367: case 'o': ! 368: if( nodup(argv[i]) ) ! 369: *loadp++ = argv[i]; ! 370: break; ! 371: ! 372: default: ! 373: if( ! strcmp(argv[i], "-o") ) ! 374: aoutname = argv[++i]; ! 375: else ! 376: *loadp++ = argv[i]; ! 377: break; ! 378: } ! 379: ! 380: if(loadflag && !erred) ! 381: doload(loadargs, loadp); ! 382: done(erred); ! 383: } ! 384: ! 385: dofort(s) ! 386: char *s; ! 387: { ! 388: int retcode; ! 389: char buff[200]; ! 390: ! 391: infname = s; ! 392: sprintf(buff, "%s %s %s %s %s %s", ! 393: pass1name, fflags, s, asmfname, initfname, textfname); ! 394: switch( sys(buff) ) ! 395: { ! 396: case 1: ! 397: goto error; ! 398: case 0: ! 399: break; ! 400: default: ! 401: goto comperror; ! 402: } ! 403: ! 404: if(content(initfname) > 0) ! 405: if( dodata() ) ! 406: goto error; ! 407: if( dopass2() ) ! 408: goto comperror; ! 409: doasm(s); ! 410: retcode = 0; ! 411: ! 412: ret: ! 413: rmf(asmfname); ! 414: rmf(initfname); ! 415: rmf(textfname); ! 416: return(retcode); ! 417: ! 418: error: ! 419: fprintf(diagfile, "\nError. No assembly.\n"); ! 420: retcode = 1; ! 421: goto ret; ! 422: ! 423: comperror: ! 424: fprintf(diagfile, "\ncompiler error.\n"); ! 425: retcode = 2; ! 426: goto ret; ! 427: } ! 428: ! 429: ! 430: ! 431: ! 432: dopass2() ! 433: { ! 434: char buff[100]; ! 435: ! 436: if(verbose) ! 437: fprintf(diagfile, "PASS2."); ! 438: ! 439: #if FAMILY==DMR ! 440: sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2); ! 441: return( sys(buff) ); ! 442: #endif ! 443: ! 444: #if FAMILY == PCC ! 445: # if TARGET==INTERDATA ! 446: sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2); ! 447: # else ! 448: sprintf(buff, "%s %s >%s", pass2name, textfname, asmpass2); ! 449: # endif ! 450: return( sys(buff) ); ! 451: #endif ! 452: } ! 453: ! 454: ! 455: ! 456: ! 457: doasm(s) ! 458: char *s; ! 459: { ! 460: register char *lastc; ! 461: char *obj; ! 462: char buff[200]; ! 463: char *lastchar(), *setdoto(); ! 464: ! 465: if(*s == '\0') ! 466: s = objfdefault; ! 467: lastc = lastchar(s); ! 468: obj = setdoto(s); ! 469: ! 470: #if TARGET==PDP11 || TARGET==VAX ! 471: # ifdef PASS2OPT ! 472: if(optimflag) ! 473: { ! 474: sprintf(buff, "%s %s %s", PASS2OPT, asmpass2, optzfname); ! 475: if( sys(buff) ) ! 476: rmf(optzfname); ! 477: else ! 478: { ! 479: sprintf(buff,"mv %s %s", optzfname, asmpass2); ! 480: sys(buff); ! 481: } ! 482: } ! 483: # endif ! 484: #endif ! 485: ! 486: if(saveasmflag) ! 487: { ! 488: *lastc = 's'; ! 489: #if TARGET == INTERDATA ! 490: sprintf(buff, "cat %s %s %s >%s",asmfname, setfname, asmpass2, obj); ! 491: #else ! 492: sprintf(buff, "cat %s %s >%s", asmfname, asmpass2, obj); ! 493: #endif ! 494: sys(buff); ! 495: *lastc = 'o'; ! 496: } ! 497: else ! 498: { ! 499: if(verbose) ! 500: fprintf(diagfile, " ASM."); ! 501: #if TARGET == INTERDATA ! 502: sprintf(buff, "%s -o %s %s %s %s", asmname, obj, asmfname, setfname, asmpass2); ! 503: #endif ! 504: ! 505: #if TARGET == VAX ! 506: /* vax assembler currently accepts only one input file */ ! 507: sprintf(buff, "cat %s >>%s", asmpass2, asmfname); ! 508: sys(buff); ! 509: sprintf(buff, "%s -o %s %s", asmname, obj, asmfname); ! 510: #endif ! 511: ! 512: #if TARGET == PDP11 ! 513: sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2); ! 514: #endif ! 515: ! 516: #if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX ! 517: sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2); ! 518: #endif ! 519: ! 520: if( sys(buff) ) ! 521: fatal("assembler error"); ! 522: if(verbose) ! 523: fprintf(diagfile, "\n"); ! 524: #if HERE==PDP11 && TARGET!=PDP11 ! 525: rmf(obj); ! 526: #endif ! 527: } ! 528: ! 529: rmf(asmpass2); ! 530: } ! 531: ! 532: ! 533: ! 534: doload(v0, v) ! 535: register char *v0[], *v[]; ! 536: { ! 537: char **p; ! 538: int waitpid; ! 539: ! 540: if(sdbflag) ! 541: *v++ = "-lg"; ! 542: for(p = liblist ; *p ; *v++ = *p++) ! 543: ; ! 544: ! 545: *v++ = "-o"; ! 546: *v++ = aoutname; ! 547: *v = NULL; ! 548: ! 549: if(verbose) ! 550: fprintf(diagfile, "LOAD."); ! 551: if(debugflag) ! 552: { ! 553: for(p = v0 ; p<v ; ++p) ! 554: fprintf(diagfile, "%s ", *p); ! 555: fprintf(diagfile, "\n"); ! 556: } ! 557: ! 558: #if HERE==PDP11 || HERE==INTERDATA || HERE==VAX ! 559: if( (waitpid = fork()) == 0) ! 560: { ! 561: enbint(SIG_DFL); ! 562: execv(ldname, v0); ! 563: fatalstr("couldn't load %s", ldname); ! 564: } ! 565: await(waitpid); ! 566: #endif ! 567: ! 568: #if HERE==INTERDATA ! 569: if(optimflag) ! 570: { ! 571: char buff1[100], buff2[100]; ! 572: sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid); ! 573: sprintf(buff2, "mv junk.%d %s", pid, aoutname); ! 574: if( sys(buff1) || sys(buff2) ) ! 575: err("bad optimization"); ! 576: } ! 577: #endif ! 578: ! 579: if(verbose) ! 580: fprintf(diagfile, "\n"); ! 581: } ! 582: ! 583: /* Process control and Shell-simulating routines */ ! 584: ! 585: sys(str) ! 586: char *str; ! 587: { ! 588: register char *s, *t; ! 589: char *argv[100], path[100]; ! 590: char *inname, *outname; ! 591: int append; ! 592: int waitpid; ! 593: int argc; ! 594: ! 595: ! 596: if(debugflag) ! 597: fprintf(diagfile, "%s\n", str); ! 598: inname = NULL; ! 599: outname = NULL; ! 600: argv[0] = shellname; ! 601: argc = 1; ! 602: ! 603: t = str; ! 604: while( isspace(*t) ) ! 605: ++t; ! 606: while(*t) ! 607: { ! 608: if(*t == '<') ! 609: inname = t+1; ! 610: else if(*t == '>') ! 611: { ! 612: if(t[1] == '>') ! 613: { ! 614: append = YES; ! 615: outname = t+2; ! 616: } ! 617: else { ! 618: append = NO; ! 619: outname = t+1; ! 620: } ! 621: } ! 622: else ! 623: argv[argc++] = t; ! 624: while( !isspace(*t) && *t!='\0' ) ! 625: ++t; ! 626: if(*t) ! 627: { ! 628: *t++ = '\0'; ! 629: while( isspace(*t) ) ! 630: ++t; ! 631: } ! 632: } ! 633: ! 634: if(argc == 1) /* no command */ ! 635: return(-1); ! 636: argv[argc] = 0; ! 637: ! 638: s = path; ! 639: t = "/usr/bin/"; ! 640: while(*t) ! 641: *s++ = *t++; ! 642: for(t = argv[1] ; *s++ = *t++ ; ) ! 643: ; ! 644: if((waitpid = fork()) == 0) ! 645: { ! 646: if(inname) ! 647: freopen(inname, "r", stdin); ! 648: if(outname) ! 649: freopen(outname, (append ? "a" : "w"), stdout); ! 650: enbint(SIG_DFL); ! 651: ! 652: texec(path+9, argv); /* command */ ! 653: texec(path+4, argv); /* /bin/command */ ! 654: texec(path , argv); /* /usr/bin/command */ ! 655: ! 656: fatalstr("Cannot load %s",path+9); ! 657: } ! 658: ! 659: return( await(waitpid) ); ! 660: } ! 661: ! 662: ! 663: ! 664: ! 665: ! 666: #include "errno.h" ! 667: ! 668: /* modified version from the Shell */ ! 669: texec(f, av) ! 670: char *f; ! 671: char **av; ! 672: { ! 673: extern int errno; ! 674: ! 675: execv(f, av+1); ! 676: ! 677: if (errno==ENOEXEC) ! 678: { ! 679: av[1] = f; ! 680: execv(shellname, av); ! 681: fatal("No shell!"); ! 682: } ! 683: if (errno==ENOMEM) ! 684: fatalstr("%s: too large", f); ! 685: } ! 686: ! 687: ! 688: ! 689: ! 690: ! 691: ! 692: done(k) ! 693: int k; ! 694: { ! 695: static int recurs = NO; ! 696: ! 697: if(recurs == NO) ! 698: { ! 699: recurs = YES; ! 700: rmfiles(); ! 701: } ! 702: exit(k); ! 703: } ! 704: ! 705: ! 706: ! 707: ! 708: ! 709: ! 710: enbint(k) ! 711: int (*k)(); ! 712: { ! 713: if(sigivalue == 0) ! 714: signal(SIGINT,k); ! 715: if(sigqvalue == 0) ! 716: signal(SIGQUIT,k); ! 717: if(sighvalue == 0) ! 718: signal(SIGHUP,k); ! 719: if(sigtvalue == 0) ! 720: signal(SIGTERM,k); ! 721: } ! 722: ! 723: ! 724: ! 725: ! 726: intrupt() ! 727: { ! 728: done(2); ! 729: } ! 730: ! 731: ! 732: ! 733: await(waitpid) ! 734: int waitpid; ! 735: { ! 736: int w, status; ! 737: ! 738: enbint(SIG_IGN); ! 739: while ( (w = wait(&status)) != waitpid) ! 740: if(w == -1) ! 741: fatal("bad wait code"); ! 742: enbint(intrupt); ! 743: if(status & 0377) ! 744: { ! 745: if(status != SIGINT) ! 746: fprintf(diagfile, "Termination code %d", status); ! 747: done(3); ! 748: } ! 749: return(status>>8); ! 750: } ! 751: ! 752: /* File Name and File Manipulation Routines */ ! 753: ! 754: unreadable(s) ! 755: register char *s; ! 756: { ! 757: register FILE *fp; ! 758: ! 759: if(fp = fopen(s, "r")) ! 760: { ! 761: fclose(fp); ! 762: return(NO); ! 763: } ! 764: ! 765: else ! 766: { ! 767: fprintf(diagfile, "Error: Cannot read file %s\n", s); ! 768: return(YES); ! 769: } ! 770: } ! 771: ! 772: ! 773: ! 774: clf(p) ! 775: FILEP *p; ! 776: { ! 777: if(p!=NULL && *p!=NULL && *p!=stdout) ! 778: { ! 779: if(ferror(*p)) ! 780: fatal("writing error"); ! 781: fclose(*p); ! 782: } ! 783: *p = NULL; ! 784: } ! 785: ! 786: rmfiles() ! 787: { ! 788: rmf(textfname); ! 789: rmf(asmfname); ! 790: rmf(initfname); ! 791: rmf(asmpass2); ! 792: #if TARGET == INTERDATA ! 793: rmf(setfname); ! 794: #endif ! 795: } ! 796: ! 797: ! 798: ! 799: ! 800: ! 801: ! 802: ! 803: ! 804: /* return -1 if file does not exist, 0 if it is of zero length ! 805: and 1 if of positive length ! 806: */ ! 807: content(filename) ! 808: char *filename; ! 809: { ! 810: #ifdef VERSION6 ! 811: struct stat ! 812: { ! 813: char cjunk[9]; ! 814: char size0; ! 815: int size1; ! 816: int ijunk[12]; ! 817: } buf; ! 818: #else ! 819: # include <sys/types.h> ! 820: # include <sys/stat.h> ! 821: struct stat buf; ! 822: #endif ! 823: ! 824: if(stat(filename,&buf) < 0) ! 825: return(-1); ! 826: #ifdef VERSION6 ! 827: return(buf.size0 || buf.size1); ! 828: #else ! 829: return( buf.st_size > 0 ); ! 830: #endif ! 831: } ! 832: ! 833: ! 834: ! 835: ! 836: crfnames() ! 837: { ! 838: fname(textfname, "x"); ! 839: fname(asmfname, "s"); ! 840: fname(asmpass2, "a"); ! 841: fname(initfname, "d"); ! 842: fname(sortfname, "S"); ! 843: fname(objfdefault, "o"); ! 844: fname(prepfname, "p"); ! 845: fname(optzfname, "z"); ! 846: fname(setfname, "A"); ! 847: } ! 848: ! 849: ! 850: ! 851: ! 852: rmf(fn) ! 853: register char *fn; ! 854: { ! 855: if(!debugflag && fn!=NULL && *fn!='\0') ! 856: unlink(fn); ! 857: } ! 858: ! 859: ! 860: ! 861: ! 862: ! 863: LOCAL fname(name, suff) ! 864: char *name, *suff; ! 865: { ! 866: sprintf(name, "%s%d.%s", temppref, pid, suff); ! 867: } ! 868: ! 869: ! 870: ! 871: ! 872: dotchar(s) ! 873: register char *s; ! 874: { ! 875: for( ; *s ; ++s) ! 876: if(s[0]=='.' && s[1]!='\0' && s[2]=='\0') ! 877: return( s[1] ); ! 878: return(NO); ! 879: } ! 880: ! 881: ! 882: ! 883: char *lastfield(s) ! 884: register char *s; ! 885: { ! 886: register char *t; ! 887: for(t = s; *s ; ++s) ! 888: if(*s == '/') ! 889: t = s+1; ! 890: return(t); ! 891: } ! 892: ! 893: ! 894: ! 895: char *lastchar(s) ! 896: register char *s; ! 897: { ! 898: while(*s) ! 899: ++s; ! 900: return(s-1); ! 901: } ! 902: ! 903: char *setdoto(s) ! 904: register char *s; ! 905: { ! 906: *lastchar(s) = 'o'; ! 907: return( lastfield(s) ); ! 908: } ! 909: ! 910: ! 911: ! 912: badfile(s) ! 913: char *s; ! 914: { ! 915: fatalstr("cannot open intermediate file %s", s); ! 916: } ! 917: ! 918: ! 919: ! 920: ptr ckalloc(n) ! 921: int n; ! 922: { ! 923: ptr p, calloc(); ! 924: ! 925: if( p = calloc(1, (unsigned) n) ) ! 926: return(p); ! 927: ! 928: fatal("out of memory"); ! 929: /* NOTREACHED */ ! 930: } ! 931: ! 932: ! 933: ! 934: ! 935: ! 936: char *copyn(n, s) ! 937: register int n; ! 938: register char *s; ! 939: { ! 940: register char *p, *q; ! 941: ! 942: p = q = (char *) ckalloc(n); ! 943: while(n-- > 0) ! 944: *q++ = *s++; ! 945: return(p); ! 946: } ! 947: ! 948: ! 949: ! 950: char *copys(s) ! 951: char *s; ! 952: { ! 953: return( copyn( strlen(s)+1 , s) ); ! 954: } ! 955: ! 956: ! 957: ! 958: ! 959: ! 960: oneof(c,s) ! 961: register c; ! 962: register char *s; ! 963: { ! 964: while( *s ) ! 965: if(*s++ == c) ! 966: return(YES); ! 967: return(NO); ! 968: } ! 969: ! 970: ! 971: ! 972: nodup(s) ! 973: char *s; ! 974: { ! 975: register char **p; ! 976: ! 977: for(p = loadargs ; p < loadp ; ++p) ! 978: if( !strcmp(*p, s) ) ! 979: return(NO); ! 980: ! 981: return(YES); ! 982: } ! 983: ! 984: ! 985: ! 986: static fatal(t) ! 987: char *t; ! 988: { ! 989: fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t); ! 990: if(debugflag) ! 991: abort(); ! 992: done(1); ! 993: exit(1); ! 994: } ! 995: ! 996: ! 997: ! 998: ! 999: static fatali(t,d) ! 1000: char *t; ! 1001: int d; ! 1002: { ! 1003: char buff[100]; ! 1004: sprintf(buff, t, d); ! 1005: fatal(buff); ! 1006: } ! 1007: ! 1008: ! 1009: ! 1010: ! 1011: static fatalstr(t, s) ! 1012: char *t, *s; ! 1013: { ! 1014: char buff[100]; ! 1015: sprintf(buff, t, s); ! 1016: fatal(buff); ! 1017: } ! 1018: err(s) ! 1019: char *s; ! 1020: { ! 1021: fprintf(diagfile, "Error in file %s: %s\n", infname, s); ! 1022: } ! 1023: ! 1024: /* Code to generate initializations for DATA statements */ ! 1025: ! 1026: LOCAL int nch = 0; ! 1027: LOCAL FILEP asmfile; ! 1028: LOCAL FILEP sortfile; ! 1029: ! 1030: #include "ftypes" ! 1031: ! 1032: static ftnint typesize[NTYPES] ! 1033: = { 1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG, ! 1034: 2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 1}; ! 1035: static int typealign[NTYPES] ! 1036: = { 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE, ! 1037: ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1}; ! 1038: ! 1039: dodata() ! 1040: { ! 1041: char buff[50]; ! 1042: char varname[XL+1], ovarname[XL+1]; ! 1043: int status; ! 1044: flag erred; ! 1045: ftnint offset, vlen, type; ! 1046: register ftnint ooffset, ovlen; ! 1047: ftnint nblank, vchar; ! 1048: int size, align; ! 1049: int vargroup; ! 1050: ftnint totlen, doeven(); ! 1051: ! 1052: erred = NO; ! 1053: ovarname[0] = '\0'; ! 1054: ooffset = 0; ! 1055: ovlen = 0; ! 1056: totlen = 0; ! 1057: nch = 0; ! 1058: ! 1059: sprintf(buff, "sort %s >%s", initfname, sortfname); ! 1060: if(status = sys(buff)) ! 1061: fatali("call sort status = %d", status); ! 1062: if( (sortfile = fopen(sortfname, "r")) == NULL) ! 1063: badfile(sortfname); ! 1064: if( (asmfile = fopen(asmfname, "a")) == NULL) ! 1065: badfile(asmfname); ! 1066: pruse(asmfile, USEINIT); ! 1067: ! 1068: while( rdname(&vargroup, varname) && rdlong(&offset) && rdlong(&vlen) && rdlong(&type) ) ! 1069: { ! 1070: size = typesize[type]; ! 1071: if( strcmp(varname, ovarname) ) ! 1072: { ! 1073: prspace(ovlen-ooffset); ! 1074: strcpy(ovarname, varname); ! 1075: ooffset = 0; ! 1076: totlen += ovlen; ! 1077: ovlen = vlen; ! 1078: if(vargroup == 0) ! 1079: align = (type==TYCHAR || type==TYBLANK ? ! 1080: SZLONG : typealign[type]); ! 1081: else align = ALIDOUBLE; ! 1082: totlen = doeven(totlen, align); ! 1083: if(vargroup == 2) ! 1084: prcomblock(asmfile, varname); ! 1085: else ! 1086: fprintf(asmfile, LABELFMT, varname); ! 1087: } ! 1088: if(offset < ooffset) ! 1089: { ! 1090: erred = YES; ! 1091: err("overlapping initializations"); ! 1092: ooffset = offset; ! 1093: } ! 1094: if(offset > ooffset) ! 1095: { ! 1096: prspace(offset-ooffset); ! 1097: ooffset = offset; ! 1098: } ! 1099: if(type == TYCHAR) ! 1100: { ! 1101: if( rdlong(&vchar) ) ! 1102: prch( (int) vchar ); ! 1103: else ! 1104: fatal("bad intermediate file format"); ! 1105: } ! 1106: else if(type == TYBLANK) ! 1107: { ! 1108: if( rdlong(&nblank) ) ! 1109: { ! 1110: size = nblank; ! 1111: while( --nblank >= 0) ! 1112: prch( ' ' ); ! 1113: } ! 1114: else ! 1115: fatal("bad intermediate file format"); ! 1116: } ! 1117: else ! 1118: { ! 1119: putc('\t', asmfile); ! 1120: while ( putc( getc(sortfile), asmfile) != '\n') ! 1121: ; ! 1122: } ! 1123: if( (ooffset += size) > ovlen) ! 1124: { ! 1125: erred = YES; ! 1126: err("initialization out of bounds"); ! 1127: } ! 1128: } ! 1129: ! 1130: prspace(ovlen-ooffset); ! 1131: totlen = doeven(totlen+ovlen, (ALIDOUBLE>SZLONG ? ALIDOUBLE : SZLONG) ); ! 1132: clf(&sortfile); ! 1133: clf(&asmfile); ! 1134: clf(&sortfile); ! 1135: rmf(sortfname); ! 1136: return(erred); ! 1137: } ! 1138: ! 1139: ! 1140: ! 1141: ! 1142: prspace(n) ! 1143: register ftnint n; ! 1144: { ! 1145: register ftnint m; ! 1146: ! 1147: while(nch>0 && n>0) ! 1148: { ! 1149: --n; ! 1150: prch(0); ! 1151: } ! 1152: m = SZSHORT * (n/SZSHORT); ! 1153: if(m > 0) ! 1154: prskip(asmfile, m); ! 1155: for(n -= m ; n>0 ; --n) ! 1156: prch(0); ! 1157: } ! 1158: ! 1159: ! 1160: ! 1161: ! 1162: ftnint doeven(tot, align) ! 1163: register ftnint tot; ! 1164: int align; ! 1165: { ! 1166: ftnint new; ! 1167: new = roundup(tot, align); ! 1168: prspace(new - tot); ! 1169: return(new); ! 1170: } ! 1171: ! 1172: ! 1173: ! 1174: rdname(vargroupp, name) ! 1175: int *vargroupp; ! 1176: register char *name; ! 1177: { ! 1178: register int i, c; ! 1179: ! 1180: if( (c = getc(sortfile)) == EOF) ! 1181: return(NO); ! 1182: *vargroupp = c - '0'; ! 1183: ! 1184: for(i = 0 ; i<XL ; ++i) ! 1185: { ! 1186: if( (c = getc(sortfile)) == EOF) ! 1187: return(NO); ! 1188: if(c != ' ') ! 1189: *name++ = c; ! 1190: } ! 1191: *name = '\0'; ! 1192: return(YES); ! 1193: } ! 1194: ! 1195: ! 1196: ! 1197: rdlong(n) ! 1198: register ftnint *n; ! 1199: { ! 1200: register int c; ! 1201: ! 1202: for(c = getc(sortfile) ; c!=EOF && isspace(c) ; c = getc(sortfile) ); ! 1203: ; ! 1204: if(c == EOF) ! 1205: return(NO); ! 1206: ! 1207: for(*n = 0 ; isdigit(c) ; c = getc(sortfile) ) ! 1208: *n = 10* (*n) + c - '0'; ! 1209: return(YES); ! 1210: } ! 1211: ! 1212: ! 1213: ! 1214: ! 1215: prch(c) ! 1216: register int c; ! 1217: { ! 1218: static int buff[SZSHORT]; ! 1219: ! 1220: buff[nch++] = c; ! 1221: if(nch == SZSHORT) ! 1222: { ! 1223: prchars(asmfile, buff); ! 1224: nch = 0; ! 1225: } ! 1226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.