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