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 }