Blame


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