|
|
1.1 ! root 1: #include "defs" ! 2: #include <ctype.h> ! 3: ! 4: static int indent; ! 5: ! 6: char *verb[] = { " ", " ", "continue", "call ", "do ", "if ", "if ", ! 7: "goto ", "return", "read ", "write ", "format ", "stop ", ! 8: "data ", "equivalence ", "common ", "external ", ! 9: "rewind", "backspace", "endfile", ! 10: "subroutine ", "function ", "program main", "blockdata", "end", ! 11: CNULL }; ! 12: ! 13: extern char *ops[]; ! 14: ptr getsii(); ! 15: ! 16: /* generate code */ ! 17: ! 18: pass2() ! 19: { ! 20: exnull(); ! 21: if(comments) putcomment(); ! 22: if(verbose) ! 23: fprintf(diagfile, " Pass 2\n"); ! 24: ! 25: dclsect = 0; ! 26: indent = 0; ! 27: ! 28: namegen(); ! 29: dclgen(); ! 30: body(iefile); ! 31: datas(); ! 32: body(icfile); ! 33: ! 34: p2stmt(0); ! 35: p2key(FEND); ! 36: p2flush(); ! 37: if(verbose) ! 38: fprintf(diagfile, " Pass 2 done\n"); ! 39: } ! 40: ! 41: datas() ! 42: { ! 43: register int c, n; ! 44: int n1; ! 45: ! 46: rewii(idfile); ! 47: swii(idfile); ! 48: ! 49: for( ; ; ) ! 50: { ! 51: c = getic(&n1); ! 52: n = n1; ! 53: switch(c) ! 54: { ! 55: case ICEOF: ! 56: return; ! 57: ! 58: case ICMARK: ! 59: break; ! 60: ! 61: case ICBLANK: ! 62: putblank(n); ! 63: break; ! 64: ! 65: case ICNAME: ! 66: if(*ftnames[n] == '\0') ! 67: fatal1("no name for n=%d", n); ! 68: p2stmt(0); ! 69: p2key(FDATA); ! 70: p2str( ftnames[n] ); ! 71: break; ! 72: ! 73: case ICOP: ! 74: p2str( ops[n] ); ! 75: break; ! 76: ! 77: case ICCONST: ! 78: p2str( getsii(n) ); ! 79: break; ! 80: ! 81: default: ! 82: fatal1("datas: invalid intermediate tag %d", c); ! 83: } ! 84: } ! 85: } ! 86: ! 87: body(fileadd) ! 88: struct fileblock **fileadd; ! 89: { ! 90: int n1; ! 91: register int n; ! 92: register int c; ! 93: int prevc; ! 94: int ifn; ! 95: ! 96: rewii(fileadd); ! 97: swii(fileadd); ! 98: ! 99: prevc = 0; ! 100: ifn = 0; ! 101: ! 102: for(;;) ! 103: { ! 104: c = getic(&n1); ! 105: n = n1; ! 106: switch(c) ! 107: { ! 108: case ICEOF: ! 109: return; ! 110: ! 111: case ICBEGIN: ! 112: if(n != 0) ! 113: { ! 114: if(prevc) ! 115: p2key(FCONTINUE); ! 116: else prevc = 1; ! 117: p2stmt( stnos[n] ); ! 118: } ! 119: else if(!prevc) p2stmt(0); ! 120: break; ! 121: ! 122: case ICKEYWORD: ! 123: p2key(n); ! 124: if(n != FIF2) ! 125: break; ! 126: getic(&ifn); ! 127: if( indifs[ifn] ) ! 128: skipuntil(ICMARK) ; ! 129: break; ! 130: ! 131: case ICOP: ! 132: p2str( ops[n] ); ! 133: break; ! 134: ! 135: case ICNAME: ! 136: if(*ftnames[n]=='\0') ! 137: fatal1("no name for n=%d", n); ! 138: p2str( ftnames[n] ); ! 139: break; ! 140: ! 141: case ICCOMMENT: ! 142: if(prevc) ! 143: p2key(FCONTINUE); ! 144: p2com(n); ! 145: break; ! 146: ! 147: case ICBLANK: ! 148: putblank(n); ! 149: break; ! 150: ! 151: case ICCONST: ! 152: p2str( getsii(n) ); ! 153: break; ! 154: ! 155: case ICINDPTR: ! 156: n = indifs[n]; ! 157: ! 158: case ICLABEL: ! 159: p2str(" "); ! 160: p2int( stnos[n] ); ! 161: break; ! 162: ! 163: case ICMARK: ! 164: if( indifs[ifn] ) ! 165: { ! 166: p2str(" "); ! 167: p2key(FGOTO); ! 168: p2int( stnos[ indifs[ifn] ] ); ! 169: } ! 170: else ! 171: { ! 172: skipuntil(ICINDENT); ! 173: p2str(" "); ! 174: } ! 175: break; ! 176: ! 177: case ICINDENT: ! 178: indent = n * INDENTSPACES; ! 179: p2indent(indent); ! 180: break; ! 181: ! 182: default: ! 183: sprintf(msg, "Bad pass2 value %o,%o", c,n); ! 184: fatal(msg); ! 185: break; ! 186: } ! 187: if(c!=ICBEGIN && c!=ICINDENT) ! 188: prevc = 0; ! 189: } ! 190: } ! 191: ! 192: putname(p) ! 193: register ptr p; ! 194: { ! 195: register int i; ! 196: ! 197: if(p->vextbase) ! 198: { ! 199: putic(ICNAME, p->vextbase); ! 200: return; ! 201: } ! 202: ! 203: for(i=0 ; i<NFTNTYPES ; ++i) ! 204: if(p->vbase[i]) ! 205: { ! 206: putic(ICNAME, p->vbase[i]); ! 207: return; ! 208: } ! 209: if(strlen(((struct stentry *)p->sthead)->namep) <= XL) ! 210: fatal1("no fortran slot for name %s", ((struct stentry *)p->sthead)->namep); ! 211: } ! 212: ! 213: ! 214: ! 215: putconst(ty, p) ! 216: int ty; ! 217: char *p; ! 218: { ! 219: ptr mkchcon(); ! 220: ! 221: if(ty != TYCHAR) ! 222: putsii(ICCONST,p); ! 223: else /* change character constant to a variable */ ! 224: putname( mkchcon(p) ); ! 225: } ! 226: ! 227: ! 228: putzcon(p) ! 229: register ptr p; ! 230: { ! 231: char buff[100]; ! 232: sprintf(buff, "(%s,%s)", p->leftp, p->rightp); ! 233: putsii(ICCONST,buff); ! 234: } ! 235: ! 236: ! 237: ! 238: ! 239: ! 240: ! 241: putcomment() ! 242: { ! 243: register ptr p; ! 244: ! 245: for(p = comments ; p ; p = p->nextp) ! 246: { ! 247: putsii(ICCOMMENT, p->datap); ! 248: cfree(p->datap); ! 249: } ! 250: frchain(&comments); ! 251: } ! 252: ! 253: ! 254: putblank(n) ! 255: int n; ! 256: { ! 257: while(n-- > 0) ! 258: p2putc(' '); ! 259: } ! 260: ! 261: ! 262: ! 263: skipuntil(k) ! 264: int k; ! 265: { ! 266: register int i; ! 267: int n; ! 268: ! 269: while( (i = getic(&n))!=k && i!=ICEOF) ! 270: if(i==ICCOMMENT || i==ICCONST) ! 271: getsii(n); ! 272: } ! 273: ! 274: ! 275: p2int(n) /* put an integer constant in the output */ ! 276: int n; ! 277: { ! 278: p2str( convic(n) ); ! 279: } ! 280: ! 281: ! 282: ! 283: ! 284: p2key(n) /* print a keyword */ ! 285: int n; ! 286: { ! 287: p2str( verb[n] ); ! 288: } ! 289: ! 290: ! 291: ! 292: p2str(s) /* write a character string on the output */ ! 293: char *s; ! 294: { ! 295: int n; ! 296: ! 297: n = strlen(s); ! 298: if(nftnch==LINESPACES-1 && (n==1 || (n==2 && s[1]==' ')) ) ! 299: p2putc(s[0]); ! 300: ! 301: else { ! 302: if( n<=LINESPACES && nftnch+n>LINESPACES-1 ) ! 303: p2line( min(LINESPACES-n , indent+INDENTSPACES) ); ! 304: ! 305: while(*s) ! 306: p2putc(*s++); ! 307: } ! 308: } ! 309: ! 310: ! 311: ! 312: p2stmt(n) /* start a statement with label n */ ! 313: int n; ! 314: { ! 315: if(n > 0) ! 316: fprintf(codefile,"\n%4d ", n); ! 317: else fprintf(codefile,"\n "); ! 318: ! 319: nftnch = 0; ! 320: nftncont = 0; ! 321: } ! 322: ! 323: ! 324: p2com(n) /* copy a comment */ ! 325: int n; ! 326: { ! 327: register int k; ! 328: register char *q; ! 329: ! 330: q = (char *)getsii(n); ! 331: if(q[0] == '%') /* a literal escape line */ ! 332: { ! 333: putc('\n', codefile); ! 334: while(--n > 0) ! 335: putc(*++q, codefile); ! 336: } ! 337: else /* actually a comment line */ ! 338: { ! 339: ++q; ! 340: --n; ! 341: ! 342: do { ! 343: k = (n>71 ? 71 : n); ! 344: fprintf(codefile, "\n"); ! 345: putc( tailor.ftnsys==CRAY ? 'C' : 'c' , codefile); ! 346: while(k-- > 0) ! 347: putc(*q++, codefile); ! 348: n -= 71; ! 349: } ! 350: while(n > 0); ! 351: } ! 352: } ! 353: ! 354: ! 355: ! 356: ! 357: p2flush() ! 358: { ! 359: if(nftnch > 0) ! 360: { ! 361: fprintf(codefile, "\n"); ! 362: nftnch = 0; ! 363: } ! 364: } ! 365: ! 366: ! 367: ! 368: ! 369: p2putc(c) ! 370: char c; ! 371: { ! 372: if(nftnch >= LINESPACES) /* end of line */ ! 373: p2line(0); ! 374: if(tailor.ftnsys == CRAY) ! 375: putc( islower(c) ? toupper(c) : c , codefile); ! 376: else ! 377: putc(c, codefile); ! 378: ++nftnch; ! 379: } ! 380: ! 381: ! 382: ! 383: p2line(in) ! 384: int in; ! 385: { ! 386: register char contchar; ! 387: ! 388: if(++nftncont > 19) ! 389: { ! 390: execerr("too many continuation lines", CNULL); ! 391: contchar = 'X'; ! 392: } ! 393: if(tailor.ftncontnu == 1) ! 394: fprintf(codefile, "\n&"); ! 395: else { /* standard column-6 continuation */ ! 396: if(nftncont < 20) ! 397: contchar = "0123456789ABCDEFGHIJ" [nftncont]; ! 398: fprintf(codefile, "\n %c", contchar); ! 399: } ! 400: ! 401: nftnch = 0; ! 402: if(in > 0) ! 403: p2indent(in); ! 404: } ! 405: ! 406: ! 407: ! 408: p2indent(n) ! 409: register int n; ! 410: { ! 411: while(n-- > 0) ! 412: p2putc(' '); ! 413: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.