xref: /plan9-contrib/sys/src/cmd/troff/n6.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
13e12c5d1SDavid du Colombier #include "tdef.h"
23e12c5d1SDavid du Colombier #include "ext.h"
33e12c5d1SDavid du Colombier #include "fns.h"
43e12c5d1SDavid du Colombier #include <ctype.h>
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier /*
73e12c5d1SDavid du Colombier  * n6.c -- width functions, sizes and fonts
83e12c5d1SDavid du Colombier */
93e12c5d1SDavid du Colombier 
n_width(Tchar j)103e12c5d1SDavid du Colombier n_width(Tchar j)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	int i, k;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier 	if (iszbit(j))
153e12c5d1SDavid du Colombier 		return 0;
163e12c5d1SDavid du Colombier 	if (ismot(j)) {
173e12c5d1SDavid du Colombier 		if (isvmot(j))
183e12c5d1SDavid du Colombier 			return(0);
193e12c5d1SDavid du Colombier 		k = absmot(j);
203e12c5d1SDavid du Colombier 		if (isnmot(j))
213e12c5d1SDavid du Colombier 			k = -k;
223e12c5d1SDavid du Colombier 		return(k);
233e12c5d1SDavid du Colombier 	}
243e12c5d1SDavid du Colombier 	i = cbits(j);
253e12c5d1SDavid du Colombier 	if (i < ' ') {
263e12c5d1SDavid du Colombier 		if (i == '\b')
273e12c5d1SDavid du Colombier 			return(-widthp);
283e12c5d1SDavid du Colombier 		if (i == PRESC)
293e12c5d1SDavid du Colombier 			i = eschar;
303e12c5d1SDavid du Colombier 		else if (i == HX)
313e12c5d1SDavid du Colombier 			return(0);
323e12c5d1SDavid du Colombier 	}
333e12c5d1SDavid du Colombier 	if (i == ohc)
343e12c5d1SDavid du Colombier 		return(0);
353e12c5d1SDavid du Colombier 	i = trtab[i];
363e12c5d1SDavid du Colombier 	if (i < ' ')
373e12c5d1SDavid du Colombier 		return(0);
383e12c5d1SDavid du Colombier 	if (i >= t.tfont.nchars)	/* not on the font */
393e12c5d1SDavid du Colombier 		k = t.Char;		/* really ought to check properly */
403e12c5d1SDavid du Colombier 	else
413e12c5d1SDavid du Colombier 		k = t.tfont.wp[i].wid * t.Char;
423e12c5d1SDavid du Colombier 	widthp = k;
433e12c5d1SDavid du Colombier 	return(k);
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 
n_setch(int c)473e12c5d1SDavid du Colombier Tchar n_setch(int c)
483e12c5d1SDavid du Colombier {
493e12c5d1SDavid du Colombier 	return t_setch(c);
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier 
n_setabs(void)52219b2ee8SDavid du Colombier Tchar n_setabs(void)	/* set absolute char from \N'...' */
533e12c5d1SDavid du Colombier {			/* for now, a no-op */
543e12c5d1SDavid du Colombier 	return t_setabs();
553e12c5d1SDavid du Colombier }
563e12c5d1SDavid du Colombier 
n_findft(int i)573e12c5d1SDavid du Colombier int n_findft(int i)
583e12c5d1SDavid du Colombier {
593e12c5d1SDavid du Colombier 	int k;
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier 	if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
623e12c5d1SDavid du Colombier 		return(k);
633e12c5d1SDavid du Colombier 	for (k = 0; fontlab[k] != i; k++)
643e12c5d1SDavid du Colombier 		if (k > nfonts)
653e12c5d1SDavid du Colombier 			return(-1);
663e12c5d1SDavid du Colombier 	return(k);
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier 
n_mchbits(void)713e12c5d1SDavid du Colombier void n_mchbits(void)
723e12c5d1SDavid du Colombier {
733e12c5d1SDavid du Colombier 	chbits = 0;
743e12c5d1SDavid du Colombier 	setfbits(chbits, font);
753e12c5d1SDavid du Colombier 	sps = width(' ' | chbits);
763e12c5d1SDavid du Colombier }
773e12c5d1SDavid du Colombier 
783e12c5d1SDavid du Colombier 
n_setps(void)793e12c5d1SDavid du Colombier void n_setps(void )
803e12c5d1SDavid du Colombier {
813e12c5d1SDavid du Colombier 	int i, j;
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier 	i = cbits(getch());
843e12c5d1SDavid du Colombier 	if (isdigit(i)) {		/* \sd or \sdd */
853e12c5d1SDavid du Colombier 		i -= '0';
86*14f51593SDavid du Colombier 		if (i == 0) {		/* \s0 */
873e12c5d1SDavid du Colombier 			;
88*14f51593SDavid du Colombier 		} else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) {	/* \sdd */
893e12c5d1SDavid du Colombier 			ch = 0;
903e12c5d1SDavid du Colombier 		}
913e12c5d1SDavid du Colombier 	} else if (i == '(') {		/* \s(dd */
923e12c5d1SDavid du Colombier 		getch();
933e12c5d1SDavid du Colombier 		getch();
943e12c5d1SDavid du Colombier 	} else if (i == '+' || i == '-') {	/* \s+, \s- */
953e12c5d1SDavid du Colombier 		j = cbits(getch());
963e12c5d1SDavid du Colombier 		if (isdigit(j)) {		/* \s+d, \s-d */
973e12c5d1SDavid du Colombier 			;
983e12c5d1SDavid du Colombier 		} else if (j == '(') {		/* \s+(dd, \s-(dd */
993e12c5d1SDavid du Colombier 			getch();
1003e12c5d1SDavid du Colombier 			getch();
1013e12c5d1SDavid du Colombier 		}
1023e12c5d1SDavid du Colombier 	}
1033e12c5d1SDavid du Colombier }
1043e12c5d1SDavid du Colombier 
1053e12c5d1SDavid du Colombier 
n_setht(void)1063e12c5d1SDavid du Colombier Tchar n_setht(void)		/* set character height from \H'...' */
1073e12c5d1SDavid du Colombier {
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 	getch();
1103e12c5d1SDavid du Colombier 	inumb(&apts);
1113e12c5d1SDavid du Colombier 	getch();
1123e12c5d1SDavid du Colombier 	return(0);
1133e12c5d1SDavid du Colombier }
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 
n_setslant(void)1163e12c5d1SDavid du Colombier Tchar n_setslant(void)		/* set slant from \S'...' */
1173e12c5d1SDavid du Colombier {
1183e12c5d1SDavid du Colombier 	int n;
1193e12c5d1SDavid du Colombier 
1203e12c5d1SDavid du Colombier 	getch();
1213e12c5d1SDavid du Colombier 	n = 0;
1223e12c5d1SDavid du Colombier 	n = inumb(&n);
1233e12c5d1SDavid du Colombier 	getch();
1243e12c5d1SDavid du Colombier 	return(0);
1253e12c5d1SDavid du Colombier }
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier 
n_caseft(void)1283e12c5d1SDavid du Colombier void n_caseft(void)
1293e12c5d1SDavid du Colombier {
1303e12c5d1SDavid du Colombier 	skip();
1313e12c5d1SDavid du Colombier 	setfont(1);
1323e12c5d1SDavid du Colombier }
1333e12c5d1SDavid du Colombier 
1343e12c5d1SDavid du Colombier 
n_setfont(int a)1353e12c5d1SDavid du Colombier void n_setfont(int a)
1363e12c5d1SDavid du Colombier {
1373e12c5d1SDavid du Colombier 	int i, j;
1383e12c5d1SDavid du Colombier 
1393e12c5d1SDavid du Colombier 	if (a)
1403e12c5d1SDavid du Colombier 		i = getrq();
1413e12c5d1SDavid du Colombier 	else
1423e12c5d1SDavid du Colombier 		i = getsn();
1433e12c5d1SDavid du Colombier 	if (!i || i == 'P') {
1443e12c5d1SDavid du Colombier 		j = font1;
1453e12c5d1SDavid du Colombier 		goto s0;
1463e12c5d1SDavid du Colombier 	}
1473e12c5d1SDavid du Colombier 	if (i == 'S' || i == '0')
1483e12c5d1SDavid du Colombier 		return;
1493e12c5d1SDavid du Colombier 	if ((j = findft(i)) == -1)
1503e12c5d1SDavid du Colombier 		return;
1513e12c5d1SDavid du Colombier s0:
1523e12c5d1SDavid du Colombier 	font1 = font;
1533e12c5d1SDavid du Colombier 	font = j;
1543e12c5d1SDavid du Colombier 	mchbits();
1553e12c5d1SDavid du Colombier }
1563e12c5d1SDavid du Colombier 
1573e12c5d1SDavid du Colombier 
n_setwd(void)1583e12c5d1SDavid du Colombier void n_setwd(void)
1593e12c5d1SDavid du Colombier {
1603e12c5d1SDavid du Colombier 	int base, wid;
1613e12c5d1SDavid du Colombier 	Tchar i;
1623e12c5d1SDavid du Colombier 	int	delim, emsz, k;
1633e12c5d1SDavid du Colombier 	int	savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
1643e12c5d1SDavid du Colombier 
165219b2ee8SDavid du Colombier 	base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0;
1663e12c5d1SDavid du Colombier 	if (ismot(i = getch()))
1673e12c5d1SDavid du Colombier 		return;
1683e12c5d1SDavid du Colombier 	delim = cbits(i);
169219b2ee8SDavid du Colombier 	savhp = numtabp[HP].val;
170219b2ee8SDavid du Colombier 	numtabp[HP].val = 0;
1713e12c5d1SDavid du Colombier 	savapts = apts;
1723e12c5d1SDavid du Colombier 	savapts1 = apts1;
1733e12c5d1SDavid du Colombier 	savfont = font;
1743e12c5d1SDavid du Colombier 	savfont1 = font1;
1753e12c5d1SDavid du Colombier 	savpts = pts;
1763e12c5d1SDavid du Colombier 	savpts1 = pts1;
1773e12c5d1SDavid du Colombier 	setwdf++;
1783e12c5d1SDavid du Colombier 	while (cbits(i = getch()) != delim && !nlflg) {
1793e12c5d1SDavid du Colombier 		k = width(i);
1803e12c5d1SDavid du Colombier 		wid += k;
181219b2ee8SDavid du Colombier 		numtabp[HP].val += k;
1823e12c5d1SDavid du Colombier 		if (!ismot(i)) {
1833e12c5d1SDavid du Colombier 			emsz = (INCH * pts + 36) / 72;
1843e12c5d1SDavid du Colombier 		} else if (isvmot(i)) {
1853e12c5d1SDavid du Colombier 			k = absmot(i);
1863e12c5d1SDavid du Colombier 			if (isnmot(i))
1873e12c5d1SDavid du Colombier 				k = -k;
1883e12c5d1SDavid du Colombier 			base -= k;
1893e12c5d1SDavid du Colombier 			emsz = 0;
1903e12c5d1SDavid du Colombier 		} else
1913e12c5d1SDavid du Colombier 			continue;
192219b2ee8SDavid du Colombier 		if (base < numtabp[SB].val)
193219b2ee8SDavid du Colombier 			numtabp[SB].val = base;
194219b2ee8SDavid du Colombier 		if ((k = base + emsz) > numtabp[ST].val)
195219b2ee8SDavid du Colombier 			numtabp[ST].val = k;
1963e12c5d1SDavid du Colombier 	}
1973e12c5d1SDavid du Colombier 	setn1(wid, 0, (Tchar) 0);
198219b2ee8SDavid du Colombier 	numtabp[HP].val = savhp;
1993e12c5d1SDavid du Colombier 	apts = savapts;
2003e12c5d1SDavid du Colombier 	apts1 = savapts1;
2013e12c5d1SDavid du Colombier 	font = savfont;
2023e12c5d1SDavid du Colombier 	font1 = savfont1;
2033e12c5d1SDavid du Colombier 	pts = savpts;
2043e12c5d1SDavid du Colombier 	pts1 = savpts1;
2053e12c5d1SDavid du Colombier 	mchbits();
2063e12c5d1SDavid du Colombier 	setwdf = 0;
2073e12c5d1SDavid du Colombier }
2083e12c5d1SDavid du Colombier 
2093e12c5d1SDavid du Colombier 
n_vmot(void)2103e12c5d1SDavid du Colombier Tchar n_vmot(void)
2113e12c5d1SDavid du Colombier {
2123e12c5d1SDavid du Colombier 	dfact = lss;
2133e12c5d1SDavid du Colombier 	vflag++;
2143e12c5d1SDavid du Colombier 	return n_mot();
2153e12c5d1SDavid du Colombier }
2163e12c5d1SDavid du Colombier 
2173e12c5d1SDavid du Colombier 
n_hmot(void)2183e12c5d1SDavid du Colombier Tchar n_hmot(void)
2193e12c5d1SDavid du Colombier {
2203e12c5d1SDavid du Colombier 	dfact = EM;
2213e12c5d1SDavid du Colombier 	return n_mot();
2223e12c5d1SDavid du Colombier }
2233e12c5d1SDavid du Colombier 
2243e12c5d1SDavid du Colombier 
n_mot(void)2253e12c5d1SDavid du Colombier Tchar n_mot(void)
2263e12c5d1SDavid du Colombier {
2273e12c5d1SDavid du Colombier 	int j, n;
2283e12c5d1SDavid du Colombier 	Tchar i;
2293e12c5d1SDavid du Colombier 
2303e12c5d1SDavid du Colombier 	j = HOR;
2313e12c5d1SDavid du Colombier 	getch(); /*eat delim*/
2323e12c5d1SDavid du Colombier 	if (n = atoi0()) {
2333e12c5d1SDavid du Colombier 		if (vflag)
2343e12c5d1SDavid du Colombier 			j = VERT;
2353e12c5d1SDavid du Colombier 		i = makem(quant(n, j));
2363e12c5d1SDavid du Colombier 	} else
2373e12c5d1SDavid du Colombier 		i = 0;
2383e12c5d1SDavid du Colombier 	getch();
2393e12c5d1SDavid du Colombier 	vflag = 0;
2403e12c5d1SDavid du Colombier 	dfact = 1;
2413e12c5d1SDavid du Colombier 	return(i);
2423e12c5d1SDavid du Colombier }
2433e12c5d1SDavid du Colombier 
2443e12c5d1SDavid du Colombier 
n_sethl(int k)2453e12c5d1SDavid du Colombier Tchar n_sethl(int k)
2463e12c5d1SDavid du Colombier {
2473e12c5d1SDavid du Colombier 	int j;
2483e12c5d1SDavid du Colombier 	Tchar i;
2493e12c5d1SDavid du Colombier 
2503e12c5d1SDavid du Colombier 	j = t.Halfline;
2513e12c5d1SDavid du Colombier 	if (k == 'u')
2523e12c5d1SDavid du Colombier 		j = -j;
2533e12c5d1SDavid du Colombier 	else if (k == 'r')
2543e12c5d1SDavid du Colombier 		j = -2 * j;
2553e12c5d1SDavid du Colombier 	vflag++;
2563e12c5d1SDavid du Colombier 	i = makem(j);
2573e12c5d1SDavid du Colombier 	vflag = 0;
2583e12c5d1SDavid du Colombier 	return(i);
2593e12c5d1SDavid du Colombier }
2603e12c5d1SDavid du Colombier 
2613e12c5d1SDavid du Colombier 
n_makem(int i)2623e12c5d1SDavid du Colombier Tchar n_makem(int i)
2633e12c5d1SDavid du Colombier {
2643e12c5d1SDavid du Colombier 	Tchar j;
2653e12c5d1SDavid du Colombier 
2663e12c5d1SDavid du Colombier 	if (i >= 0)
2673e12c5d1SDavid du Colombier 		j = i;
2683e12c5d1SDavid du Colombier 	else
2693e12c5d1SDavid du Colombier 		j = -i;
2703e12c5d1SDavid du Colombier 	j |= MOT;
2713e12c5d1SDavid du Colombier 	if (i < 0)
2723e12c5d1SDavid du Colombier 		j |= NMOT;
2733e12c5d1SDavid du Colombier 	if (vflag)
2743e12c5d1SDavid du Colombier 		j |= VMOT;
2753e12c5d1SDavid du Colombier 	return(j);
2763e12c5d1SDavid du Colombier }
2773e12c5d1SDavid du Colombier 
2783e12c5d1SDavid du Colombier 
n_casefp(void)2793e12c5d1SDavid du Colombier void n_casefp(void)
2803e12c5d1SDavid du Colombier {
2813e12c5d1SDavid du Colombier 	int i, j;
2823e12c5d1SDavid du Colombier 
2833e12c5d1SDavid du Colombier 	skip();
2843e12c5d1SDavid du Colombier 	if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
2853e12c5d1SDavid du Colombier 		return;
2863e12c5d1SDavid du Colombier 	if (skip() || !(j = getrq()))
2873e12c5d1SDavid du Colombier 		return;
2883e12c5d1SDavid du Colombier 	fontlab[i] = j;
2893e12c5d1SDavid du Colombier }
2903e12c5d1SDavid du Colombier 
2913e12c5d1SDavid du Colombier 
2923e12c5d1SDavid du Colombier 
n_casebd(void)2933e12c5d1SDavid du Colombier void n_casebd(void)
2943e12c5d1SDavid du Colombier {
2953e12c5d1SDavid du Colombier 	int i, j, k;
2963e12c5d1SDavid du Colombier 
297*14f51593SDavid du Colombier 	j = k = 0;
2983e12c5d1SDavid du Colombier bd0:
2993e12c5d1SDavid du Colombier 	if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
3003e12c5d1SDavid du Colombier 		if (k)
3013e12c5d1SDavid du Colombier 			goto bd1;
3023e12c5d1SDavid du Colombier 		else
3033e12c5d1SDavid du Colombier 			return;
3043e12c5d1SDavid du Colombier 	}
3053e12c5d1SDavid du Colombier 	if (j == smnt) {
3063e12c5d1SDavid du Colombier 		k = smnt;
3073e12c5d1SDavid du Colombier 		goto bd0;
3083e12c5d1SDavid du Colombier 	}
3093e12c5d1SDavid du Colombier 	if (k) {
3103e12c5d1SDavid du Colombier 		sbold = j;
3113e12c5d1SDavid du Colombier 		j = k;
3123e12c5d1SDavid du Colombier 	}
3133e12c5d1SDavid du Colombier bd1:
3143e12c5d1SDavid du Colombier 	skip();
3153e12c5d1SDavid du Colombier 	noscale++;
3163e12c5d1SDavid du Colombier 	bdtab[j] = atoi0();
3173e12c5d1SDavid du Colombier 	noscale = 0;
3183e12c5d1SDavid du Colombier }
3193e12c5d1SDavid du Colombier 
3203e12c5d1SDavid du Colombier 
n_casevs(void)3213e12c5d1SDavid du Colombier void n_casevs(void)
3223e12c5d1SDavid du Colombier {
3233e12c5d1SDavid du Colombier 	int i;
3243e12c5d1SDavid du Colombier 
3253e12c5d1SDavid du Colombier 	skip();
3263e12c5d1SDavid du Colombier 	vflag++;
3273e12c5d1SDavid du Colombier 	dfact = INCH; /*default scaling is points!*/
3283e12c5d1SDavid du Colombier 	dfactd = 72;
3293e12c5d1SDavid du Colombier 	res = VERT;
3303e12c5d1SDavid du Colombier 	i = inumb(&lss);
3313e12c5d1SDavid du Colombier 	if (nonumb)
3323e12c5d1SDavid du Colombier 		i = lss1;
3333e12c5d1SDavid du Colombier 	if (i < VERT)
3343e12c5d1SDavid du Colombier 		i = VERT;	/* was VERT */
3353e12c5d1SDavid du Colombier 	lss1 = lss;
3363e12c5d1SDavid du Colombier 	lss = i;
3373e12c5d1SDavid du Colombier }
3383e12c5d1SDavid du Colombier 
3393e12c5d1SDavid du Colombier 
3403e12c5d1SDavid du Colombier 
3413e12c5d1SDavid du Colombier 
n_xlss(void)3423e12c5d1SDavid du Colombier Tchar n_xlss(void)
3433e12c5d1SDavid du Colombier {
3443e12c5d1SDavid du Colombier 	/* stores \x'...' into
3453e12c5d1SDavid du Colombier 	/* two successive Tchars.
3463e12c5d1SDavid du Colombier 	/* the first contains HX, the second the value,
3473e12c5d1SDavid du Colombier 	/* encoded as a vertical motion.
3483e12c5d1SDavid du Colombier 	/* decoding is done in n2.c by pchar().
3493e12c5d1SDavid du Colombier 	*/
3503e12c5d1SDavid du Colombier 	int	i;
3513e12c5d1SDavid du Colombier 
3523e12c5d1SDavid du Colombier 	getch();
3533e12c5d1SDavid du Colombier 	dfact = lss;
3543e12c5d1SDavid du Colombier 	i = quant(atoi0(), VERT);
3553e12c5d1SDavid du Colombier 	dfact = 1;
3563e12c5d1SDavid du Colombier 	getch();
3573e12c5d1SDavid du Colombier 	if (i >= 0)
3583e12c5d1SDavid du Colombier 		*pbp++ = MOT | VMOT | i;
3593e12c5d1SDavid du Colombier 	else
3603e12c5d1SDavid du Colombier 		*pbp++ = MOT | VMOT | NMOT | -i;
3613e12c5d1SDavid du Colombier 	return(HX);
3623e12c5d1SDavid du Colombier }
363