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

📄 textgen.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	<stdio.h>#include	"pic.h"#include	"y.tab.h"obj *textgen(void){	int i, sub, nstr, at, with, hset, invis;	double xwith, ywith, h, w, x0, y0, x1, y1;	obj *p, *ppos;	static double prevh = 0;	static double prevw = 0;	Attr *ap;	at = with = nstr = hset = invis = 0;	h = getfval("textht");	w = getfval("textwid");	for (i = 0; i < nattr; i++) {		ap = &attr[i];		switch (ap->a_type) {		case HEIGHT:			h = ap->a_val.f;			hset++;			break;		case WIDTH:			w = ap->a_val.f;			break;		case WITH:			with = ap->a_val.i;			break;		case INVIS:			invis = INVIS;			break;		case AT:			ppos = ap->a_val.o;			curx = ppos->o_x;			cury = ppos->o_y;			at++;			break;		case TEXTATTR:			sub = ap->a_sub;			if (ap->a_val.p == NULL)	/* an isolated modifier */				text[ntext-1].t_type = sub;			else {				savetext(sub, ap->a_val.p);				nstr++;			}			break;		}	}	if (hset == 0)		/* no explicit ht cmd */		h *= nstr;	if (with) {		xwith = ywith = 0.0;		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);	dprintf("Text h %g w %g at %g,%g\n", h, w, curx, cury);	p = makenode(TEXT, 2);	p->o_attr = invis;	p->o_val[0] = w;	p->o_val[1] = h;	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);}obj *troffgen(char *s)	/* save away a string of troff commands */{	savetext(CENTER, s);	/* use the existing text mechanism */	return makenode(TROFF, 0);}void savetext(int t, char *s)	/* record text elements for current object */{	if (ntext >= ntextlist)		text = (Text *) grow((char *) text, "text", ntextlist += 200, sizeof(Text));	text[ntext].t_type = t;	text[ntext].t_val = s;	dprintf("saving %d text %s at %d\n", t, s, ntext);	ntext++;}

⌨️ 快捷键说明

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