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