Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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