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
width(j)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
setch()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
setabs()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
findft(i)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
caseps()94 caseps()
95 {
96 }
97
98
mchbits()99 mchbits()
100 {
101 chbits = 0;
102 setfbits(chbits, font);
103 sps = width(' ' | chbits);
104 }
105
106
setps()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
oldsetps()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
setht()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
setslant()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
caseft()183 caseft()
184 {
185 skip();
186 setfont(1);
187 }
188
189
setfont(a)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
setwd()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
vmot()266 tchar vmot()
267 {
268 dfact = lss;
269 vflag++;
270 return(mot());
271 }
272
273
hmot()274 tchar hmot()
275 {
276 dfact = EM;
277 return(mot());
278 }
279
280
mot()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
sethl(k)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
makem(i)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
getlg(i)335 tchar getlg(i)
336 tchar i;
337 {
338 return(i);
339 }
340
341
caselg()342 caselg()
343 {
344 }
345
346
casefp()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
casecs()360 casecs()
361 {
362 }
363
364
casebd()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
casevs()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
casess()414 casess()
415 {
416 }
417
418
xlss()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