|
|
1.1 ! root 1: #include "ideal.h" ! 2: #include "y.tab.h" ! 3: ! 4: #define SYMSIZE 5000 ! 5: ! 6: static char *symtab[SYMSIZE+1] = { ! 7: "(unnamed)" ! 8: }; ! 9: static int syminstal = 1; ! 10: ! 11: int lookup(identifier) ! 12: char *identifier; ! 13: { ! 14: register int i; ! 15: i = 0; ! 16: symtab[syminstal] = identifier; ! 17: while (strcmp(identifier, symtab[i])) ! 18: i++; ! 19: if (i == syminstal) { ! 20: dprintf "installing NAME: %s\n", identifier); ! 21: if (i < SYMSIZE) { ! 22: if (!(symtab[i] = malloc((unsigned) (1+strlen(identifier))))) { ! 23: fprintf(stderr,"ideal: memory overflow in lookup\n"); ! 24: exit(1); ! 25: } ! 26: } ! 27: else { ! 28: fprintf(stderr,"ideal: too many identifiers\n"); ! 29: exit(1); ! 30: } ! 31: strcpy(symtab[syminstal++], identifier); ! 32: } ! 33: return(i); ! 34: } ! 35: ! 36: char *idprint(idnum) ! 37: int idnum; ! 38: { ! 39: if ((idnum > -1) && (idnum < syminstal)) ! 40: return(symtab[idnum]); ! 41: else { ! 42: fprintf(stderr,"ideal: invalid identifier index: %d\n", idnum); ! 43: return(NULL); ! 44: } ! 45: } ! 46: ! 47: extern BOXPTR boxlist; ! 48: ! 49: BOXPTR findbox (sought, alarm) ! 50: int sought, ! 51: alarm; ! 52: { ! 53: BOXPTR bxwalk; ! 54: for (bxwalk = boxlist; ! 55: bxwalk && (bxwalk->name != sought); ! 56: bxwalk = bxwalk->next) ! 57: ; ! 58: if (!bxwalk) { ! 59: if (!alarm) ! 60: fprintf (stderr, "ideal: undefined box: %s\n", idprint (sought)); ! 61: return (boxgen (sought, (STMTPTR) NULL)); ! 62: } else ! 63: return (bxwalk); ! 64: } ! 65: ! 66: ! 67: INTLPTR varfind (name, givennoad) ! 68: int name; ! 69: NOADPTR givennoad; ! 70: { ! 71: /* finds simple variable 'name' from 'givennoad' */ ! 72: register VARPTR varwalk; ! 73: if (!givennoad) { ! 74: fprintf (stderr, "ideal: no such variable, %s\n >>>Returning 0.0\n", ! 75: idprint (name) ! 76: ); ! 77: return (commagen (0.0, 0.0)); ! 78: } ! 79: dprintf "Looking for %s in %s\n", idprint (name), idprint (givennoad->defnode->name)); ! 80: for (varwalk = givennoad->edgevarlist; ! 81: varwalk && THENAME(varwalk) != name; ! 82: varwalk = varwalk->next) ! 83: ; ! 84: if (!varwalk) ! 85: for (varwalk = givennoad->boxvarlist; ! 86: varwalk && THENAME(varwalk) != name; ! 87: varwalk = varwalk->next) ! 88: ; ! 89: if (!varwalk) ! 90: return (varfind (name, givennoad->father)); ! 91: else ! 92: return (intlgen ( ! 93: ';', ! 94: (EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->deplist, 1.0), ! 95: (EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->next->deplist, 1.0) ! 96: )); ! 97: } ! 98: ! 99: INTLPTR pathfind (ptname, givennoad) ! 100: NAMEPTR ptname; ! 101: NOADPTR givennoad; ! 102: { ! 103: /* finds compound variable 'ptname' from 'givennoad' */ ! 104: int i; ! 105: STMTPTR putwalk; ! 106: NOADPTR noadwalk; ! 107: if (!ptname->next) ! 108: return (varfind (ptname->name, givennoad)); ! 109: for (i = 0; i < 2; i++) { ! 110: noadwalk = givennoad->son; ! 111: for (putwalk = nextstmt (PUT, givennoad->defnode->parm->stmtlist); ! 112: putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name; ! 113: putwalk = nextstmt (PUT, putwalk->next)) ! 114: noadwalk = noadwalk->brother; ! 115: if (!putwalk) ! 116: for (putwalk = nextstmt (PUT, findbox (givennoad->defnode->parm->name,FALSE)->stmtlist); ! 117: putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name; ! 118: putwalk = nextstmt (PUT, putwalk->next)) ! 119: noadwalk = noadwalk->brother; ! 120: if (putwalk) { ! 121: dprintf "found %s, now looking for %s\n", ! 122: idprint (ptname->name), ! 123: idprint (ptname->next->name) ! 124: ); ! 125: return (pathfind (ptname->next, noadwalk)); ! 126: } ! 127: if (!(givennoad = givennoad->father)) { ! 128: dprintf "reached root of noad tree\n"); ! 129: break; ! 130: } else { ! 131: dprintf "looking for %s at father of %s\n", ! 132: idprint (ptname->name), ! 133: idprint (givennoad->defnode->name) ! 134: ); ! 135: } ! 136: } ! 137: fprintf (stderr, "ideal: invalid variable path name beginning %s\n >>>Returning 0.0\n", ! 138: idprint (ptname->name)); ! 139: return (commagen (0.0, 0.0)); ! 140: } ! 141: ! 142: BOXPTR tail (head) ! 143: BOXPTR head; ! 144: { ! 145: while (head->next) ! 146: head = head->next; ! 147: return (head); ! 148: } ! 149: ! 150: void forget (sought) ! 151: int sought; ! 152: { ! 153: BOXPTR bxwalk; ! 154: BOXPTR prevbox; ! 155: prevbox = NULL; ! 156: for (bxwalk = boxlist; ! 157: bxwalk && (bxwalk->name != sought); ! 158: bxwalk = bxwalk->next) ! 159: prevbox = bxwalk; ! 160: if (bxwalk) { ! 161: if (prevbox) { ! 162: prevbox->next = bxwalk->next; ! 163: } else { ! 164: boxlist = bxwalk->next; ! 165: } ! 166: boxfree (bxwalk); ! 167: } ! 168: } ! 169: ! 170: void exprprint (exprn) ! 171: EXPR exprn; ! 172: { ! 173: INTLPTR intl; ! 174: EXTLPTR extl; ! 175: if (!exprn) ! 176: return; ! 177: if (((EXTLPTR) exprn)->leaf) { ! 178: extl = (EXTLPTR) exprn; ! 179: switch (extl->kind) { ! 180: case PATH: ! 181: { ! 182: NAMEPTR pathwalk; ! 183: for (pathwalk = extl->info.path; ! 184: pathwalk->next; ! 185: pathwalk = pathwalk->next) ! 186: fprintf (stderr, "%s.", idprint (pathwalk->name)); ! 187: fprintf (stderr, "%s", idprint (pathwalk->name)); ! 188: } ! 189: break; ! 190: case CONST: ! 191: fprintf (stderr, "%f", extl->info.const); ! 192: break; ! 193: } ! 194: } else { ! 195: intl = (INTLPTR) exprn; ! 196: switch (intl->oper) { ! 197: case NAME: ! 198: fprintf (stderr, "%s(", idprint ((int) intl->left)); ! 199: exprprint (((EXPRPTR) intl->right)->expr); ! 200: fprintf (stderr, ")"); ! 201: break; ! 202: case '=': ! 203: case '~': ! 204: exprprint ((EXPR) intl->right); ! 205: break; ! 206: case ',': ! 207: fprintf (stderr, "("); ! 208: exprprint ((EXPR) intl->left); ! 209: fprintf (stderr, ","); ! 210: exprprint ((EXPR) intl->right); ! 211: fprintf (stderr, ")"); ! 212: break; ! 213: case ';': ! 214: fprintf (stderr, "("); ! 215: depprint ((DEPPTR) intl->left); ! 216: fprintf (stderr, ","); ! 217: depprint ((DEPPTR) intl->right); ! 218: fprintf (stderr, ")"); ! 219: break; ! 220: default: ! 221: fprintf (stderr, "("); ! 222: exprprint ((EXPR) intl->left); ! 223: fprintf (stderr, " %c ", intl->oper); ! 224: exprprint ((EXPR) intl->right); ! 225: fprintf (stderr, ")"); ! 226: break; ! 227: } ! 228: } ! 229: } ! 230: ! 231: STMTPTR nextstmt (kind, curstmt) ! 232: int kind; ! 233: STMTPTR curstmt; ! 234: { ! 235: register STMTPTR stmtwalk; ! 236: stmtwalk = curstmt; ! 237: for (stmtwalk; ! 238: stmtwalk && (stmtwalk->kind != kind); ! 239: stmtwalk = stmtwalk->next) ! 240: ; ! 241: return (stmtwalk); ! 242: } ! 243: ! 244: EXPR bracket (alpha, x, y) ! 245: EXPR alpha, ! 246: x, ! 247: y; ! 248: { ! 249: return ( ! 250: (EXPR) intlgen ( ! 251: '+', ! 252: x, ! 253: (EXPR) intlgen ( ! 254: '*', ! 255: alpha, ! 256: (EXPR) intlgen ( ! 257: '-', ! 258: y, ! 259: x ! 260: ) ! 261: ) ! 262: ) ! 263: ); ! 264: } ! 265: ! 266: void depprint (depnd) ! 267: DEPPTR depnd; ! 268: { ! 269: for (depnd; ! 270: depnd->next; ! 271: depnd = depnd->next) ! 272: fprintf (stderr, "%f %s(%s) + ", ! 273: depnd->coeff, ! 274: ISREAL(depnd->var)?"re":"im", ! 275: idprint (THENAME(depnd->var)) ! 276: ); ! 277: fprintf (stderr, "%f", depnd->coeff); ! 278: if (depnd->var) ! 279: fprintf (stderr, " %s(%s)", ! 280: ISREAL(depnd->var)?"re":"im", ! 281: idprint (THENAME(depnd->var)) ! 282: ); ! 283: } ! 284: ! 285: void dexch (a,b) ! 286: double *a; ! 287: double *b; ! 288: { ! 289: double temp; ! 290: temp = *a; ! 291: *a = *b; ! 292: *b = temp; ! 293: } ! 294: ! 295: void fexch (a,b) ! 296: float *a; ! 297: float *b; ! 298: { ! 299: float temp; ! 300: temp = *a; ! 301: *a = *b; ! 302: *b = temp; ! 303: } ! 304: ! 305: float rprin (angle) ! 306: float angle; ! 307: { ! 308: while (angle < 0.0) ! 309: angle += 2*PI; ! 310: while (angle > 2*PI + EPSILON) ! 311: angle -= 2*PI; ! 312: return (angle); ! 313: } ! 314: ! 315: /* ! 316: float dprin (angle) ! 317: float angle; ! 318: { ! 319: while (angle < 0.0) ! 320: angle += 360; ! 321: while (angle > 2*PI) ! 322: angle -= 360; ! 323: return (angle); ! 324: } ! 325: */ ! 326: ! 327: void angorder (startang, midang, endang) ! 328: float *startang; ! 329: float midang; ! 330: float *endang; ! 331: { ! 332: if ( ! 333: ((*endang < -EPSILON + midang) && (midang < -EPSILON + *startang)) ! 334: || ((*startang < -EPSILON + *endang) && (*endang < -EPSILON + midang)) ! 335: || ((midang < -EPSILON + *startang) && (*startang < -EPSILON + *endang)) ! 336: ) ! 337: fexch (startang, endang); ! 338: } ! 339: ! 340: STMTPTR reverse (stmtlist) ! 341: STMTPTR stmtlist; ! 342: { ! 343: STMTPTR curstmt, prevstmt, temp; ! 344: prevstmt = curstmt = stmtlist; ! 345: temp = NULL; ! 346: while (curstmt) { ! 347: curstmt = prevstmt->next; ! 348: prevstmt->next = temp; ! 349: temp = prevstmt; ! 350: prevstmt = curstmt; ! 351: } ! 352: return (temp); ! 353: } ! 354: ! 355: void impossible (msg) ! 356: char *msg; ! 357: { ! 358: fprintf (stderr, "ideal: %s: can't happen\n", msg); ! 359: exit (1); ! 360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.