Blame


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