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