123947Sjaap #ifndef lint
2*24090Sjaap static char sccsid[] = "@(#)movegen.c	3.1 (CWI) 85/07/30";
323947Sjaap #endif lint
4*24090Sjaap 
523947Sjaap #include	<stdio.h>
623947Sjaap #include	"pic.h"
723947Sjaap #include	"y.tab.h"
823947Sjaap 
movegen(type)924017Sjaap obj *movegen(type)
1023947Sjaap {
1123947Sjaap 	static float prevdx, prevdy;
1223947Sjaap 	int i, some;
1323947Sjaap 	float defx, defy, dx, dy;
1424017Sjaap 	obj *p;
1524017Sjaap 	obj *ppos;
1623947Sjaap 	static int xtab[] = { 1, 0, -1, 0 };	/* R=0, U=1, L=2, D=3 */
1723947Sjaap 	static int ytab[] = { 0, 1, 0, -1 };
1824017Sjaap 	Attr *ap;
1923947Sjaap 
2023947Sjaap 	defx = getfval("movewid");
2123947Sjaap 	defy = getfval("moveht");
2223947Sjaap 	dx = dy = some = 0;
2323947Sjaap 	for (i = 0; i < nattr; i++) {
2424017Sjaap 		ap = &attr[i];
2524017Sjaap 		switch (ap->a_type) {
2624017Sjaap 		case TEXTATTR:
2724017Sjaap 			savetext(ap->a_sub, ap->a_val.p);
2823947Sjaap 			break;
2923947Sjaap 		case SAME:
3023947Sjaap 			dx = prevdx;
3123947Sjaap 			dy = prevdy;
3223947Sjaap 			some++;
3323947Sjaap 			break;
3423947Sjaap 		case LEFT:
3524017Sjaap 			dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
3623947Sjaap 			some++;
3723947Sjaap 			hvmode = L_DIR;
3823947Sjaap 			break;
3923947Sjaap 		case RIGHT:
4024017Sjaap 			dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
4123947Sjaap 			some++;
4223947Sjaap 			hvmode = R_DIR;
4323947Sjaap 			break;
4423947Sjaap 		case UP:
4524017Sjaap 			dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
4623947Sjaap 			some++;
4723947Sjaap 			hvmode = U_DIR;
4823947Sjaap 			break;
4923947Sjaap 		case DOWN:
5024017Sjaap 			dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
5123947Sjaap 			some++;
5223947Sjaap 			hvmode = D_DIR;
5323947Sjaap 			break;
5423947Sjaap 		case TO:
5524017Sjaap 			ppos = ap->a_val.o;
5623947Sjaap 			dx = ppos->o_x - curx;
5723947Sjaap 			dy = ppos->o_y - cury;
5823947Sjaap 			some++;
5923947Sjaap 			break;
6023947Sjaap 		case BY:
6124017Sjaap 			ppos = ap->a_val.o;
6223947Sjaap 			dx = ppos->o_x;
6323947Sjaap 			dy = ppos->o_y;
6423947Sjaap 			some++;
6523947Sjaap 			break;
6623947Sjaap 		case FROM:
6723947Sjaap 		case AT:
6824017Sjaap 			ppos = ap->a_val.o;
6923947Sjaap 			curx = ppos->o_x;
7023947Sjaap 			cury = ppos->o_y;
7123947Sjaap 			break;
7223947Sjaap 		}
7323947Sjaap 	}
7423947Sjaap 	if (some) {
7523947Sjaap 		defx = dx;
7623947Sjaap 		defy = dy;
7723947Sjaap 	} else {
7823947Sjaap 		defx *= xtab[hvmode];
7923947Sjaap 		defy *= ytab[hvmode];
8023947Sjaap 	}
8123947Sjaap 	prevdx = defx;
8223947Sjaap 	prevdy = defy;
8323947Sjaap 	extreme(curx, cury);
8423947Sjaap 	curx += defx;
8523947Sjaap 	cury += defy;
8623947Sjaap 	extreme(curx, cury);
8723947Sjaap 	p = makenode(MOVE, 0);
8823947Sjaap 	dprintf("M %g %g\n", curx, cury);
8923947Sjaap 	return(p);
9023947Sjaap }
91