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