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
movegen(type)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