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

1.1       root        1: #include "ideal.h"
                      2: #include "y.tab.h"
                      3: 
                      4: LINEPTR rbuild (noadtree, linelist)
                      5: NOADPTR noadtree;
                      6: LINEPTR linelist;
                      7: {
                      8:        STMTPTR slist[2];
                      9:        STMTPTR curstmt, opqstmt;
                     10:        NOADPTR nextnoad;
                     11:        int i;
                     12:        slist[0] = noadtree->defnode->parm->stmtlist;
                     13:        slist[1] = findbox (noadtree->defnode->parm->name,FALSE)->stmtlist;
                     14:        nextnoad = noadtree->son;
                     15:        if ((opqstmt = nextstmt (OPAQUE, slist[0])) || (opqstmt = nextstmt (OPAQUE, slist[1])))
                     16:                linelist = opqact (opqstmt, noadtree, linelist);
                     17:        if (noadtree->defnode->parm->name == lookup ("circle"))
                     18:                linelist = circact (noadtree, linelist);
                     19:        else if (noadtree->defnode->parm->name == lookup ("arc"))
                     20:                linelist = arcact (noadtree, linelist);
                     21:        for (i = 0; i < 2; i ++)
                     22:        for (curstmt = slist[i]; curstmt; curstmt = curstmt->next) {
                     23:        switch (curstmt->kind) {
                     24:                case '=':
                     25:                        break;
                     26:                case CONN:
                     27:                        linelist = connact (
                     28:                                (EXPRPTR) curstmt->stmt,
                     29:                                noadtree,
                     30:                                linelist
                     31:                        );
                     32:                        break;
                     33:                case USING:
                     34:                        linelist = penact (
                     35:                                (PENPTR) curstmt->stmt,
                     36:                                noadtree,
                     37:                                linelist
                     38:                        );
                     39:                        break;
                     40:                case PUT:
                     41:                        if (((PUTPTR)curstmt->stmt)->p_or_c == PUT)
                     42:                                linelist = rbuild (nextnoad, linelist);
                     43:                        else if (((PUTPTR)curstmt->stmt)->p_or_c == CONSTRUCT)
                     44:                                nextnoad->linelist = rbuild (nextnoad, nextnoad->linelist);
                     45:                        else impossible ("rbuild (PUT)");
                     46:                        nextnoad = nextnoad->brother;
                     47:                        break;
                     48:                         case DRAW:
                     49:                        linelist = drawact (
                     50:                                (MISCPTR) curstmt->stmt,
                     51:                                noadtree,
                     52:                                linelist
                     53:                        );
                     54:                        break;
                     55:                case STRING:
                     56:                        linelist = stract (
                     57:                                (STRPTR) curstmt->stmt,
                     58:                                noadtree,
                     59:                                linelist
                     60:                        );
                     61:                        break;
                     62:                case SPLINE:
                     63:                        linelist = splact (
                     64:                                (EXPRPTR) curstmt->stmt,
                     65:                                noadtree,
                     66:                                linelist
                     67:                        );
                     68:                        break;
                     69:                case OPAQUE:
                     70:                        break;
                     71:                case BDLIST:
                     72:                        break;
                     73:                case VAR:
                     74:                        break;
                     75:                default:
                     76:                        impossible ("rbuild");
                     77:                }
                     78:        }
                     79:        return (linelist);
                     80: }
                     81: 
                     82: LINEPTR build (noadtree, linelist)
                     83: NOADPTR noadtree;
                     84: LINEPTR linelist;
                     85: {
                     86:        LINEPTR retval;
                     87:        if (when_bug & 040) bug_on;
                     88:        retval = rbuild (noadtree, linelist);
                     89:        bug_off;
                     90:        return (retval);
                     91: }
                     92: 
                     93: LINEPTR connact (connstmt, noadtree, linelist)
                     94: EXPRPTR connstmt;
                     95: NOADPTR noadtree;
                     96: LINEPTR linelist;
                     97: {
                     98:        INTLPTR frompt, topt;
                     99:        LINEPTR newline;
                    100:        EXPRPTR linwalk;
                    101:        newline = NULL;
                    102:        frompt = expreval (connstmt->expr, noadtree);
                    103:        linwalk = connstmt->next;
                    104:        while (linwalk) {
                    105:                topt = expreval (linwalk->expr, noadtree);
                    106:                if (!known(frompt) || !known(topt)) {
                    107:                        fprintf (stderr, "ideal: indeterminate endpoints\n   >>>conn ignored\n");
                    108:                } else {
                    109:                        newline = linegen (
                    110:                                Re(frompt), Im(frompt),
                    111:                                Re(topt), Im(topt)
                    112:                        );
                    113:                        dprintf "Adding line (%f,%f) to (%f,%f)\n",
                    114:                                Re(frompt), Im(frompt),
                    115:                                Re(topt), Im(topt)
                    116:                        );
                    117:                        newline->next = linelist;
                    118:                        linelist = newline;
                    119:                }
                    120:                intlfree (frompt);
                    121:                frompt = topt;
                    122:                linwalk = linwalk->next;
                    123:        }
                    124:        intlfree (topt);
                    125:        return (newline);
                    126: }
                    127: 
                    128: LINEPTR penact (penstmt, noadtree, linelist)
                    129: PENPTR penstmt;
                    130: NOADPTR noadtree;
                    131: LINEPTR linelist;
                    132: {
                    133:        INTLPTR frompt, topt, copies;
                    134:        LINEPTR newline;
                    135:        frompt = expreval (penstmt->from, noadtree);
                    136:        topt = expreval (penstmt->to, noadtree);
                    137:        copies = expreval (penstmt->copies, noadtree);
                    138:        newline = linelist;
                    139:        if (!known(frompt) || !known(topt) || !known(copies)) {
                    140:                fprintf (stderr, "ideal: indeterminate pen\n   >>>pen ignored\n");
                    141:        } else {
                    142:                PUTNODE dummyput;
                    143:                NOADPTR pennoad;
                    144:                STMTPTR ostmthead;
                    145:                int i;
                    146: 
                    147:                dprintf "Drawing pen from (%f,%f) to (%f,%f)\n",
                    148:                        Re(frompt),
                    149:                        Im(frompt),
                    150:                        Re(topt),
                    151:                        Im(topt)
                    152:                );
                    153: 
                    154:                /* add key statements to beginning of parameter section */
                    155:                dummyput.name = 0;
                    156:                dummyput.parm = penstmt->pen;
                    157:                ostmthead = dummyput.parm->stmtlist;
                    158:                dummyput.parm->stmtlist = stmtgen (
                    159:                        '=',
                    160:                        (char *) intlgen (
                    161:                                '=',
                    162:                                (EXPR) extlgen (namegen (lookup ("$pencnt"))),
                    163:                                (EXPR) fextlgen (0.0)
                    164:                        )
                    165:                );
                    166:                dummyput.parm->stmtlist->next = stmtgen (
                    167:                        '=',
                    168:                        (char *) intlgen (
                    169:                                '=',
                    170:                                penstmt->start,
                    171:                                bracket (
                    172:                                        (EXPR) intlgen (
                    173:                                                '/',
                    174:                                                (EXPR) extlgen(namegen(lookup("$pencnt"))),
                    175:                                                (EXPR) copies
                    176:                                        ),
                    177:                                        (EXPR) frompt,
                    178:                                        (EXPR) topt
                    179:                                )
                    180:                        )
                    181:                );
                    182:                dummyput.parm->stmtlist->next->next = stmtgen (
                    183:                        '=',
                    184:                        (char *) intlgen (
                    185:                                '=',
                    186:                                penstmt->end,
                    187:                                bracket (
                    188:                                        (EXPR) intlgen (
                    189:                                                '/',
                    190:                                                (EXPR) intlgen (
                    191:                                                        '+',
                    192:                                                        (EXPR) extlgen(namegen(lookup("$pencnt"))),
                    193:                                                        (EXPR) fextlgen(1.0)
                    194:                                                ),
                    195:                                                (EXPR) copies
                    196:                                        ),
                    197:                                        (EXPR) frompt,
                    198:                                        (EXPR) topt
                    199:                                )
                    200:                        )
                    201:                );
                    202:                dummyput.parm->stmtlist->next->next->next = stmtgen (
                    203:                        VAR,
                    204:                        (char *) namegen (lookup ("$pencnt"))
                    205:                );
                    206:                dummyput.parm->stmtlist->next->next->next->next = ostmthead;
                    207:                /* make N copies */
                    208:                for (i = 0; i < Re(copies); i ++) {
                    209:                        ((EXTLPTR) ((INTLPTR) dummyput.parm->stmtlist->stmt)->right)->info.const = i;
                    210:                        pennoad = buildnoadtree (&dummyput);
                    211:                        pennoad->father = noadtree;
                    212:                        eqneval (pennoad);
                    213:                        nl_eval ();
                    214:                        newline = build (pennoad, newline);
                    215:                        depvarkill ();
                    216:                        noadfree (pennoad);
                    217:                }
                    218:        if (dummyput.parm->stmtlist->next->next->next->next != ostmthead)
                    219:                impossible ("penact");
                    220:        dummyput.parm->stmtlist->next->next->next->next = NULL;
                    221:        /* will have to let garbage collector get dummyput.parm */
                    222:        penstmt->pen->stmtlist = ostmthead;
                    223:        }
                    224:        intlfree (frompt);
                    225:        intlfree (topt);
                    226:        intlfree (copies);
                    227:        return (newline);
                    228: }
                    229: 
                    230: LINEPTR drawact (noadname, noadtree, linelist)
                    231: MISCPTR noadname;
                    232: NOADPTR noadtree;
                    233: LINEPTR linelist;
                    234: {
                    235:        NOADPTR noadwalk;
                    236:        LINEPTR nuline;
                    237:        for (noadwalk = noadtree->son;
                    238:                noadwalk && (noadwalk->defnode->name != noadname->info);
                    239:                noadwalk = noadwalk->brother)
                    240:                dprintf "%s %s",
                    241:                        idprint(noadwalk->defnode->name),
                    242:                        idprint(noadname->info)
                    243:                );
                    244:                ;
                    245:        if (noadwalk) {
                    246:                ((LINEPTR) tail ((BOXPTR) noadwalk->linelist))->next = linelist;
                    247:                nuline = noadwalk->linelist;
                    248:                noadwalk->linelist = NULL;
                    249:                return (nuline);
                    250: 
                    251:        } else {
                    252:                fprintf (stderr, "ideal: can't find %s to draw it\n",
                    253:                        idprint (noadname->info)
                    254:                );
                    255:                return (linelist);
                    256:        }
                    257: }
                    258: 
                    259: LINEPTR stract (strstmt, noadtree, linelist)
                    260: STRPTR strstmt;
                    261: NOADPTR noadtree;
                    262: LINEPTR linelist;
                    263: {
                    264:        LINEPTR newline;
                    265:        INTLPTR atpt;
                    266:        atpt = expreval (strstmt->at, noadtree);
                    267:        if (!known(atpt)){
                    268:                fprintf (stderr, "ideal: indeterminate string location\n   >>>string ignored\n");
                    269:                newline = linelist;
                    270:        } else {
                    271:                dprintf "Adding string %s\n",
                    272:                        strstmt->string);
                    273:                newline = textgen (
                    274:                        strstmt->command,
                    275:                        strstmt->string,
                    276:                        Re(atpt),
                    277:                        Im(atpt)
                    278:                );
                    279:                newline->next = linelist;
                    280:        }
                    281:        intlfree (atpt);
                    282:        return (newline);
                    283: }
                    284: 
                    285: LINEPTR circact (noadtree, linelist)
                    286: NOADPTR noadtree;
                    287: LINEPTR linelist;
                    288: {
                    289:        LINEPTR newline;
                    290:        INTLPTR radius, center;
                    291:        radius = varfind (lookup ("radius"), noadtree);
                    292:        center = varfind (lookup ("center"), noadtree);
                    293:        if (!known(radius) || !known(center)) {
                    294:                fprintf (stderr, "ideal: indeterminate circle\n   >>>ignored\n");
                    295:                newline = linelist;
                    296:        } else {
                    297:                float rad;
                    298:                rad = Re(radius);
                    299:                dprintf "Adding circle %f %f %f\n",
                    300:                        Re(center),
                    301:                        Im(center),
                    302:                        rad
                    303:                );
                    304:                newline = circgen (
                    305:                        Re(center),
                    306:                        Im(center),
                    307:                        rad
                    308:                );
                    309:                newline->next = linelist;
                    310:        }
                    311:        intlfree (radius);
                    312:        intlfree (center);
                    313:        return (newline);
                    314: }
                    315: 
                    316: LINEPTR arcact (noadtree, linelist)
                    317: NOADPTR noadtree;
                    318: LINEPTR linelist;
                    319: {
                    320:        LINEPTR newline;
                    321:        INTLPTR start, center, end;
                    322:        INTLPTR temp;
                    323:        float radius;
                    324:        float startang, midang, endang;
                    325:        center = varfind (lookup ("center"), noadtree);
                    326:        start = varfind (lookup ("start"), noadtree);
                    327:        end = varfind (lookup ("end"), noadtree);
                    328:        temp = varfind (lookup ("startang"), noadtree);
                    329:        startang = Re(temp);
                    330:        tryfree(temp);
                    331:        temp = varfind (lookup ("midang"), noadtree);
                    332:        midang = Re(temp);
                    333:        tryfree(temp);
                    334:        temp = varfind (lookup ("endang"), noadtree);
                    335:        endang = Re(temp);
                    336:        tryfree(temp);
                    337:        if (!radflag) {
                    338:                dtor(startang);
                    339:                dtor(midang);
                    340:                dtor(endang);
                    341:        }
                    342:        startang = rprin (startang);
                    343:        midang = rprin (midang);
                    344:        endang = rprin (endang);
                    345:        if ((fabs(startang - midang) < EPSILON) && (startang > endang))
                    346:                endang += 2*PI;
                    347:        radius = ((DEPPTR) (varfind (lookup ("radius"), noadtree))->left)->coeff;
                    348:        if (!known(center) || !known(start) || !known(end)) {
                    349:                fprintf (stderr, "ideal: indeterminate arc\n   >>>ignored\n");
                    350:                newline = linelist;
                    351:        } else {
                    352:                angorder (&startang, midang, &endang);
                    353:                dprintf "Adding arc %f %f %f %f %f\n",
                    354:                        Re(center),
                    355:                        Im(center),
                    356:                        radius,
                    357:                        startang,
                    358:                        endang
                    359:                );
                    360:                newline = angularc (
                    361:                        Re(center),
                    362:                        Im(center),
                    363:                        radius,
                    364:                        startang,
                    365:                        endang
                    366:                );
                    367:                newline->next = linelist;
                    368:        }
                    369:        intlfree (center);
                    370:        intlfree (start);
                    371:        intlfree (end);
                    372:        return (newline);
                    373: }
                    374: 
                    375: LINEPTR splact (splstmt, noadtree, linelist)
                    376: EXPRPTR splstmt;
                    377: NOADPTR noadtree;
                    378: LINEPTR linelist;
                    379: {
                    380:        EXPRNODE knotlist;
                    381:        EXPRPTR knotwalk;
                    382:        EXPRPTR splwalk;
                    383:        LINEPTR nuline;
                    384: 
                    385:        if (when_bug & 0200) bug_on;
                    386:        knotwalk = &knotlist;
                    387:        knotwalk->next = NULL;
                    388:        for (splwalk = splstmt;
                    389:                splwalk;
                    390:                splwalk = splwalk->next
                    391:        ) {
                    392:                knotwalk->next = exprgen (
                    393:                        (EXPR) expreval (
                    394:                                splwalk->expr,
                    395:                                noadtree
                    396:                        )
                    397:                );
                    398:                if (!known(((INTLPTR) knotwalk->next->expr))) {
                    399:                        fprintf (stderr, "ideal: unknown spline knot\n   >>>spline ignored\n");
                    400:                        return (linelist);
                    401:                }
                    402:                knotwalk = knotwalk->next;
                    403:                dprintf "spline knot: %f %f\n",
                    404:                        Re(((INTLPTR) knotwalk->expr)),
                    405:                        Im(((INTLPTR) knotwalk->expr))
                    406:                );
                    407:        }
                    408:        nuline = splgen (knotlist.next);
                    409:        nuline->next = linelist;
                    410:        return (nuline);
                    411: }

unix.superglobalmegacorp.com

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