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