plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

movegen.c (1566B)


      1 #include	<stdio.h>
      2 #include	"pic.h"
      3 #include	"y.tab.h"
      4 
      5 obj*
      6 movegen(void)
      7 {
      8 	static double prevdx, prevdy;
      9 	int i, some;
     10 	double defx, defy, dx, dy;
     11 	obj *p;
     12 	obj *ppos;
     13 	static int xtab[] = { 1, 0, -1, 0 };	/* R=0, U=1, L=2, D=3 */
     14 	static int ytab[] = { 0, 1, 0, -1 };
     15 	Attr *ap;
     16 
     17 	defx = getfval("movewid");
     18 	defy = getfval("moveht");
     19 	dx = dy = some = 0;
     20 	for (i = 0; i < nattr; i++) {
     21 		ap = &attr[i];
     22 		switch (ap->a_type) {
     23 		case TEXTATTR:
     24 			savetext(ap->a_sub, ap->a_val.p);
     25 			break;
     26 		case SAME:
     27 			dx = prevdx;
     28 			dy = prevdy;
     29 			some++;
     30 			break;
     31 		case LEFT:
     32 			dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
     33 			some++;
     34 			hvmode = L_DIR;
     35 			break;
     36 		case RIGHT:
     37 			dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
     38 			some++;
     39 			hvmode = R_DIR;
     40 			break;
     41 		case UP:
     42 			dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
     43 			some++;
     44 			hvmode = U_DIR;
     45 			break;
     46 		case DOWN:
     47 			dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
     48 			some++;
     49 			hvmode = D_DIR;
     50 			break;
     51 		case TO:
     52 			ppos = ap->a_val.o;
     53 			dx = ppos->o_x - curx;
     54 			dy = ppos->o_y - cury;
     55 			some++;
     56 			break;
     57 		case BY:
     58 			ppos = ap->a_val.o;
     59 			dx = ppos->o_x;
     60 			dy = ppos->o_y;
     61 			some++;
     62 			break;
     63 		case FROM:
     64 		case AT:
     65 			ppos = ap->a_val.o;
     66 			curx = ppos->o_x;
     67 			cury = ppos->o_y;
     68 			break;
     69 		}
     70 	}
     71 	if (some) {
     72 		defx = dx;
     73 		defy = dy;
     74 	} else {
     75 		defx *= xtab[hvmode];
     76 		defy *= ytab[hvmode];
     77 	}
     78 	prevdx = defx;
     79 	prevdy = defy;
     80 	extreme(curx, cury);
     81 	curx += defx;
     82 	cury += defy;
     83 	extreme(curx, cury);
     84 	p = makenode(MOVE, 0);
     85 	dprintf("M %g %g\n", curx, cury);
     86 	return(p);
     87 }