Annotation of researchv9/jtools/src/Jpic/misc.c, revision 1.1

1.1     ! root        1: #include       <stdio.h>
        !             2: #include       "pic.h"
        !             3: #include       "y.tab.h"
        !             4: 
        !             5: setdir(n)      /* set direction from n */
        !             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: coord getcomp(p, t)    /* return component of a position */
        !            18: struct obj *p;
        !            19: int t;
        !            20: {
        !            21:        switch (t) {
        !            22:        case DOTX:
        !            23:                return(p->o_x);
        !            24:        case DOTY:
        !            25:                return(p->o_y);
        !            26:        case DOTWID:
        !            27:                switch (p->o_type) {
        !            28:                case BOX:
        !            29:                case BLOCK:
        !            30:                        return(p->o_val[0]);
        !            31:                case CIRCLE:
        !            32:                case ELLIPSE:
        !            33:                        return(2 * p->o_val[0]);
        !            34:                case LINE:
        !            35:                case ARROW:
        !            36:                        return(p->o_val[0] - p->o_x);
        !            37:                }
        !            38:        case DOTHT:
        !            39:                switch (p->o_type) {
        !            40:                case BOX:
        !            41:                case BLOCK:
        !            42:                        return(p->o_val[1]);
        !            43:                case CIRCLE:
        !            44:                case ELLIPSE:
        !            45:                        return(2 * p->o_val[1]);
        !            46:                case LINE:
        !            47:                case ARROW:
        !            48:                        return(p->o_val[1] - p->o_y);
        !            49:                }
        !            50:        case DOTRAD:
        !            51:                switch (p->o_type) {
        !            52:                case CIRCLE:
        !            53:                case ELLIPSE:
        !            54:                        return(p->o_val[0]);
        !            55:                }
        !            56:        }
        !            57: }
        !            58: 
        !            59: makeattr(type, val)    /* add attribute type and val */
        !            60: int type;
        !            61: int val;       /* typing probably wrong */
        !            62: {
        !            63:        if (type == 0 && val == 0) {    /* clear table for next stat */
        !            64:                nattr = 0;
        !            65:                return;
        !            66:        }
        !            67:        dprintf("attr %d:  %d %d\n", nattr, type, val);
        !            68:        attr[nattr].a_type = type;
        !            69:        attr[nattr].a_val = val;
        !            70:        nattr++;
        !            71: }
        !            72: 
        !            73: printexpr(n)   /* print expression for debugging */
        !            74: int n;
        !            75: {
        !            76:        dprintf("%d\n", n);
        !            77: }
        !            78: 
        !            79: printpos(p)    /* print position for debugging */
        !            80: struct obj *p;
        !            81: {
        !            82:        dprintf("%d, %d\n", p->o_x, p->o_y);
        !            83: }
        !            84: 
        !            85: char *tostring(s)
        !            86: register char *s;
        !            87: {
        !            88:        register char *p;
        !            89: 
        !            90:        p = malloc(strlen(s)+1);
        !            91:        if (p == NULL) {
        !            92:                yyerror("out of space in tostring on %s", s);
        !            93:                exit(1);
        !            94:        }
        !            95:        strcpy(p, s);
        !            96:        return(p);
        !            97: }
        !            98: 
        !            99: struct obj *makepos(x, y)      /* make a position cell */
        !           100: coord x;
        !           101: coord y;
        !           102: {
        !           103:        struct obj *p;
        !           104: 
        !           105:        p = makenode(PLACE, 0);
        !           106:        p->o_x = x;
        !           107:        p->o_y = y;
        !           108:        return(p);
        !           109: }
        !           110: 
        !           111: float  between;        /* stores fraction from lex analyzer */
        !           112: float  lastfloat;      /* last float seen in lex */
        !           113: 
        !           114: struct obj *makebetween(fract, p1, p2) /* make position between p1 and p2 */
        !           115: int fract;
        !           116: struct obj *p1, *p2;
        !           117: {
        !           118:        struct obj *p;
        !           119: 
        !           120:        dprintf("fraction = %.2f\n", between);
        !           121:        p = makenode(PLACE, 0);
        !           122:        p->o_x = p1->o_x + between * (p2->o_x - p1->o_x) + 0.5;
        !           123:        p->o_y = p1->o_y + between * (p2->o_y - p1->o_y) + 0.5;
        !           124:        return(p);
        !           125: }
        !           126: 
        !           127: struct obj *getpos(p, corner)  /* find position of point */
        !           128: struct obj *p;
        !           129: int corner;
        !           130: {
        !           131:        coord x, y, x1, y1;
        !           132: 
        !           133:        dprintf("getpos %o %d\n", p, corner);
        !           134:        x = p->o_x;
        !           135:        y = p->o_y;
        !           136:        x1 = p->o_val[0];
        !           137:        y1 = p->o_val[1];
        !           138:        switch (p->o_type) {
        !           139:        case PLACE:
        !           140:                break;
        !           141:        case BOX:
        !           142:        case BLOCK:
        !           143:                switch (corner) {
        !           144:                case NORTH:     y += y1 / 2; break;
        !           145:                case SOUTH:     y -= y1 / 2; break;
        !           146:                case EAST:      x += x1 / 2; break;
        !           147:                case WEST:      x -= x1 / 2; break;
        !           148:                case NE:        x += x1 / 2; y += y1 / 2; break;
        !           149:                case SW:        x -= x1 / 2; y -= y1 / 2; break;
        !           150:                case SE:        x += x1 / 2; y -= y1 / 2; break;
        !           151:                case NW:        x -= x1 / 2; y += y1 / 2; break;
        !           152:                case START:
        !           153:                        if (p->o_type == BLOCK)
        !           154:                                return getpos(objlist[p->o_val[2]], START);
        !           155:                case END:
        !           156:                        if (p->o_type == BLOCK)
        !           157:                                return getpos(objlist[p->o_val[3]], END);
        !           158:                }
        !           159:                break;
        !           160:        case CIRCLE:
        !           161:        case ELLIPSE:
        !           162:                switch (corner) {
        !           163:                case NORTH:     y += y1; break;
        !           164:                case SOUTH:     y -= y1; break;
        !           165:                case EAST:      x += x1; break;
        !           166:                case WEST:      x -= x1; break;
        !           167:                case NE:        x += 0.707 * x1; y += 0.707 * y1; break;
        !           168:                case SE:        x += 0.707 * x1; y -= 0.707 * y1; break;
        !           169:                case NW:        x -= 0.707 * x1; y += 0.707 * y1; break;
        !           170:                case SW:        x -= 0.707 * x1; y -= 0.707 * y1; break;
        !           171:                }
        !           172:                break;
        !           173:        case LINE:
        !           174:        case SPLINE:
        !           175:        case ARROW:
        !           176:        case MOVE:
        !           177:                switch (corner) {
        !           178:                case START:     break;  /* already in place */
        !           179:                case END:       x = x1; y = y1; break;
        !           180:                case CENTER:    x = (x+x1)/2; y = (y+y1)/2; break;
        !           181:                case NORTH:     if (y1 > y) { x = x1; y = y1; } break;
        !           182:                case SOUTH:     if (y1 < y) { x = x1; y = y1; } break;
        !           183:                case EAST:      if (x1 > x) { x = x1; y = y1; } break;
        !           184:                case WEST:      if (x1 < x) { x = x1; y = y1; } break;
        !           185:                }
        !           186:                break;
        !           187:        case ARC:
        !           188:                switch (corner) {
        !           189:                case START:
        !           190:                        if (p->o_attr & CW_ARC) {
        !           191:                                x = p->o_val[2]; y = p->o_val[3];
        !           192:                        } else {
        !           193:                                x = x1; y = y1;
        !           194:                        }
        !           195:                        break;
        !           196:                case END:
        !           197:                        if (p->o_attr & CW_ARC) {
        !           198:                                x = x1; y = y1;
        !           199:                        } else {
        !           200:                                x = p->o_val[2]; y = p->o_val[3];
        !           201:                        }
        !           202:                        break;
        !           203:                }
        !           204:                break;
        !           205:        }
        !           206:        dprintf("getpos returns %d %d\n", x, y);
        !           207:        return(makepos(x, y));
        !           208: }
        !           209: 
        !           210: struct obj *gethere(n) /* make a place for curx,cury */
        !           211: {
        !           212:        dprintf("gethere %d %d\n", curx, cury);
        !           213:        return(makepos(curx, cury));
        !           214: }
        !           215: 
        !           216: struct obj *getlast(n, t)      /* find n-th previous occurrence of type t */
        !           217: int n, t;
        !           218: {
        !           219:        int i, k;
        !           220:        struct obj *p;
        !           221: 
        !           222:        k = n;
        !           223:        for (i = nobj-1; i >= 0; i--) {
        !           224:                p = objlist[i];
        !           225:                if (p->o_type == BLOCKEND) {
        !           226:                        i = p->o_val[4];
        !           227:                        continue;
        !           228:                }
        !           229:                if (p->o_type != t)
        !           230:                        continue;
        !           231:                if (--k > 0)
        !           232:                        continue;       /* not there yet */
        !           233:                dprintf("got a last of x,y= %d,%d\n", p->o_x, p->o_y);
        !           234:                return(p);
        !           235:        }
        !           236:        yyerror("there is no %dth last", n);
        !           237:        return(NULL);
        !           238: }
        !           239: 
        !           240: struct obj *getfirst(n, t)     /* find n-th occurrence of type t */
        !           241: int n, t;
        !           242: {
        !           243:        int i, k;
        !           244:        struct obj *p;
        !           245: 
        !           246:        k = n;
        !           247:        for (i = 0; i < nobj; i++) {
        !           248:                p = objlist[i];
        !           249:                if (p->o_type == BLOCK && t != BLOCK) { /* skip whole block */
        !           250:                        i = p->o_val[5] + 1;
        !           251:                        continue;
        !           252:                }
        !           253:                if (p->o_type != t)
        !           254:                        continue;
        !           255:                if (--k > 0)
        !           256:                        continue;       /* not there yet */
        !           257:                dprintf("got a first of x,y= %d,%d\n", p->o_x, p->o_y);
        !           258:                return(p);
        !           259:        }
        !           260:        yyerror("there is no %dth ", n);
        !           261:        return(NULL);
        !           262: }
        !           263: 
        !           264: struct obj *getblock(p, s)     /* find variable s in block p */
        !           265: struct obj *p;
        !           266: char *s;
        !           267: {
        !           268:        struct symtab *stp;
        !           269: 
        !           270:        if (p->o_type != BLOCK) {
        !           271:                yyerror(".%s is not in that block", s);
        !           272:                return(NULL);
        !           273:        }
        !           274:        for (stp = (struct symtab *) p->o_val[6]; stp != NULL; stp = stp->s_next)
        !           275:                if (strcmp(s, stp->s_name) == 0) {
        !           276:                        dprintf("getblock found x,y= %d,%d\n",
        !           277:                                stp->s_val->o_x, stp->s_val->o_y);
        !           278:                        return((struct obj *)stp->s_val);
        !           279:                }
        !           280:        yyerror("there is no .%s in that []", s);
        !           281:        return(NULL);
        !           282: }
        !           283: 
        !           284: struct obj *fixpos(p, x, y)
        !           285: struct obj *p;
        !           286: coord x, y;
        !           287: {
        !           288:        dprintf("fixpos returns %d %d\n", p->o_x + x, p->o_y + y);
        !           289:        return(makepos(p->o_x + x, p->o_y + y));
        !           290: }
        !           291: 
        !           292: struct obj *makenode(type, n)
        !           293: int type, n;
        !           294: {
        !           295:        struct obj *p;
        !           296: 
        !           297:        p = (struct obj *) malloc(sizeof(struct obj) + (n-1)*sizeof(coord));
        !           298:        if (p == NULL) {
        !           299:                yyerror("out of space in makenode\n");
        !           300:                exit(1);
        !           301:        }
        !           302:        p->o_type = type;
        !           303:        p->o_count = n;
        !           304:        p->o_nobj = nobj;
        !           305:        p->o_mode = hvmode;
        !           306:        p->o_x = curx;
        !           307:        p->o_y = cury;
        !           308:        p->o_nt1 = ntext1;
        !           309:        p->o_nt2 = ntext;
        !           310:        ntext1 = ntext; /* ready for next caller */
        !           311:        p->o_attr = p->o_dotdash = p->o_ddval = 0;
        !           312:        if (nobj >= MAXOBJ) {
        !           313:                yyerror("objlist overflow\n");
        !           314:                exit(1);
        !           315:        }
        !           316:        objlist[nobj++] = p;
        !           317:        return(p);
        !           318: }
        !           319: 
        !           320: extreme(x, y)  /* record max and min x and y values */
        !           321: {
        !           322:        if (x > xmax)
        !           323:                xmax = x;
        !           324:        if (y > ymax)
        !           325:                ymax = y;
        !           326:        if (x < xmin)
        !           327:                xmin = x;
        !           328:        if (y < ymin)
        !           329:                ymin = y;
        !           330: }

unix.superglobalmegacorp.com

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