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