95 lines · 1.9 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #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);}