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