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