Annotation of researchv9/cmd/pic/misc.c, revision 1.1.1.1

1.1       root        1: #include       <stdio.h>
                      2: #include       "pic.h"
                      3: #include       "y.tab.h"
                      4: 
                      5: setdir(n)      /* set direction (hvmode) from LEFT, RIGHT, etc. */
                      6:        int n;
                      7: {
                      8:        switch (n) {
                      9:        case UP:        hvmode = U_DIR; break;
                     10:        case DOWN:      hvmode = D_DIR; break;
                     11:        case LEFT:      hvmode = L_DIR; break;
                     12:        case RIGHT:     hvmode = R_DIR; break;
                     13:        }
                     14:        return(hvmode);
                     15: }
                     16: 
                     17: curdir()       /* convert current dir (hvmode) to RIGHT, LEFT, etc. */
                     18: {
                     19:        switch (hvmode) {
                     20:        case R_DIR:     return RIGHT;
                     21:        case L_DIR:     return LEFT;
                     22:        case U_DIR:     return UP;
                     23:        case D_DIR:     return DOWN;
                     24:        }
                     25:        yyerror("can't happen curdir");
                     26: }
                     27: 
                     28: double getcomp(p, t)   /* return component of a position */
                     29:        obj *p;
                     30:        int t;
                     31: {
                     32:        switch (t) {
                     33:        case DOTX:
                     34:                return p->o_x;
                     35:        case DOTY:
                     36:                return p->o_y;
                     37:        case DOTWID:
                     38:                switch (p->o_type) {
                     39:                case BOX:
                     40:                case BLOCK:
                     41:                case TEXT:
                     42:                        return p->o_val[0];
                     43:                case CIRCLE:
                     44:                case ELLIPSE:
                     45:                        return 2 * p->o_val[0];
                     46:                case LINE:
                     47:                case ARROW:
                     48:                        return p->o_val[0] - p->o_x;
                     49:                }
                     50:        case DOTHT:
                     51:                switch (p->o_type) {
                     52:                case BOX:
                     53:                case BLOCK:
                     54:                case TEXT:
                     55:                        return p->o_val[1];
                     56:                case CIRCLE:
                     57:                case ELLIPSE:
                     58:                        return 2 * p->o_val[1];
                     59:                case LINE:
                     60:                case ARROW:
                     61:                        return p->o_val[1] - p->o_y;
                     62:                }
                     63:        case DOTRAD:
                     64:                switch (p->o_type) {
                     65:                case CIRCLE:
                     66:                case ELLIPSE:
                     67:                        return p->o_val[0];
                     68:                }
                     69:        }
                     70:        yyerror("can't happen getcomp");
                     71: }
                     72: 
                     73: float  exprlist[100];
                     74: int    nexpr   = 0;
                     75: 
                     76: exprsave(f)
                     77:        double f;
                     78: {
                     79:        exprlist[nexpr++] = f;
                     80: }
                     81: 
                     82: char *sprintgen(fmt)
                     83:        char *fmt;
                     84: {
                     85:        char buf[1000];
                     86: 
                     87:        sprintf(buf, fmt, exprlist[0], exprlist[1], exprlist[2], exprlist[3], exprlist[4]);
                     88:        nexpr = 0;
                     89:        free(fmt);
                     90:        return tostring(buf);
                     91: }
                     92: 
                     93: makefattr(type, sub, f)        /* float attr */
                     94:        int type, sub;
                     95:        double f;
                     96: {
                     97:        YYSTYPE val;
                     98:        val.f = f;
                     99:        makeattr(type, sub, val);
                    100: }
                    101: 
                    102: makeoattr(type, o)     /* obj* attr */
                    103:        obj *o;
                    104: {
                    105:        YYSTYPE val;
                    106:        val.o = o;
                    107:        makeattr(type, 0, val);
                    108: }
                    109: 
                    110: makeiattr(type, i)     /* int attr */
                    111:        int i;
                    112: {
                    113:        YYSTYPE val;
                    114:        val.i = i;
                    115:        makeattr(type, 0, val);
                    116: }
                    117: 
                    118: maketattr(sub, p)      /* text attribute: takes two */
                    119:        char *p;
                    120: {
                    121:        YYSTYPE val;
                    122:        val.p = p;
                    123:        makeattr(TEXTATTR, sub, val);
                    124: }
                    125: 
                    126: addtattr(sub)          /* add text attrib to existing item */
                    127: {
                    128:        attr[nattr-1].a_sub |= sub;
                    129: }
                    130: 
                    131: makevattr(p)   /* varname attribute */
                    132:        char *p;
                    133: {
                    134:        YYSTYPE val;
                    135:        val.p = p;
                    136:        makeattr(VARNAME, 0, val);
                    137: }
                    138: 
                    139: makeattr(type, sub, val)       /* add attribute type and val */
                    140:        int type, sub;
                    141:        YYSTYPE val;
                    142: {
                    143:        if (type == 0 && val.i == 0) {  /* clear table for next stat */
                    144:                nattr = 0;
                    145:                return;
                    146:        }
                    147:        if (nattr >= nattrlist)
                    148:                attr = (Attr *) grow((char *)attr, "attr", nattrlist += 100, sizeof(Attr));
                    149:        dprintf("attr %d:  %d %d %d\n", nattr, type, sub, val.i);
                    150:        attr[nattr].a_type = type;
                    151:        attr[nattr].a_sub = sub;
                    152:        attr[nattr].a_val = val;
                    153:        nattr++;
                    154: }
                    155: 
                    156: printexpr(f)   /* print expression for debugging */
                    157:        double f;
                    158: {
                    159:        printf("%g\n", f);
                    160: }
                    161: 
                    162: printpos(p)    /* print position for debugging */
                    163:        obj *p;
                    164: {
                    165:        printf("%g, %g\n", p->o_x, p->o_y);
                    166: }
                    167: 
                    168: char *tostring(s)
                    169:        register char *s;
                    170: {
                    171:        register char *p;
                    172: 
                    173:        p = malloc(strlen(s)+1);
                    174:        if (p == NULL) {
                    175:                yyerror("out of space in tostring on %s", s);
                    176:                exit(1);
                    177:        }
                    178:        strcpy(p, s);
                    179:        return(p);
                    180: }
                    181: 
                    182: obj *makepos(x, y)     /* make a position cell */
                    183:        double x, y;
                    184: {
                    185:        obj *p;
                    186: 
                    187:        p = makenode(PLACE, 0);
                    188:        p->o_x = x;
                    189:        p->o_y = y;
                    190:        return(p);
                    191: }
                    192: 
                    193: obj *makebetween(f, p1, p2)    /* make position between p1 and p2 */
                    194:        double f;
                    195:        obj *p1, *p2;
                    196: {
                    197:        obj *p;
                    198: 
                    199:        dprintf("fraction = %.2f\n", f);
                    200:        p = makenode(PLACE, 0);
                    201:        p->o_x = p1->o_x + f * (p2->o_x - p1->o_x);
                    202:        p->o_y = p1->o_y + f * (p2->o_y - p1->o_y);
                    203:        return(p);
                    204: }
                    205: 
                    206: obj *getpos(p, corner) /* find position of point */
                    207:        obj *p;
                    208:        int corner;
                    209: {
                    210:        float x, y;
                    211: 
                    212:        whatpos(p, corner, &x, &y);
                    213:        return makepos(x, y);
                    214: }
                    215: 
                    216: whatpos(p, corner, px, py)     /* what is the position (no side effect) */
                    217:        obj *p;
                    218:        int corner;
                    219:        float *px, *py;
                    220: {
                    221:        float x, y, x1, y1;
                    222:        extern double sqrt();
                    223: 
                    224:        dprintf("whatpos %o %d %d\n", p, p->o_type, corner);
                    225:        x = p->o_x;
                    226:        y = p->o_y;
                    227:        if (p->o_type != PLACE) {
                    228:                x1 = p->o_val[0];
                    229:                y1 = p->o_val[1];
                    230:        }
                    231:        switch (p->o_type) {
                    232:        case PLACE:
                    233:                break;
                    234:        case BOX:
                    235:        case BLOCK:
                    236:        case TEXT:
                    237:                switch (corner) {
                    238:                case NORTH:     y += y1 / 2; break;
                    239:                case SOUTH:     y -= y1 / 2; break;
                    240:                case EAST:      x += x1 / 2; break;
                    241:                case WEST:      x -= x1 / 2; break;
                    242:                case NE:        x += x1 / 2; y += y1 / 2; break;
                    243:                case SW:        x -= x1 / 2; y -= y1 / 2; break;
                    244:                case SE:        x += x1 / 2; y -= y1 / 2; break;
                    245:                case NW:        x -= x1 / 2; y += y1 / 2; break;
                    246:                case START:
                    247:                        if (p->o_type == BLOCK)
                    248:                                return whatpos(objlist[(int)p->o_val[2]], START, px, py);
                    249:                case END:
                    250:                        if (p->o_type == BLOCK)
                    251:                                return whatpos(objlist[(int)p->o_val[3]], END, px, py);
                    252:                }
                    253:                break;
                    254:        case ARC:
                    255:                switch (corner) {
                    256:                case START:
                    257:                        if (p->o_attr & CW_ARC) {
                    258:                                x = p->o_val[2]; y = p->o_val[3];
                    259:                        } else {
                    260:                                x = x1; y = y1;
                    261:                        }
                    262:                        break;
                    263:                case END:
                    264:                        if (p->o_attr & CW_ARC) {
                    265:                                x = x1; y = y1;
                    266:                        } else {
                    267:                                x = p->o_val[2]; y = p->o_val[3];
                    268:                        }
                    269:                        break;
                    270:                }
                    271:                if (corner == START || corner == END)
                    272:                        break;
                    273:                x1 = y1 = sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y));
                    274:                /* Fall Through! */
                    275:        case CIRCLE:
                    276:        case ELLIPSE:
                    277:                switch (corner) {
                    278:                case NORTH:     y += y1; break;
                    279:                case SOUTH:     y -= y1; break;
                    280:                case EAST:      x += x1; break;
                    281:                case WEST:      x -= x1; break;
                    282:                case NE:        x += 0.707 * x1; y += 0.707 * y1; break;
                    283:                case SE:        x += 0.707 * x1; y -= 0.707 * y1; break;
                    284:                case NW:        x -= 0.707 * x1; y += 0.707 * y1; break;
                    285:                case SW:        x -= 0.707 * x1; y -= 0.707 * y1; break;
                    286:                }
                    287:                break;
                    288:        case LINE:
                    289:        case SPLINE:
                    290:        case ARROW:
                    291:                switch (corner) {
                    292:                case START:     break;  /* already in place */
                    293:                case END:       x = x1; y = y1; break;
                    294:                default: /* change! */
                    295:                case CENTER:    x = (x+x1)/2; y = (y+y1)/2; break;
                    296:                case NORTH:     if (y1 > y) { x = x1; y = y1; } break;
                    297:                case SOUTH:     if (y1 < y) { x = x1; y = y1; } break;
                    298:                case EAST:      if (x1 > x) { x = x1; y = y1; } break;
                    299:                case WEST:      if (x1 < x) { x = x1; y = y1; } break;
                    300:                }
                    301:                break;
                    302:        case MOVE:
                    303:                /* really ought to be same as line... */
                    304:                break;
                    305:        }
                    306:        dprintf("whatpos returns %g %g\n", x, y);
                    307:        *px = x;
                    308:        *py = y;
                    309:        return 1;
                    310: }
                    311: 
                    312: obj *gethere() /* make a place for curx,cury */
                    313: {
                    314:        dprintf("gethere %g %g\n", curx, cury);
                    315:        return(makepos(curx, cury));
                    316: }
                    317: 
                    318: obj *getlast(n, t)     /* find n-th previous occurrence of type t */
                    319:        int n, t;
                    320: {
                    321:        int i, k;
                    322:        obj *p;
                    323: 
                    324:        k = n;
                    325:        for (i = nobj-1; i >= 0; i--) {
                    326:                p = objlist[i];
                    327:                if (p->o_type == BLOCKEND) {
                    328:                        i = p->o_val[4];
                    329:                        continue;
                    330:                }
                    331:                if (p->o_type != t)
                    332:                        continue;
                    333:                if (--k > 0)
                    334:                        continue;       /* not there yet */
                    335:                dprintf("got a last of x,y= %g,%g\n", p->o_x, p->o_y);
                    336:                return(p);
                    337:        }
                    338:        yyerror("there is no %dth last", n);
                    339:        return(NULL);
                    340: }
                    341: 
                    342: obj *getfirst(n, t)    /* find n-th occurrence of type t */
                    343:        int n, t;
                    344: {
                    345:        int i, k;
                    346:        obj *p;
                    347: 
                    348:        k = n;
                    349:        for (i = 0; i < nobj; i++) {
                    350:                p = objlist[i];
                    351:                if (p->o_type == BLOCK && t != BLOCK) { /* skip whole block */
                    352:                        i = p->o_val[5] + 1;
                    353:                        continue;
                    354:                }
                    355:                if (p->o_type != t)
                    356:                        continue;
                    357:                if (--k > 0)
                    358:                        continue;       /* not there yet */
                    359:                dprintf("got a first of x,y= %g,%g\n", p->o_x, p->o_y);
                    360:                return(p);
                    361:        }
                    362:        yyerror("there is no %dth ", n);
                    363:        return(NULL);
                    364: }
                    365: 
                    366: double getblkvar(p, s) /* find variable s2 in block p */
                    367:        obj *p;
                    368:        char *s;
                    369: {
                    370:        YYSTYPE y, getblk();
                    371: 
                    372:        y = getblk(p, s);
                    373:        return y.f;
                    374: }
                    375: 
                    376: obj *getblock(p, s)    /* find variable s in block p */
                    377:        obj *p;
                    378:        char *s;
                    379: {
                    380:        YYSTYPE y, getblk();
                    381: 
                    382:        y = getblk(p, s);
                    383:        return y.o;
                    384: }
                    385: 
                    386: YYSTYPE getblk(p, s)   /* find union type for s in p */
                    387:        obj *p;
                    388:        char *s;
                    389: {
                    390:        static YYSTYPE bug;
                    391:        struct symtab *stp;
                    392: 
                    393:        if (p->o_type != BLOCK) {
                    394:                yyerror(".%s is not in that block", s);
                    395:                return(bug);
                    396:        }
                    397:        for (stp = p->o_symtab; stp != NULL; stp = stp->s_next)
                    398:                if (strcmp(s, stp->s_name) == 0) {
                    399:                        dprintf("getblk %s found x,y= %g,%g\n",
                    400:                                s, (stp->s_val.o)->o_x, (stp->s_val.o)->o_y);
                    401:                        return(stp->s_val);
                    402:                }
                    403:        yyerror("there is no .%s in that []", s);
                    404:        return(bug);
                    405: }
                    406: 
                    407: obj *fixpos(p, x, y)
                    408:        obj *p;
                    409:        double x, y;
                    410: {
                    411:        dprintf("fixpos returns %g %g\n", p->o_x + x, p->o_y + y);
                    412:        return makepos(p->o_x + x, p->o_y + y);
                    413: }
                    414: 
                    415: obj *addpos(p, q)
                    416:        obj *p, *q;
                    417: {
                    418:        dprintf("addpos returns %g %g\n", p->o_x+q->o_x, p->o_y+q->o_y);
                    419:        return makepos(p->o_x+q->o_x, p->o_y+q->o_y);
                    420: }
                    421: 
                    422: obj *subpos(p, q)
                    423:        obj *p, *q;
                    424: {
                    425:        dprintf("subpos returns %g %g\n", p->o_x-q->o_x, p->o_y-q->o_y);
                    426:        return makepos(p->o_x-q->o_x, p->o_y-q->o_y);
                    427: }
                    428: 
                    429: obj *makenode(type, n)
                    430:        int type, n;
                    431: {
                    432:        obj *p;
                    433:        extern char *calloc();
                    434: 
                    435:        p = (obj *) calloc(1, sizeof(obj) + (n-1)*sizeof(float));
                    436:        if (p == NULL) {
                    437:                yyerror("out of space in makenode\n");
                    438:                exit(1);
                    439:        }
                    440:        p->o_type = type;
                    441:        p->o_count = n;
                    442:        p->o_nobj = nobj;
                    443:        p->o_mode = hvmode;
                    444:        p->o_x = curx;
                    445:        p->o_y = cury;
                    446:        p->o_nt1 = ntext1;
                    447:        p->o_nt2 = ntext;
                    448:        ntext1 = ntext; /* ready for next caller */
                    449:        if (nobj >= nobjlist)
                    450:                objlist = (obj **) grow((char *) objlist, "objlist",
                    451:                        nobjlist += 100, sizeof(obj *));
                    452:        objlist[nobj++] = p;
                    453:        return(p);
                    454: }
                    455: 
                    456: extreme(x, y)  /* record max and min x and y values */
                    457:        double x, y;
                    458: {
                    459:        if (x > xmax)
                    460:                xmax = x;
                    461:        if (y > ymax)
                    462:                ymax = y;
                    463:        if (x < xmin)
                    464:                xmin = x;
                    465:        if (y < ymin)
                    466:                ymin = y;
                    467: }

unix.superglobalmegacorp.com

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