1*29779Sjaap #ifndef lint
2*29779Sjaap static char sccsid[]="@(#)n6.c	1.1	(CWI)	86/08/14";
3*29779Sjaap #endif
4*29779Sjaap 
5*29779Sjaap #include "tdef.h"
6*29779Sjaap #include "tw.h"
7*29779Sjaap #include "ext.h"
8*29779Sjaap #include <ctype.h>
9*29779Sjaap 
10*29779Sjaap /*
11*29779Sjaap  * n6.c -- width functions, sizes and fonts
12*29779Sjaap */
13*29779Sjaap 
14*29779Sjaap int	bdtab[NFONT+1] ={ 0, 0, 0, 3, 3, 0, };
15*29779Sjaap int	sbold = 0;
16*29779Sjaap int	fontlab[NFONT+1] = { 0, 'R', 'I', 'B', PAIR('B','I'), 'S', 0 };
17*29779Sjaap 
width(j)18*29779Sjaap width(j)
19*29779Sjaap register tchar j;
20*29779Sjaap {
21*29779Sjaap 	register i, k;
22*29779Sjaap 
23*29779Sjaap 	if (j & (ZBIT|MOT)) {
24*29779Sjaap 		if (iszbit(j))
25*29779Sjaap 			return(0);
26*29779Sjaap 		if (isvmot(j))
27*29779Sjaap 			return(0);
28*29779Sjaap 		k = absmot(j);
29*29779Sjaap 		if (isnmot(j))
30*29779Sjaap 			k = -k;
31*29779Sjaap 		return(k);
32*29779Sjaap 	}
33*29779Sjaap 	i = cbits(j);
34*29779Sjaap 	if (i < ' ') {
35*29779Sjaap 		if (i == '\b')
36*29779Sjaap 			return(-widthp);
37*29779Sjaap 		if (i == PRESC)
38*29779Sjaap 			i = eschar;
39*29779Sjaap 		else if (iscontrol(i))
40*29779Sjaap 			return(0);
41*29779Sjaap 	}
42*29779Sjaap 	if (i==ohc)
43*29779Sjaap 		return(0);
44*29779Sjaap 	i = trtab[i];
45*29779Sjaap 	if (i < 32)
46*29779Sjaap 		return(0);
47*29779Sjaap 	k = t.width[i] * t.Char;
48*29779Sjaap 	widthp = k;
49*29779Sjaap 	return(k);
50*29779Sjaap }
51*29779Sjaap 
52*29779Sjaap 
setch()53*29779Sjaap tchar setch()
54*29779Sjaap {
55*29779Sjaap 	register j;
56*29779Sjaap 	char	temp[10];
57*29779Sjaap 	register char	*s;
58*29779Sjaap 
59*29779Sjaap 	s = temp;
60*29779Sjaap 	if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
61*29779Sjaap 		return(0);
62*29779Sjaap 	*s = '\0';
63*29779Sjaap 	if ((j = findch(temp)) > 0)
64*29779Sjaap 		return j | chbits;
65*29779Sjaap 	else
66*29779Sjaap 		return 0;
67*29779Sjaap }
68*29779Sjaap 
setabs()69*29779Sjaap tchar setabs()		/* set absolute char from \C'...' */
70*29779Sjaap {			/* for now, a no-op */
71*29779Sjaap 	int i, n, nf;
72*29779Sjaap 
73*29779Sjaap 	getch();
74*29779Sjaap 	n = 0;
75*29779Sjaap 	n = inumb(&n);
76*29779Sjaap 	getch();
77*29779Sjaap 	return ' ';
78*29779Sjaap }
79*29779Sjaap 
findft(i)80*29779Sjaap findft(i)
81*29779Sjaap register int	i;
82*29779Sjaap {
83*29779Sjaap 	register k;
84*29779Sjaap 
85*29779Sjaap 	if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
86*29779Sjaap 		return(k);
87*29779Sjaap 	for (k = 0; fontlab[k] != i; k++)
88*29779Sjaap 		if (k > nfonts)
89*29779Sjaap 			return(-1);
90*29779Sjaap 	return(k);
91*29779Sjaap }
92*29779Sjaap 
93*29779Sjaap 
caseps()94*29779Sjaap caseps()
95*29779Sjaap {
96*29779Sjaap }
97*29779Sjaap 
98*29779Sjaap 
mchbits()99*29779Sjaap mchbits()
100*29779Sjaap {
101*29779Sjaap 	chbits = 0;
102*29779Sjaap 	setfbits(chbits, font);
103*29779Sjaap 	sps = width(' ' | chbits);
104*29779Sjaap }
105*29779Sjaap 
106*29779Sjaap 
setps()107*29779Sjaap setps()
108*29779Sjaap {
109*29779Sjaap 	register i, j;
110*29779Sjaap 
111*29779Sjaap 	i = cbits(getch());
112*29779Sjaap 	if (isdigit(i)) {		/* \sd or \sdd */
113*29779Sjaap 		i -= '0';
114*29779Sjaap 		if (i == 0)		/* \s0 */
115*29779Sjaap 			;
116*29779Sjaap 		else if (i <= 3 && isdigit(j = cbits(ch=getch()))) {	/* \sdd */
117*29779Sjaap 			ch = 0;
118*29779Sjaap 		}
119*29779Sjaap 	} else if (i == '(') {		/* \s(dd */
120*29779Sjaap 		getch();
121*29779Sjaap 		getch();
122*29779Sjaap 	} else if (i == '+' || i == '-') {	/* \s+, \s- */
123*29779Sjaap 		j = cbits(getch());
124*29779Sjaap 		if (isdigit(j)) {		/* \s+d, \s-d */
125*29779Sjaap 			;
126*29779Sjaap 		} else if (j == '(') {		/* \s+(dd, \s-(dd */
127*29779Sjaap 			getch();
128*29779Sjaap 			getch();
129*29779Sjaap 		}
130*29779Sjaap 	}
131*29779Sjaap }
132*29779Sjaap 
133*29779Sjaap 
oldsetps()134*29779Sjaap oldsetps()
135*29779Sjaap {
136*29779Sjaap 	int i, j, k;
137*29779Sjaap 
138*29779Sjaap 	if (((i = cbits(getch())) == '+' || i == '-') && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) {
139*29779Sjaap 		if (i == '-')
140*29779Sjaap 			j = -j;
141*29779Sjaap 		ch = 0;
142*29779Sjaap 		return;
143*29779Sjaap 	}
144*29779Sjaap 	if ((i -= '0') == 0) {
145*29779Sjaap 		return;
146*29779Sjaap 	}
147*29779Sjaap 	if (i > 0 && i <= 9) {
148*29779Sjaap 		/* removed if (i <= 3 && */
149*29779Sjaap 		/* didn't work!!!! */
150*29779Sjaap 		if (i <= 3 && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) {
151*29779Sjaap 			i = 10 * i + j;
152*29779Sjaap 			ch = 0;
153*29779Sjaap 		}
154*29779Sjaap 	}
155*29779Sjaap }
156*29779Sjaap 
157*29779Sjaap 
setht()158*29779Sjaap tchar setht()		/* set character height from \H'...' */
159*29779Sjaap {
160*29779Sjaap 	int	n;
161*29779Sjaap 	tchar c;
162*29779Sjaap 
163*29779Sjaap 	getch();
164*29779Sjaap 	n = inumb(&apts);
165*29779Sjaap 	getch();
166*29779Sjaap 	return(0);
167*29779Sjaap }
168*29779Sjaap 
169*29779Sjaap 
setslant()170*29779Sjaap tchar setslant()		/* set slant from \S'...' */
171*29779Sjaap {
172*29779Sjaap 	int	n;
173*29779Sjaap 	tchar c;
174*29779Sjaap 
175*29779Sjaap 	getch();
176*29779Sjaap 	n = 0;
177*29779Sjaap 	n = inumb(&n);
178*29779Sjaap 	getch();
179*29779Sjaap 	return(0);
180*29779Sjaap }
181*29779Sjaap 
182*29779Sjaap 
caseft()183*29779Sjaap caseft()
184*29779Sjaap {
185*29779Sjaap 	skip();
186*29779Sjaap 	setfont(1);
187*29779Sjaap }
188*29779Sjaap 
189*29779Sjaap 
setfont(a)190*29779Sjaap setfont(a)
191*29779Sjaap int	a;
192*29779Sjaap {
193*29779Sjaap 	register i, j;
194*29779Sjaap 
195*29779Sjaap 	if (a)
196*29779Sjaap 		i = getrq();
197*29779Sjaap 	else
198*29779Sjaap 		i = getsn();
199*29779Sjaap 	if (!i || i == 'P') {
200*29779Sjaap 		j = font1;
201*29779Sjaap 		goto s0;
202*29779Sjaap 	}
203*29779Sjaap 	if (i == 'S' || i == '0')
204*29779Sjaap 		return;
205*29779Sjaap 	if ((j = findft(i, fontlab)) == -1)
206*29779Sjaap 		return;
207*29779Sjaap s0:
208*29779Sjaap 	font1 = font;
209*29779Sjaap 	font = j;
210*29779Sjaap 	mchbits();
211*29779Sjaap }
212*29779Sjaap 
213*29779Sjaap 
setwd()214*29779Sjaap setwd()
215*29779Sjaap {
216*29779Sjaap 	register base, wid;
217*29779Sjaap 	register tchar i;
218*29779Sjaap 	int	delim, emsz, k;
219*29779Sjaap 	int	savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
220*29779Sjaap 
221*29779Sjaap 	base = numtab[ST].val = numtab[ST].val = wid = numtab[CT].val = 0;
222*29779Sjaap 	if (ismot(i = getch()))
223*29779Sjaap 		return;
224*29779Sjaap 	delim = cbits(i);
225*29779Sjaap 	savhp = numtab[HP].val;
226*29779Sjaap 	numtab[HP].val = 0;
227*29779Sjaap 	savapts = apts;
228*29779Sjaap 	savapts1 = apts1;
229*29779Sjaap 	savfont = font;
230*29779Sjaap 	savfont1 = font1;
231*29779Sjaap 	savpts = pts;
232*29779Sjaap 	savpts1 = pts1;
233*29779Sjaap 	setwdf++;
234*29779Sjaap 	while (cbits(i = getch()) != delim && !nlflg) {
235*29779Sjaap 		k = width(i);
236*29779Sjaap 		wid += k;
237*29779Sjaap 		numtab[HP].val += k;
238*29779Sjaap 		if (!ismot(i)) {
239*29779Sjaap 			emsz = (INCH * pts + 36) / 72;
240*29779Sjaap 		} else if (isvmot(i)) {
241*29779Sjaap 			k = absmot(i);
242*29779Sjaap 			if (isnmot(i))
243*29779Sjaap 				k = -k;
244*29779Sjaap 			base -= k;
245*29779Sjaap 			emsz = 0;
246*29779Sjaap 		} else
247*29779Sjaap 			continue;
248*29779Sjaap 		if (base < numtab[SB].val)
249*29779Sjaap 			numtab[SB].val = base;
250*29779Sjaap 		if ((k = base + emsz) > numtab[ST].val)
251*29779Sjaap 			numtab[ST].val = k;
252*29779Sjaap 	}
253*29779Sjaap 	setn1(wid, 0, (tchar) 0);
254*29779Sjaap 	numtab[HP].val = savhp;
255*29779Sjaap 	apts = savapts;
256*29779Sjaap 	apts1 = savapts1;
257*29779Sjaap 	font = savfont;
258*29779Sjaap 	font1 = savfont1;
259*29779Sjaap 	pts = savpts;
260*29779Sjaap 	pts1 = savpts1;
261*29779Sjaap 	mchbits();
262*29779Sjaap 	setwdf = 0;
263*29779Sjaap }
264*29779Sjaap 
265*29779Sjaap 
vmot()266*29779Sjaap tchar vmot()
267*29779Sjaap {
268*29779Sjaap 	dfact = lss;
269*29779Sjaap 	vflag++;
270*29779Sjaap 	return(mot());
271*29779Sjaap }
272*29779Sjaap 
273*29779Sjaap 
hmot()274*29779Sjaap tchar hmot()
275*29779Sjaap {
276*29779Sjaap 	dfact = EM;
277*29779Sjaap 	return(mot());
278*29779Sjaap }
279*29779Sjaap 
280*29779Sjaap 
mot()281*29779Sjaap tchar mot()
282*29779Sjaap {
283*29779Sjaap 	register int j, n;
284*29779Sjaap 	register tchar i;
285*29779Sjaap 
286*29779Sjaap 	j = HOR;
287*29779Sjaap 	getch(); /*eat delim*/
288*29779Sjaap 	if (n = atoi()) {
289*29779Sjaap 		if (vflag)
290*29779Sjaap 			j = VERT;
291*29779Sjaap 		i = makem(quant(n, j));
292*29779Sjaap 	} else
293*29779Sjaap 		i = 0;
294*29779Sjaap 	getch();
295*29779Sjaap 	vflag = 0;
296*29779Sjaap 	dfact = 1;
297*29779Sjaap 	return(i);
298*29779Sjaap }
299*29779Sjaap 
300*29779Sjaap 
sethl(k)301*29779Sjaap tchar sethl(k)
302*29779Sjaap int	k;
303*29779Sjaap {
304*29779Sjaap 	register j;
305*29779Sjaap 	tchar i;
306*29779Sjaap 
307*29779Sjaap 	j = t.Halfline;
308*29779Sjaap 	if (k == 'u')
309*29779Sjaap 		j = -j;
310*29779Sjaap 	else if (k == 'r')
311*29779Sjaap 		j = -2 * j;
312*29779Sjaap 	vflag++;
313*29779Sjaap 	i = makem(j);
314*29779Sjaap 	vflag = 0;
315*29779Sjaap 	return(i);
316*29779Sjaap }
317*29779Sjaap 
318*29779Sjaap 
makem(i)319*29779Sjaap tchar makem(i)
320*29779Sjaap int	i;
321*29779Sjaap {
322*29779Sjaap 	register tchar j;
323*29779Sjaap 
324*29779Sjaap 	if ((j = i) < 0)
325*29779Sjaap 		j = -j;
326*29779Sjaap 	j |= MOT;
327*29779Sjaap 	if (i < 0)
328*29779Sjaap 		j |= NMOT;
329*29779Sjaap 	if (vflag)
330*29779Sjaap 		j |= VMOT;
331*29779Sjaap 	return(j);
332*29779Sjaap }
333*29779Sjaap 
334*29779Sjaap 
getlg(i)335*29779Sjaap tchar getlg(i)
336*29779Sjaap tchar	i;
337*29779Sjaap {
338*29779Sjaap 	return(i);
339*29779Sjaap }
340*29779Sjaap 
341*29779Sjaap 
caselg()342*29779Sjaap caselg()
343*29779Sjaap {
344*29779Sjaap }
345*29779Sjaap 
346*29779Sjaap 
casefp()347*29779Sjaap casefp()
348*29779Sjaap {
349*29779Sjaap 	register i, j;
350*29779Sjaap 
351*29779Sjaap 	skip();
352*29779Sjaap 	if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
353*29779Sjaap 		return;
354*29779Sjaap 	if (skip() || !(j = getrq()))
355*29779Sjaap 		return;
356*29779Sjaap 	fontlab[i] = j;
357*29779Sjaap }
358*29779Sjaap 
359*29779Sjaap 
casecs()360*29779Sjaap casecs()
361*29779Sjaap {
362*29779Sjaap }
363*29779Sjaap 
364*29779Sjaap 
casebd()365*29779Sjaap casebd()
366*29779Sjaap {
367*29779Sjaap 	register i, j, k;
368*29779Sjaap 
369*29779Sjaap 	k = 0;
370*29779Sjaap bd0:
371*29779Sjaap 	if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
372*29779Sjaap 		if (k)
373*29779Sjaap 			goto bd1;
374*29779Sjaap 		else
375*29779Sjaap 			return;
376*29779Sjaap 	}
377*29779Sjaap 	if (j == smnt) {
378*29779Sjaap 		k = smnt;
379*29779Sjaap 		goto bd0;
380*29779Sjaap 	}
381*29779Sjaap 	if (k) {
382*29779Sjaap 		sbold = j;
383*29779Sjaap 		j = k;
384*29779Sjaap 	}
385*29779Sjaap bd1:
386*29779Sjaap 	skip();
387*29779Sjaap 	noscale++;
388*29779Sjaap 	bdtab[j] = atoi();
389*29779Sjaap 	noscale = 0;
390*29779Sjaap }
391*29779Sjaap 
392*29779Sjaap 
casevs()393*29779Sjaap casevs()
394*29779Sjaap {
395*29779Sjaap 	register i;
396*29779Sjaap 
397*29779Sjaap 	skip();
398*29779Sjaap 	vflag++;
399*29779Sjaap 	dfact = INCH; /*default scaling is points!*/
400*29779Sjaap 	dfactd = 72;
401*29779Sjaap 	res = VERT;
402*29779Sjaap 	i = inumb(&lss);
403*29779Sjaap 	if (nonumb)
404*29779Sjaap 		i = lss1;
405*29779Sjaap 	if (i < VERT)
406*29779Sjaap 		i = 0;	/* was VERT */
407*29779Sjaap 	lss1 = lss;
408*29779Sjaap 	lss = i;
409*29779Sjaap }
410*29779Sjaap 
411*29779Sjaap 
412*29779Sjaap 
413*29779Sjaap 
casess()414*29779Sjaap casess()
415*29779Sjaap {
416*29779Sjaap }
417*29779Sjaap 
418*29779Sjaap 
xlss()419*29779Sjaap tchar xlss()
420*29779Sjaap {
421*29779Sjaap 	/* stores \x'...' into
422*29779Sjaap 	/* two successive tchars.
423*29779Sjaap 	/* the first contains HX, the second the value,
424*29779Sjaap 	/* encoded as a vertical motion.
425*29779Sjaap 	/* decoding is done in n2.c by pchar().
426*29779Sjaap 	*/
427*29779Sjaap 	int	i;
428*29779Sjaap 
429*29779Sjaap 	getch();
430*29779Sjaap 	dfact = lss;
431*29779Sjaap 	i = quant(atoi(), VERT);
432*29779Sjaap 	dfact = 1;
433*29779Sjaap 	getch();
434*29779Sjaap 	if (i >= 0)
435*29779Sjaap 		*pbp++ = MOT | VMOT | i;
436*29779Sjaap 	else
437*29779Sjaap 		*pbp++ = MOT | VMOT | NMOT | -i;
438*29779Sjaap 	return(HX);
439*29779Sjaap }
440