Blob
1 #include <stdio.h>2 #include "pic.h"3 #include "y.tab.h"5 obj*6 movegen(void)7 {8 static double prevdx, prevdy;9 int i, some;10 double defx, defy, dx, dy;11 obj *p;12 obj *ppos;13 static int xtab[] = { 1, 0, -1, 0 }; /* R=0, U=1, L=2, D=3 */14 static int ytab[] = { 0, 1, 0, -1 };15 Attr *ap;17 defx = getfval("movewid");18 defy = getfval("moveht");19 dx = dy = some = 0;20 for (i = 0; i < nattr; i++) {21 ap = &attr[i];22 switch (ap->a_type) {23 case TEXTATTR:24 savetext(ap->a_sub, ap->a_val.p);25 break;26 case SAME:27 dx = prevdx;28 dy = prevdy;29 some++;30 break;31 case LEFT:32 dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;33 some++;34 hvmode = L_DIR;35 break;36 case RIGHT:37 dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;38 some++;39 hvmode = R_DIR;40 break;41 case UP:42 dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;43 some++;44 hvmode = U_DIR;45 break;46 case DOWN:47 dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;48 some++;49 hvmode = D_DIR;50 break;51 case TO:52 ppos = ap->a_val.o;53 dx = ppos->o_x - curx;54 dy = ppos->o_y - cury;55 some++;56 break;57 case BY:58 ppos = ap->a_val.o;59 dx = ppos->o_x;60 dy = ppos->o_y;61 some++;62 break;63 case FROM:64 case AT:65 ppos = ap->a_val.o;66 curx = ppos->o_x;67 cury = ppos->o_y;68 break;69 }70 }71 if (some) {72 defx = dx;73 defy = dy;74 } else {75 defx *= xtab[hvmode];76 defy *= ytab[hvmode];77 }78 prevdx = defx;79 prevdy = defy;80 extreme(curx, cury);81 curx += defx;82 cury += defy;83 extreme(curx, cury);84 p = makenode(MOVE, 0);85 dprintf("M %g %g\n", curx, cury);86 return(p);87 }