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