Annotation of researchv10no/cmd/ideal/action.c, revision 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.