1159 lines · 14.3 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. */ /* * troff5.c *  * misc processing requests */ #include "tdef.h"#include "fns.h"#include "ext.h" int	iflist[NIF];int	ifx;int	ifnum = 0;	/* trying numeric expression for .if or .ie condition */ void casead(void){	int i; 	ad = 1;	/* leave admod alone */	if (skip())		return;	switch (i = cbits(getch())) {	case 'r':	/* right adj, left ragged */		admod = 2;		break;	case 'l':	/* left adj, right ragged */		admod = ad = 0;	/* same as casena */		break;	case 'c':	/*centered adj*/		admod = 1;		break;	case 'b': 	case 'n':		admod = 0;		break;	case '0': 	case '2': 	case '4':		ad = 0;	case '1': 	case '3': 	case '5':		admod = (i - '0') / 2;	}}  void casena(void){	ad = 0;}  void casefi(void){	tbreak();	fi = 1;	pendnf = 0;}  void casenf(void){	tbreak();	fi = 0;}  void casers(void){	dip->nls = 0;}  void casens(void){	dip->nls++;}  chget(int c){	Tchar i; 	i = 0;	if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {		ch = i;		return(c);	} else 		return cbits(i);	/* was (i & BYTEMASK) */}  void casecc(void){	cc = chget('.');}  void casec2(void){	c2 = chget('\'');}  void casehc(void){	ohc = chget(OHC);}  void casetc(void){	tabc = chget(0);}  void caselc(void){	dotc = chget(0);}  void casehy(void){	int i; 	hyf = 1;	if (skip())		return;	noscale++;	i = atoi0();	noscale = 0;	if (nonumb)		return;	hyf = max(i, 0);}  void casenh(void){	hyf = 0;}  max(int aa, int bb){	if (aa > bb)		return(aa);	else 		return(bb);}  void casece(void){	int i; 	noscale++;	skip();	i = max(atoi0(), 0);	if (nonumb)		i = 1;	tbreak();	ce = i;	noscale = 0;}  void casein(void){	int i; 	if (skip())		i = in1;	else {		i = max(hnumb(&in), 0);		if (nonumb)			i = in1;	}	tbreak();	in1 = in;	in = i;	if (!nc) {		un = in;		setnel();	}}  void casell(void){	int i; 	if (skip())		i = ll1;	else {		i = max(hnumb(&ll), INCH / 10);		if (nonumb)			i = ll1;	}	ll1 = ll;	ll = i;	setnel();}  void caselt(void){	int i; 	if (skip())		i = lt1;	else {		i = max(hnumb(&lt), 0);		if (nonumb)			i = lt1;	}	lt1 = lt;	lt = i;}  void caseti(void){	int i; 	if (skip())		return;	i = max(hnumb(&in), 0);	tbreak();	un1 = i;	setnel();}  void casels(void){	int i; 	noscale++;	if (skip())		i = ls1;	else {		i = max(inumb(&ls), 1);		if (nonumb)			i = ls1;	}	ls1 = ls;	ls = i;	noscale = 0;}  void casepo(void){	int i; 	if (skip())		i = po1;	else {		i = max(hnumb(&po), 0);		if (nonumb)			i = po1;	}	po1 = po;	po = i;	if (TROFF & !ascii)		esc += po - po1;}  void casepl(void){	int i; 	skip();	if ((i = vnumb(&pl)) == 0)		pl = 11 * INCH; /*11in*/	else 		pl = i;	if (numtabp[NL].val > pl)		numtabp[NL].val = pl;}  void casewh(void){	int i, j, k; 	lgf++;	skip();	i = vnumb((int *)0);	if (nonumb)		return;	skip();	j = getrq();	if ((k = findn(i)) != NTRAP) {		mlist[k] = j;		return;	}	for (k = 0; k < NTRAP; k++)		if (mlist[k] == 0)			break;	if (k == NTRAP) {		flusho();		ERROR "cannot plant trap." WARN;		return;	}	mlist[k] = j;	nlist[k] = i;}  void casech(void){	int i, j, k; 	lgf++;	skip();	if (!(j = getrq()))		return;	else 		for (k = 0; k < NTRAP; k++)			if (mlist[k] == j)				break;	if (k == NTRAP)		return;	skip();	i = vnumb((int *)0);	if (nonumb)		mlist[k] = 0;	nlist[k] = i;}  findn(int i){	int k; 	for (k = 0; k < NTRAP; k++)		if ((nlist[k] == i) && (mlist[k] != 0))			break;	return(k);}  void casepn(void){	int i; 	skip();	noscale++;	i = max(inumb(&numtabp[PN].val), 0);	noscale = 0;	if (!nonumb) {		npn = i;		npnflg++;	}}  void casebp(void){	int i;	Stack *savframe; 	if (dip != d)		return;	savframe = frame;	skip();	if ((i = inumb(&numtabp[PN].val)) < 0)		i = 0;	tbreak();	if (!nonumb) {		npn = i;		npnflg++;	} else if (dip->nls)		return;	eject(savframe);} void casetm(void){	casetm1(0, stderr);}  void casefm(void){	static struct fcache {		char *name;		FILE *fp;	} fcache[15];	int i; 	if ( skip() || !getname()) {		ERROR "fm: missing filename" WARN;		return;	}			for (i = 0; i < 15 && fcache[i].fp != NULL; i++) {		if (strcmp(nextf, fcache[i].name) == 0)			break;	}	if (i >= 15) {		ERROR "fm: too many streams" WARN;		return;	}	if (fcache[i].fp == NULL) {		if( (fcache[i].fp = fopen(nextf, "w")) == NULL) {			ERROR "fm: cannot open %s", nextf WARN;			return;		}		fcache[i].name = strdupl(nextf);	}	casetm1(0, fcache[i].fp);} void casetm1(int ab, FILE *out) {	int i, j, c;	char *p;	char tmbuf[NTM]; 	lgf++;	copyf++;	if (ab) {		if (skip())			ERROR "User Abort" WARN;		else {			extern int error;			int savtrac = trace;			trace = 0;			noscale++;			i = inumb(&trace);			noscale--;			if (i) {				error = i;				if (nlflg || skip())					ERROR "User Abort, exit code %d", i WARN;			}			trace = savtrac;		}	} else		skip();		for (i = 0; i < NTM - 2; ) {		if ((c = cbits(getch())) == '\n' || c == RIGHT)			break;		else if (c == MINUS) {	/* special pleading for strange encodings */			tmbuf[i++] = '\\';			tmbuf[i++] = '-';		} else if (c == PRESC) {			tmbuf[i++] = '\\';			tmbuf[i++] = 'e';		} else if (c == FILLER) {			tmbuf[i++] = '\\';			tmbuf[i++] = '&';		} else if (c == UNPAD) {			tmbuf[i++] = '\\';			tmbuf[i++] = ' ';		} else if (c == OHC) {			tmbuf[i++] = '\\';			tmbuf[i++] = '%';		} else if (c >= ALPHABET) {			p = chname(c);			switch (*p) {			case MBchar:				sprintf(&tmbuf[i], p+1);				break;			case Number:				sprintf(&tmbuf[i], "\\N'%s'", p+1);				break;			case Troffchar:				if (strlen(p+1) == 2)					sprintf(&tmbuf[i], "\\(%s", p+1);				else					sprintf(&tmbuf[i], "\\C'%s'", p+1);				break;			default:				sprintf(&tmbuf[i]," %s? ", p);				break;			}			j = strlen(&tmbuf[i]);			i += j;		} else			tmbuf[i++] = c;	}	tmbuf[i] = 0;	if (ab)	/* truncate output */

Lines 1–500 of 1159.