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