Blame


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