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