1 /*
2 * Changes by Gunnar Ritter, Freiburg i. Br., Germany, October 2005.
3 *
4 * Derived from Plan 9 v4 /sys/src/cmd/pic/
5 *
6 * Copyright (C) 2003, Lucent Technologies Inc. and others.
7 * All Rights Reserved.
8 *
9 * Distributed under the terms of the Lucent Public License Version 1.02.
10 */
11
12 /* Sccsid @(#)movegen.c 1.2 (gritter) 10/18/05 */
13 #include <stdio.h>
14 #include "pic.h"
15 #include "y.tab.h"
16
movegen(void)17 obj *movegen(void)
18 {
19 static double prevdx, prevdy;
20 int i, some;
21 double defx, defy, dx, dy;
22 obj *p;
23 obj *ppos;
24 static int xtab[] = { 1, 0, -1, 0 }; /* R=0, U=1, L=2, D=3 */
25 static int ytab[] = { 0, 1, 0, -1 };
26 Attr *ap;
27
28 defx = getfval("movewid");
29 defy = getfval("moveht");
30 dx = dy = some = 0;
31 for (i = 0; i < nattr; i++) {
32 ap = &attr[i];
33 switch (ap->a_type) {
34 case TEXTATTR:
35 savetext(ap->a_sub, ap->a_val.p);
36 break;
37 case SAME:
38 dx = prevdx;
39 dy = prevdy;
40 some++;
41 break;
42 case LEFT:
43 dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
44 some++;
45 hvmode = L_DIR;
46 break;
47 case RIGHT:
48 dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
49 some++;
50 hvmode = R_DIR;
51 break;
52 case UP:
53 dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
54 some++;
55 hvmode = U_DIR;
56 break;
57 case DOWN:
58 dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
59 some++;
60 hvmode = D_DIR;
61 break;
62 case TO:
63 ppos = ap->a_val.o;
64 dx = ppos->o_x - curx;
65 dy = ppos->o_y - cury;
66 some++;
67 break;
68 case BY:
69 ppos = ap->a_val.o;
70 dx = ppos->o_x;
71 dy = ppos->o_y;
72 some++;
73 break;
74 case FROM:
75 case AT:
76 ppos = ap->a_val.o;
77 curx = ppos->o_x;
78 cury = ppos->o_y;
79 break;
80 }
81 }
82 if (some) {
83 defx = dx;
84 defy = dy;
85 } else {
86 defx *= xtab[hvmode];
87 defy *= ytab[hvmode];
88 }
89 prevdx = defx;
90 prevdy = defy;
91 extreme(curx, cury);
92 curx += defx;
93 cury += defy;
94 extreme(curx, cury);
95 p = makenode(MOVE, 0);
96 dprintf("M %g %g\n", curx, cury);
97 return(p);
98 }
99