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