Annotation of researchv10no/cmd/ideal/util.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.