⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boxgen.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	<stdio.h>#include	"pic.h"#include	"y.tab.h"obj *boxgen(void){	static double prevh = HT;	static double prevw = WID;	/* golden mean, sort of */	int i, at, battr, with;	double ddval, fillval, xwith, ywith;	double h, w, x0, y0, x1, y1;	obj *p, *ppos;	Attr *ap;	h = getfval("boxht");	w = getfval("boxwid");	at = battr = with = 0;	ddval = fillval = xwith = ywith = 0;	for (i = 0; i < nattr; i++) {		ap = &attr[i];		switch (ap->a_type) {		case HEIGHT:			h = ap->a_val.f;			break;		case WIDTH:			w = ap->a_val.f;			break;		case SAME:			h = prevh;			w = prevw;			break;		case WITH:			with = ap->a_val.i;	/* corner */			break;		case AT:			ppos = ap->a_val.o;			curx = ppos->o_x;			cury = ppos->o_y;			at++;			break;		case INVIS:			battr |= INVIS;			break;		case NOEDGE:			battr |= NOEDGEBIT;			break;		case DOT:		case DASH:			battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;			if (ap->a_sub == DEFAULT)				ddval = getfval("dashwid");			else				ddval = ap->a_val.f;			break;		case FILL:			battr |= FILLBIT;			if (ap->a_sub == DEFAULT)				fillval = getfval("fillval");			else				fillval = ap->a_val.f;			break;		case TEXTATTR:			savetext(ap->a_sub, ap->a_val.p);			break;		}	}	if (with) {		switch (with) {		case NORTH:	ywith = -h / 2; break;		case SOUTH:	ywith = h / 2; break;		case EAST:	xwith = -w / 2; break;		case WEST:	xwith = w / 2; break;		case NE:	xwith = -w / 2; ywith = -h / 2; break;		case SE:	xwith = -w / 2; ywith = h / 2; break;		case NW:	xwith = w / 2; ywith = -h / 2; break;		case SW:	xwith = w / 2; ywith = h / 2; break;		}		curx += xwith;		cury += ywith;	}	if (!at) {		if (isright(hvmode))			curx += w / 2;		else if (isleft(hvmode))			curx -= w / 2;		else if (isup(hvmode))			cury += h / 2;		else			cury -= h / 2;	}	x0 = curx - w / 2;	y0 = cury - h / 2;	x1 = curx + w / 2;	y1 = cury + h / 2;	extreme(x0, y0);	extreme(x1, y1);	p = makenode(BOX, 2);	p->o_val[0] = w;	p->o_val[1] = h;	p->o_attr = battr;	p->o_ddval = ddval;	p->o_fillval = fillval;	dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);	if (isright(hvmode))		curx = x1;	else if (isleft(hvmode))		curx = x0;	else if (isup(hvmode))		cury = y1;	else		cury = y0;	prevh = h;	prevw = w;	return(p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -