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