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