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

📄 n7.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "tdef.h"#include "fns.h"#include "ext.h"#ifdef STRICT	/* not in ANSI or POSIX */#define	isascii(a) ((a) >= 0 && (a) <= 127)#endif#define GETCH gettchTchar	gettch(void);/* * troff7.c *  * text */int	brflg;void tbreak(void){	int pad, k;	Tchar *i, j;	int resol;	int un0 = un;	trap = 0;	if (nb)		return;	if (dip == d && numtabp[NL].val == -1) {		newline(1);		return;	}	if (!nc) {		setnel();		if (!wch)			return;		if (pendw)			getword(1);		movword();	} else if (pendw && !brflg) {		getword(1);		movword();	}	*linep = dip->nls = 0;	if (NROFF && dip == d)		horiz(po);	if (lnmod)		donum();	lastl = ne;	if (brflg != 1) {		totout = 0;	} else if (ad) {		if ((lastl = ll - un) < ne)			lastl = ne;	}	if (admod && ad && (brflg != 2)) {		lastl = ne;		adsp = adrem = 0;		if (admod == 1)			un +=  quant(nel / 2, HOR);		else if (admod == 2)			un += nel;	}	totout++;	brflg = 0;	if (lastl + un > dip->maxl)		dip->maxl = lastl + un;	horiz(un);	if (NROFF) {		if (adrem % t.Adj)			resol = t.Hor; 		else 			resol = t.Adj;	} else		resol = HOR;	lastl = ne + (nwd-1) * adsp + adrem;	for (i = line; nc > 0; ) {		if ((cbits(j = *i++)) == ' ') {			pad = 0;			do {				pad += width(j);				nc--;			} while ((cbits(j = *i++)) == ' ');			i--;			pad += adsp;			--nwd;			if (adrem) {				if (adrem < 0) {					pad -= resol;					adrem += resol;				} else if ((totout & 01) || adrem / resol >= nwd) {					pad += resol;					adrem -= resol;				}			}			pchar((Tchar) WORDSP);			horiz(pad);		} else {			pchar(j);			nc--;		}	}	if (ic) {		if ((k = ll - un0 - lastl + ics) > 0)			horiz(k);		pchar(ic);	}	if (icf)		icf++;	else 		ic = 0;	ne = nwd = 0;	un = in;	setnel();	newline(0);	if (dip != d) {		if (dip->dnl > dip->hnl)			dip->hnl = dip->dnl;	} else {		if (numtabp[NL].val > dip->hnl)			dip->hnl = numtabp[NL].val;	}	for (k = ls - 1; k > 0 && !trap; k--)		newline(0);	spread = 0;}void donum(void){	int i, nw;	int lnv = numtabp[LN].val;	nrbits = nmbits;	nw = width('1' | nrbits);	if (nn) {		nn--;		goto d1;	}	if (lnv % ndf) {		numtabp[LN].val++;d1:		un += nw * (nmwid + nms + ni);		return;	}	i = 0;	do {		/* count digits in numtabp[LN].val */		i++;	} while ((lnv /= 10) > 0);	horiz(nw * (ni + max(nmwid-i, 0)));	nform = 0;	fnumb(numtabp[LN].val, pchar);	un += nw * nms;	numtabp[LN].val++;}void text(void){	Tchar i;	static int spcnt;	nflush++;	numtabp[HP].val = 0;	if ((dip == d) && (numtabp[NL].val == -1)) {		newline(1); 		return;	}	setnel();	if (ce || !fi) {		nofill();		return;	}	if (pendw)		goto t4;	if (pendt)		if (spcnt)			goto t2; 		else 			goto t3;	pendt++;	if (spcnt)		goto t2;	while ((cbits(i = GETCH())) == ' ') {		spcnt++;		numtabp[HP].val += sps;		widthp = sps;	}	if (nlflg) {t1:		nflush = pendt = ch = spcnt = 0;		callsp();		return;	}	ch = i;	if (spcnt) {t2:		tbreak();		if (nc || wch)			goto rtn;		un += spcnt * sps;		spcnt = 0;		setnel();		if (trap)			goto rtn;		if (nlflg)			goto t1;	}t3:	if (spread)		goto t5;	if (pendw || !wch)t4:		if (getword(0))			goto t6;	if (!movword())		goto t3;t5:	if (nlflg)		pendt = 0;	adsp = adrem = 0;	if (ad) {		if (nwd == 1)			adsp = nel; 		else 			adsp = nel / (nwd - 1);		adsp = (adsp / HOR) * HOR;		adrem = nel - adsp*(nwd-1);	}	brflg = 1;	tbreak();	spread = 0;	if (!trap)		goto t3;	if (!nlflg)		goto rtn;t6:	pendt = 0;	ckul();rtn:	nflush = 0;}void nofill(void){	int j;	Tchar i;	if (!pendnf) {		over = 0;		tbreak();		if (trap)			goto rtn;		if (nlflg) {			ch = nflush = 0;			callsp();			return;		}		adsp = adrem = 0;		nwd = 10000;	}	while ((j = (cbits(i = GETCH()))) != '\n') {		if (j == ohc)			continue;		if (j == CONT) {			pendnf++;			nflush = 0;			flushi();			ckul();			return;		}		j = width(i);		widthp = j;		numtabp[HP].val += j;		storeline(i, j);	}	if (ce) {		ce--;		if ((i = quant(nel / 2, HOR)) > 0)			un += i;	}	if (!nc)		storeline((Tchar)FILLER, 0);	brflg = 2;	tbreak();	ckul();rtn:	pendnf = nflush = 0;}void callsp(void){	int i;	if (flss)		i = flss; 	else 		i = lss;	flss = 0;	casesp1(i);}void ckul(void){	if (ul && (--ul == 0)) {		cu = 0;		font = sfont;		mchbits();	}	if (it && --it == 0 && itmac)		control(itmac, 0);}void storeline(Tchar c, int w){	int diff;	if (linep >= line + lnsize - 2) {		lnsize += LNSIZE;		diff = linep - line;		if (( line = (Tchar *)realloc((char *)line, lnsize * sizeof(Tchar))) != NULL) {			if (linep && diff)				linep = line + diff;		} else {			if (over) {				return;			} else {				flusho();				ERROR "Line overflow." WARN;				over++;				*linep++ = LEFTHAND;				w = width(LEFTHAND);				nc++;				c = '\n';			}		}	}	*linep++ = c;	ne += w;	nel -= w;	nc++;}void newline(int a){	int i, j, nlss;	int opn;	if (a)		goto nl1;	if (dip != d) {		j = lss;		pchar1((Tchar)FLSS);		if (flss)			lss = flss;		i = lss + dip->blss;		dip->dnl += i;		pchar1((Tchar)i);		pchar1((Tchar)'\n');		lss = j;		dip->blss = flss = 0;		if (dip->alss) {			pchar1((Tchar)FLSS);			pchar1((Tchar)dip->alss);			pchar1((Tchar)'\n');			dip->dnl += dip->alss;			dip->alss = 0;		}		if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac)			if (control(dip->dimac, 0)) {				trap++; 				dip->ditf++;			}		return;	}	j = lss;	if (flss)		lss = flss;	nlss = dip->alss + dip->blss + lss;	numtabp[NL].val += nlss;	if (TROFF && ascii) {		dip->alss = dip->blss = 0;	}	pchar1((Tchar)'\n');	flss = 0;	lss = j;	if (numtabp[NL].val < pl)		goto nl2;nl1:	ejf = dip->hnl = numtabp[NL].val = 0;	ejl = frame;	if (donef) {		if ((!nc && !wch) || ndone)			done1(0);		ndone++;		donef = 0;		if (frame == stk)			nflush++;	}	opn = numtabp[PN].val;	numtabp[PN].val++;	if (npnflg) {		numtabp[PN].val = npn;		npn = npnflg = 0;	}nlpn:	if (numtabp[PN].val == pfrom) {		print++;		pfrom = -1;	} else if (opn == pto) {		print = 0;		opn = -1;		chkpn();		goto nlpn;	}	if (print)		ptpage(numtabp[PN].val);	/* supposedly in a clean state so can pause */	if (stop && print) {		dpn++;		if (dpn >= stop) {			dpn = 0;			ptpause();		}	}nl2:	trap = 0;	if (numtabp[NL].val == 0) {		if ((j = findn(0)) != NTRAP)			trap = control(mlist[j], 0);	} else if ((i = findt(numtabp[NL].val - nlss)) <= nlss) {		if ((j = findn1(numtabp[NL].val - nlss + i)) == NTRAP) {			flusho();			ERROR "Trap botch." WARN;			done2(-5);		}		trap = control(mlist[j], 0);	}}findn1(int a){	int i, j;	for (i = 0; i < NTRAP; i++) {		if (mlist[i]) {			if ((j = nlist[i]) < 0)				j += pl;			if (j == a)				break;		}	}	return(i);}void chkpn(void){	pto = *(pnp++);	pfrom = pto>=0 ? pto : -pto;	if (pto == -INT_MAX) {		flusho();		done1(0);	}	if (pto < 0) {		pto = -pto;		print++;		pfrom = 0;	}}findt(int a){	int i, j, k;	k = INT_MAX;	if (dip != d) {		if (dip->dimac && (i = dip->ditrap - a) > 0)			k = i;		return(k);	}	for (i = 0; i < NTRAP; i++) {		if (mlist[i]) {			if ((j = nlist[i]) < 0)				j += pl;			if ((j -= a) <= 0)				continue;			if (j < k)				k = j;		}	}	i = pl - a;	if (k > i)		k = i;	return(k);}findt1(void){	int i;	if (dip != d)		i = dip->dnl;	else 		i = numtabp[NL].val;	return(findt(i));}void eject(Stack *a){	int savlss;	if (dip != d)		return;	ejf++;	if (a)		ejl = a;	else 		ejl = frame;	if (trap)		return;e1:	savlss = lss;	lss = findt(numtabp[NL].val);	newline(0);	lss = savlss;	if (numtabp[NL].val && !trap)		goto e1;}movword(void){	int w;	Tchar i, *wp;	int savwch, hys;	over = 0;	wp = wordp;	if (!nwd) {		while (cbits(*wp++) == ' ') {			wch--;			wne -= sps;		}		wp--;	}	if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) &&	   (!(hyf & 02) || (findt1() > lss)))		hyphen(wp);	savwch = wch;	hyp = hyptr;	nhyp = 0;	while (*hyp && *hyp <= wp)		hyp++;	while (wch) {		if (hyoff != 1 && *hyp == wp) {			hyp++;			if (!wdstart || (wp > wdstart + 1 && wp < wdend &&			   (!(hyf & 04) || wp < wdend - 1) &&		/* 04 => last 2 */			   (!(hyf & 010) || wp > wdstart + 2))) {	/* 010 => 1st 2 */				nhyp++;				storeline((Tchar)IMP, 0);			}		}		i = *wp++;		w = width(i);		wne -= w;		wch--;		storeline(i, w);	}	if (nel >= 0) {		nwd++;		return(0);	/* line didn't fill up */	}	if (TROFF)		xbits((Tchar)HYPHEN, 1);	hys = width((Tchar)HYPHEN);m1:	if (!nhyp) {		if (!nwd)			goto m3;		if (wch == savwch)			goto m4;	}	if (*--linep != IMP)		goto m5;	if (!(--nhyp))		if (!nwd)			goto m2;	if (nel < hys) {		nc--;		goto m1;	}m2:	if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) {		*linep = (*(linep - 1) & SFMASK) | HYPHEN;		w = width(*linep);		nel -= w;		ne += w;		linep++;	}m3:	nwd++;m4:	wordp = wp;	return(1);	/* line filled up */m5:	nc--;	w = width(*linep);	ne -= w;	nel += w;	wne += w;	wch++;	wp--;	goto m1;}void horiz(int i){	vflag = 0;	if (i)		pchar(makem(i));}void setnel(void){	if (!nc) {		linep = line;		if (un1 >= 0) {			un = un1;			un1 = -1;		}		nel = ll - un;		ne = adsp = adrem = 0;	}}getword(int x){	int j, k;	Tchar i, *wp;	int noword;	int obits;	noword = 0;	if (x)		if (pendw) {			*pendw = 0;			goto rtn;		}	if (wordp = pendw)		goto g1;	hyp = hyptr;	wordp = word;	over = wne = wch = 0;	hyoff = 0;	obits = chbits;	while (1) {	/* picks up 1st char of word */		j = cbits(i = GETCH());		if (j == '\n') {			wne = wch = 0;			noword = 1;			goto rtn;		}		if (j == ohc) {			hyoff = 1;	/* 1 => don't hyphenate */			continue;		}		if (j == ' ') {			numtabp[HP].val += sps;			widthp = sps;			storeword(i, sps);			continue;		}		break;	}	storeword(' ' | obits, sps);	if (spflg) {		storeword(' ' | obits, sps);		spflg = 0;	}g0:	if (j == CONT) {		pendw = wordp;		nflush = 0;		flushi();		return(1);	}	if (hyoff != 1) {		if (j == ohc) {			hyoff = 2;			*hyp++ = wordp;			if (hyp > hyptr + NHYP - 1)				hyp = hyptr + NHYP - 1;			goto g1;		}		if (((j == '-' || j == EMDASH)) && !(i & ZBIT))	/* zbit avoids \X */			if (wordp > word + 1) {				hyoff = 2;				*hyp++ = wordp + 1;				if (hyp > hyptr + NHYP - 1)					hyp = hyptr + NHYP - 1;			}	}	j = width(i);	numtabp[HP].val += j;	storeword(i, j);g1:	j = cbits(i = GETCH());	if (j != ' ') {		static char *sentchar = ".?!";	/* sentence terminators */		if (j != '\n')			goto g0;		wp = wordp-1;	/* handle extra space at end of sentence */		while (wp >= word) {			j = cbits(*wp--);			if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER)				continue;			for (k = 0; sentchar[k]; k++)				if (j == sentchar[k]) {					spflg++;					break;				}			break;		}	}	*wordp = 0;	numtabp[HP].val += sps;rtn:	for (wp = word; *wp; wp++) {		if (ismot(j))			break;	/* drechsler */		j = cbits(*wp);		if (j == ' ')			continue;		if (!(isascii(j) && isdigit(j)) && j != '-')			break;	}	if (*wp == 0)	/* all numbers, so don't hyphenate */		hyoff = 1;	wdstart = 0;	wordp = word;	pendw = 0;	*hyp++ = 0;	setnel();	return(noword);}void storeword(Tchar c, int w){	Tchar *savp;	int i;	if (wordp >= word + wdsize - 2) {		wdsize += WDSIZE;		savp = word;		if (( word = (Tchar *)realloc((char *)word, wdsize * sizeof(Tchar))) != NULL) {			if (wordp)				wordp = word + (wordp - savp);			if (pendw)				pendw = word + (pendw - savp);			if (wdstart)				wdstart = word + (wdstart - savp);			if (wdend)				wdend = word + (wdend - savp);			for (i = 0; i < NHYP; i++)				if (hyptr[i])					hyptr[i] = word + (hyptr[i] - savp);		} else {			if (over) {				return;			} else {				flusho();				ERROR "Word overflow." WARN;				over++;				c = LEFTHAND;				w = width(LEFTHAND);			}		}	}	widthp = w;	wne += w;	*wordp++ = c;	wch++;}Tchar gettch(void){	extern int c_isalnum;	Tchar i;	int j;	if (TROFF)		return getch();	i = getch();	j = cbits(i);	if (ismot(i) || fbits(i) != ulfont)		return(i);	if (cu) {		if (trtab[j] == ' ') {			setcbits(i, '_');			setfbits(i, FT);	/* default */		}		return(i);	}	/* should test here for characters that ought to be underlined */	/* in the old nroff, that was the 200 bit on the width! */	/* for now, just do letters, digits and certain special chars */	if (j <= 127) {		if (!isalnum(j))			setfbits(i, FT);	} else {		if (j < c_isalnum)			setfbits(i, FT);	}	return(i);}

⌨️ 快捷键说明

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