|
|
1.1 ! root 1: /* ! 2: * Interpret a C intermediate file. ! 3: */ ! 4: #include <stdio.h> ! 5: #include "c1.h" ! 6: ! 7: extern opdope[1]; ! 8: extern char *opntab[1]; ! 9: ! 10: struct table cctab[1], efftab[1], regtab[1], sptab[1]; ! 11: char maprel[1], notrel[1]; ! 12: char *outname(); ! 13: ! 14: main() ! 15: { ! 16: register t, op; ! 17: static char s[9]; ! 18: register char *tp; ! 19: double atof(); ! 20: char numbuf[64]; ! 21: int lbl, cond; ! 22: int sdep; ! 23: ! 24: sdep = 0; ! 25: for (;;) { ! 26: op = getw(stdin); ! 27: if ((op&0177400) != 0177000) { ! 28: error("Intermediate file error"); ! 29: exit(1); ! 30: } ! 31: lbl = 0; ! 32: switch(op &= 0377) { ! 33: ! 34: case SINIT: ! 35: printf("init %d\n", getw(stdin)); ! 36: break; ! 37: ! 38: case EOFC: ! 39: printf("eof\n"); ! 40: exit(0); ! 41: ! 42: case BDATA: ! 43: if (getw(stdin) == 1) { ! 44: printf(".byte "); ! 45: for (;;) { ! 46: printf("%d", getw(stdin)); ! 47: if (getw(stdin) != 1) ! 48: break; ! 49: printf(","); ! 50: } ! 51: printf("\n"); ! 52: } ! 53: break; ! 54: ! 55: case PROG: ! 56: printf("prog\n"); ! 57: break; ! 58: ! 59: case DATA: ! 60: printf("data\n"); ! 61: break; ! 62: ! 63: case BSS: ! 64: printf("bss\n"); ! 65: break; ! 66: ! 67: case SYMDEF: ! 68: printf("symdef "); ! 69: outname(s); ! 70: printf("%s\n", s); ! 71: break; ! 72: ! 73: case RETRN: ! 74: printf("return\n"); ! 75: break; ! 76: ! 77: case CSPACE: ! 78: tp = outname(s); ! 79: printf("comm %s,%d\n", tp, getw(stdin)); ! 80: break; ! 81: ! 82: case SSPACE: ! 83: printf("space %d\n", getw(stdin)); ! 84: break; ! 85: ! 86: case EVEN: ! 87: printf("even\n"); ! 88: break; ! 89: ! 90: case SAVE: ! 91: printf("save\n"); ! 92: break; ! 93: ! 94: case SETSTK: ! 95: t = getw(stdin)-6; ! 96: printf("setstack %d\n", t); ! 97: break; ! 98: ! 99: case PROFIL: ! 100: t = getw(stdin); ! 101: printf("profil %d\n", t); ! 102: break; ! 103: ! 104: case SNAME: ! 105: tp = outname(s); ! 106: printf("sname %s s%d\n", tp, getw(stdin)); ! 107: break; ! 108: ! 109: case ANAME: ! 110: tp = outname(s); ! 111: printf("aname %s a%d\n", tp, getw(stdin)); ! 112: break; ! 113: ! 114: case RNAME: ! 115: tp = outname(s); ! 116: printf("rname %s r%d\n", tp, getw(stdin)); ! 117: break; ! 118: ! 119: case SWIT: ! 120: t = getw(stdin); ! 121: line = getw(stdin); ! 122: printf("switch line %d def %d\n", line, t); ! 123: while (t = getw(stdin)) { ! 124: printf(" %d %d\n", t, getw(stdin)); ! 125: } ! 126: break; ! 127: ! 128: case CBRANCH: ! 129: lbl = getw(stdin); ! 130: cond = getw(stdin); ! 131: case EXPR: ! 132: line = getw(stdin); ! 133: if (sdep != 1) { ! 134: error("Expression input botch"); ! 135: exit(1); ! 136: } ! 137: sdep = 0; ! 138: if (lbl) ! 139: printf("cbranch %d line %d\n", lbl, line); ! 140: else ! 141: printf("expr line %d\n", line); ! 142: break; ! 143: ! 144: case NAME: ! 145: t = getw(stdin); ! 146: if (t==EXTERN) { ! 147: t = getw(stdin); ! 148: printf("name %o, %s\n", t, outname(s)); ! 149: } else if (t==AUTO) { ! 150: t = getw(stdin); ! 151: printf("name %o a%d\n", t, getw(stdin)); ! 152: } else if (t==STATIC) { ! 153: t = getw(stdin); ! 154: printf("name %o s%d\n", t, getw(stdin)); ! 155: } else if (t==REG) { ! 156: t = getw(stdin); ! 157: printf("name %o r%d\n", t, getw(stdin)); ! 158: } else ! 159: printf("name botch\n"); ! 160: sdep++; ! 161: break; ! 162: ! 163: case CON: ! 164: t = getw(stdin); ! 165: printf("const %d %d\n", t, getw(stdin)); ! 166: sdep++; ! 167: break; ! 168: ! 169: case LCON: ! 170: getw(stdin); /* ignore type, assume long */ ! 171: t = getw(stdin); ! 172: op = getw(stdin); ! 173: printf("lconst %D\n", (((long)t<<16) | (unsigned)op)); ! 174: sdep++; ! 175: break; ! 176: ! 177: case FCON: ! 178: t = getw(stdin); ! 179: printf("fcon %s\n", outname(numbuf)); ! 180: sdep++; ! 181: break; ! 182: ! 183: case FSEL: ! 184: printf("fsel %o ", getw(stdin)); ! 185: printf("%d ", getw(stdin)); ! 186: printf("%d\n", getw(stdin)); ! 187: break; ! 188: ! 189: case STRASG: ! 190: t = getw(stdin); ! 191: printf("strasg %o ", getw(stdin)); ! 192: printf("%d\n", getw(stdin)); ! 193: break; ! 194: ! 195: case NULLOP: ! 196: printf("null\n"); ! 197: sdep++; ! 198: break; ! 199: ! 200: case LABEL: ! 201: printf("label %d\n", getw(stdin)); ! 202: break; ! 203: ! 204: case NLABEL: ! 205: tp = outname(s); ! 206: printf("nlabel %s\n", tp); ! 207: break; ! 208: ! 209: case RLABEL: ! 210: tp = outname(s); ! 211: printf("rlabel %s\n", tp); ! 212: break; ! 213: ! 214: case BRANCH: ! 215: printf("branch %d\n", getw(stdin)); ! 216: break; ! 217: ! 218: case SETREG: ! 219: printf("nreg %d\n", getw(stdin)); ! 220: break; ! 221: ! 222: default: ! 223: t = getw(stdin); ! 224: if (op <=0 || op >=120) { ! 225: printf("Unknown op %d\n", op); ! 226: exit(1); ! 227: } ! 228: if (opdope[op]&BINARY) ! 229: sdep--; ! 230: if (sdep<=0) ! 231: printf("Binary expression botch\n"); ! 232: if (opntab[op] == 0) ! 233: printf("op %d %o\n", op, t); ! 234: else ! 235: printf("%s %o\n", opntab[op], t); ! 236: break; ! 237: } ! 238: } ! 239: } ! 240: ! 241: char * ! 242: outname(s) ! 243: char *s; ! 244: { ! 245: register char *p, c; ! 246: register n; ! 247: ! 248: p = s; ! 249: n = 0; ! 250: while (c = getc(stdin)) { ! 251: *p++ = c; ! 252: n++; ! 253: } ! 254: do { ! 255: *p++ = 0; ! 256: } while (n++ < 8); ! 257: return(s); ! 258: } ! 259: ! 260: error(s) ! 261: char *s; ! 262: { ! 263: printf("%s\n", s); ! 264: exit(1); ! 265: } ! 266: ! 267: getw(f) ! 268: FILE *f; ! 269: { ! 270: register x; ! 271: x = getc(f); ! 272: x |= getc(f)<<8; ! 273: return(x); ! 274: } ! 275:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.