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