movegen.c (1566B)
1 #include <stdio.h> 2 #include "pic.h" 3 #include "y.tab.h" 4 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; 16 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 }