#include        <stdio.h>
#include        "pic.h"
#include        "y.tab.h"

obj *movegen(void)
{
       static double prevdx, prevdy;
       int i, some;
       double defx, defy, dx, dy;
       obj *p;
       obj *ppos;
       static int xtab[] = { 1, 0, -1, 0 };    /* R=0, U=1, L=2, D=3 */
       static int ytab[] = { 0, 1, 0, -1 };
       Attr *ap;

       defx = getfval("movewid");
       defy = getfval("moveht");
       dx = dy = some = 0;
       for (i = 0; i < nattr; i++) {
               ap = &attr[i];
               switch (ap->a_type) {
               case TEXTATTR:
                       savetext(ap->a_sub, ap->a_val.p);
                       break;
               case SAME:
                       dx = prevdx;
                       dy = prevdy;
                       some++;
                       break;
               case LEFT:
                       dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
                       some++;
                       hvmode = L_DIR;
                       break;
               case RIGHT:
                       dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
                       some++;
                       hvmode = R_DIR;
                       break;
               case UP:
                       dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
                       some++;
                       hvmode = U_DIR;
                       break;
               case DOWN:
                       dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
                       some++;
                       hvmode = D_DIR;
                       break;
               case TO:
                       ppos = ap->a_val.o;
                       dx = ppos->o_x - curx;
                       dy = ppos->o_y - cury;
                       some++;
                       break;
               case BY:
                       ppos = ap->a_val.o;
                       dx = ppos->o_x;
                       dy = ppos->o_y;
                       some++;
                       break;
               case FROM:
               case AT:
                       ppos = ap->a_val.o;
                       curx = ppos->o_x;
                       cury = ppos->o_y;
                       break;
               }
       }
       if (some) {
               defx = dx;
               defy = dy;
       } else {
               defx *= xtab[hvmode];
               defy *= ytab[hvmode];
       }
       prevdx = defx;
       prevdy = defy;
       extreme(curx, cury);
       curx += defx;
       cury += defy;
       extreme(curx, cury);
       p = makenode(MOVE, 0);
       dprintf("M %g %g\n", curx, cury);
       return(p);
}