#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); | |
} |