|
|
1.1 ! root 1: char *xxxvers[] = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10, 16 AUGUST 1980\n"; ! 2: #define VER 0x5625 /* for pi; 8YMDD */ ! 3: ! 4: #include "defs" ! 5: #include <signal.h> ! 6: ! 7: #ifdef SDB ! 8: # include <a.out.h> ! 9: # ifndef N_SO ! 10: # include <stab.h> ! 11: # endif ! 12: #endif ! 13: ! 14: ! 15: main(argc, argv) ! 16: int argc; ! 17: char **argv; ! 18: { ! 19: char *s; ! 20: int k, retcode, *ip; ! 21: #if SDB ! 22: char elab[10]; ! 23: int elnum; ! 24: #endif ! 25: FILEP opf(); ! 26: int flovflo(); ! 27: ! 28: #define DONE(c) { retcode = c; goto finis; } ! 29: ! 30: signal(SIGFPE, flovflo); /* catch overflows */ ! 31: ! 32: #if HERE == PDP11 ! 33: ldfps(01200); /* trap on overflow */ ! 34: #endif ! 35: ! 36: ! 37: ! 38: --argc; ! 39: ++argv; ! 40: ! 41: while(argc>0 && argv[0][0]=='-') ! 42: { ! 43: for(s = argv[0]+1 ; *s ; ++s) switch(*s) ! 44: { ! 45: case 'w': ! 46: if(s[1]=='6' && s[2]=='6') ! 47: { ! 48: ftn66flag = YES; ! 49: s += 2; ! 50: } ! 51: else ! 52: nowarnflag = YES; ! 53: break; ! 54: ! 55: case 'U': ! 56: shiftcase = NO; ! 57: break; ! 58: ! 59: case 'u': ! 60: undeftype = YES; ! 61: break; ! 62: ! 63: case 'O': ! 64: optimflag = YES; ! 65: if( isdigit(s[1]) ) ! 66: { ! 67: k = *++s - '0'; ! 68: if(k > MAXREGVAR) ! 69: { ! 70: warn1("-O%d: too many register variables", k); ! 71: maxregvar = MAXREGVAR; ! 72: } ! 73: else ! 74: maxregvar = k; ! 75: } ! 76: break; ! 77: ! 78: case 'd': ! 79: debugflag = YES; ! 80: break; ! 81: ! 82: case 'p': ! 83: profileflag = YES; ! 84: break; ! 85: ! 86: case 'C': ! 87: checksubs = YES; ! 88: break; ! 89: ! 90: case '6': ! 91: no66flag = YES; ! 92: noextflag = YES; ! 93: break; ! 94: ! 95: case '1': ! 96: onetripflag = YES; ! 97: break; ! 98: ! 99: #ifdef SDB ! 100: case 'g': ! 101: sdbflag = YES; ! 102: break; ! 103: #endif ! 104: ! 105: case 'N': ! 106: switch(*++s) ! 107: { ! 108: case 'q': ! 109: ip = &maxequiv; goto getnum; ! 110: case 'x': ! 111: ip = &maxext; goto getnum; ! 112: case 's': ! 113: ip = &maxstno; goto getnum; ! 114: case 'c': ! 115: ip = &maxctl; goto getnum; ! 116: case 'n': ! 117: ip = &maxhash; goto getnum; ! 118: ! 119: default: ! 120: fatali("invalid flag -N%c", *s); ! 121: } ! 122: getnum: ! 123: k = 0; ! 124: while( isdigit(*++s) ) ! 125: k = 10*k + (*s - '0'); ! 126: if(k <= 0) ! 127: fatal("Table size too small"); ! 128: *ip = k; ! 129: break; ! 130: ! 131: case 'I': ! 132: if(*++s == '2') ! 133: tyint = TYSHORT; ! 134: else if(*s == '4') ! 135: { ! 136: shortsubs = NO; ! 137: tyint = TYLONG; ! 138: } ! 139: else if(*s == 's') ! 140: shortsubs = YES; ! 141: else ! 142: fatali("invalid flag -I%c\n", *s); ! 143: tylogical = tyint; ! 144: break; ! 145: ! 146: default: ! 147: fatali("invalid flag %c\n", *s); ! 148: } ! 149: --argc; ! 150: ++argv; ! 151: } ! 152: ! 153: if(argc != 4) ! 154: fatali("arg count %d", argc); ! 155: asmfile = opf(argv[1]); ! 156: initfile = opf(argv[2]); ! 157: textfile = opf(argv[3]); ! 158: ! 159: initkey(); ! 160: if(inilex( copys(argv[0]) )) ! 161: DONE(1); ! 162: fprintf(diagfile, "%s:\n", argv[0]); ! 163: ! 164: #ifdef SDB ! 165: #ifndef UCBPASS2 ! 166: for(s = argv[0] ; ; s += 8) ! 167: { ! 168: prstab(s,N_SO,0,0); ! 169: if( strlen(s) < 8 ) ! 170: break; ! 171: } ! 172: #else ! 173: prstab(argv[0],N_SO,0,0); ! 174: #endif ! 175: prstab("vaxf77",N_VER,VER,0); ! 176: #endif ! 177: ! 178: fileinit(); ! 179: procinit(); ! 180: if(k = yyparse()) ! 181: { ! 182: fprintf(diagfile, "Bad parse, return code %d\n", k); ! 183: DONE(1); ! 184: } ! 185: if(nerr > 0) ! 186: DONE(1); ! 187: if(parstate != OUTSIDE) ! 188: { ! 189: warn("missing END statement"); ! 190: endproc(); ! 191: } ! 192: doext(); ! 193: preven(ALIDOUBLE); ! 194: prtail(); ! 195: #if SDB ! 196: sprintf(elab, "L%d", elnum = newlabel()); ! 197: putlabel(elnum); ! 198: prstab(argv[0],N_ESO,lineno,elab); ! 199: #endif ! 200: #if FAMILY==PCC ! 201: puteof(); ! 202: #endif ! 203: ! 204: if(nerr > 0) ! 205: DONE(1); ! 206: DONE(0); ! 207: ! 208: ! 209: finis: ! 210: done(retcode); ! 211: return(retcode); ! 212: } ! 213: ! 214: ! 215: ! 216: done(k) ! 217: int k; ! 218: { ! 219: static int recurs = NO; ! 220: ! 221: if(recurs == NO) ! 222: { ! 223: recurs = YES; ! 224: clfiles(); ! 225: } ! 226: exit(k); ! 227: } ! 228: ! 229: ! 230: LOCAL FILEP opf(fn) ! 231: char *fn; ! 232: { ! 233: FILEP fp; ! 234: if( fp = fopen(fn, "w") ) ! 235: return(fp); ! 236: ! 237: fatalstr("cannot open intermediate file %s", fn); ! 238: /* NOTREACHED */ ! 239: } ! 240: ! 241: ! 242: ! 243: LOCAL clfiles() ! 244: { ! 245: clf(&textfile); ! 246: clf(&asmfile); ! 247: clf(&initfile); ! 248: } ! 249: ! 250: ! 251: clf(p) ! 252: FILEP *p; ! 253: { ! 254: if(p!=NULL && *p!=NULL && *p!=stdout) ! 255: { ! 256: if(ferror(*p)) ! 257: fatal("writing error"); ! 258: fclose(*p); ! 259: } ! 260: *p = NULL; ! 261: } ! 262: ! 263: ! 264: ! 265: ! 266: flovflo() ! 267: { ! 268: err("floating exception during constant evaluation"); ! 269: #if HERE == VAX ! 270: fatal("vax cannot recover from floating exception"); ! 271: /* vax returns a reserved operand that generates ! 272: an illegal operand fault on next instruction, ! 273: which if ignored causes an infinite loop. ! 274: */ ! 275: #endif ! 276: signal(SIGFPE, flovflo); ! 277: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.