|
|
1.1 root 1: #include "tdef.h"
2: extern
3: #include "d.h"
4: extern
5: #include "v.h"
6: #ifdef NROFF
7: extern
8: #include "tw.h"
9: #endif
10: /*
11: troff9.c
12:
13: misc functions
14: */
15:
16: #include <sgtty.h>
17: #include "ext.h"
18:
19: tchar setz()
20: {
21: tchar i;
22:
23: if (!ismot(i = getch()))
24: i |= ZBIT;
25: return(i);
26: }
27:
28:
29: setline()
30: {
31: register tchar *i;
32: tchar c;
33: int length;
34: int w, cnt, delim, rem, temp;
35:
36: if (ismot(c = getch()))
37: return;
38: delim = cbits(c);
39: vflag = 0;
40: dfact = EM;
41: length = quant(atoi(), HOR);
42: dfact = 1;
43: if (!length) {
44: eat(delim);
45: return;
46: }
47: s0:
48: if ((cbits(c = getch())) == delim) {
49: ch = c;
50: c = RULE | chbits;
51: } else if (cbits(c) == FILLER)
52: goto s0;
53: w = width(c);
54: i = cbuf;
55: if (length < 0) {
56: *i++ = makem(length);
57: length = -length;
58: }
59: if (!(cnt = length / w)) {
60: *i++ = makem(-(temp = ((w - length) / 2)));
61: *i++ = c;
62: *i++ = makem(-(w - length - temp));
63: goto s1;
64: }
65: if (rem = length % w) {
66: if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN)
67: *i++ = c | ZBIT;
68: *i++ = makem(rem);
69: }
70: if (cnt) {
71: *i++ = RPT;
72: *i++ = cnt;
73: *i++ = c;
74: }
75: s1:
76: *i++ = 0;
77: eat(delim);
78: cp = cbuf;
79: }
80:
81:
82: eat(c)
83: int c;
84: {
85: register i;
86:
87: while ((i = cbits(getch())) != c && (i != '\n'))
88: ;
89: return(i);
90: }
91:
92:
93: setov()
94: {
95: register j, k;
96: tchar i, *p, o[NOV];
97: int delim, w[NOV];
98:
99: if (ismot(i = getch()))
100: return;
101: delim = cbits(i);
102: for (k = 0; (k < NOV) && ((j = cbits(i = getch())) != delim) && (j != '\n'); k++) {
103: o[k] = i;
104: w[k] = width(i);
105: }
106: o[k] = w[k] = 0;
107: if (o[0])
108: for (j = 1; j; ) {
109: j = 0;
110: for (k = 1; o[k] ; k++) {
111: if (w[k-1] < w[k]) {
112: j++;
113: i = w[k];
114: w[k] = w[k-1];
115: w[k-1] = i;
116: i = o[k];
117: o[k] = o[k-1];
118: o[k-1] = i;
119: }
120: }
121: }
122: else
123: return;
124: p = cbuf;
125: for (k = 0; o[k]; k++) {
126: *p++ = o[k];
127: *p++ = makem(-((w[k] + w[k+1]) / 2));
128: }
129: *p++ = makem(w[0] / 2);
130: *p = 0;
131: cp = cbuf;
132: }
133:
134:
135: setbra()
136: {
137: register k;
138: tchar i, *j, dwn;
139: int cnt, delim;
140:
141: if (ismot(i = getch()))
142: return;
143: delim = cbits(i);
144: j = cbuf + 1;
145: cnt = 0;
146: #ifdef NROFF
147: dwn = (2 * t.Halfline) | MOT | VMOT;
148: #endif
149: #ifndef NROFF
150: dwn = EM | MOT | VMOT;
151: #endif
152: while (((k = cbits(i = getch())) != delim) && (k != '\n') && (j <= (cbuf + NC - 4))) {
153: *j++ = i | ZBIT;
154: *j++ = dwn;
155: cnt++;
156: }
157: if (--cnt < 0)
158: return;
159: else if (!cnt) {
160: ch = *(j - 2);
161: return;
162: }
163: *j = 0;
164: #ifdef NROFF
165: *--j = *cbuf = (cnt * t.Halfline) | MOT | NMOT | VMOT;
166: #endif
167: #ifndef NROFF
168: *--j = *cbuf = (cnt * EM) / 2 | MOT | NMOT | VMOT;
169: #endif
170: *--j &= ~ZBIT;
171: cp = cbuf;
172: }
173:
174:
175: setvline()
176: {
177: register i;
178: tchar c, *k, rem, ver, neg;
179: int cnt, delim, v;
180:
181: if (ismot(c = getch()))
182: return;
183: delim = cbits(c);
184: dfact = lss;
185: vflag++;
186: i = quant(atoi(), VERT);
187: dfact = 1;
188: if (!i) {
189: eat(delim);
190: vflag = 0;
191: return;
192: }
193: if ((cbits(c = getch())) == delim) {
194: c = BOXRULE | chbits; /*default box rule*/
195: } else
196: getch();
197: c |= ZBIT;
198: neg = 0;
199: if (i < 0) {
200: i = -i;
201: neg = NMOT;
202: }
203: #ifdef NROFF
204: v = 2 * t.Halfline;
205: #endif
206: #ifndef NROFF
207: v = EM;
208: #endif
209: cnt = i / v;
210: rem = makem(i % v) | neg;
211: ver = makem(v) | neg;
212: k = cbuf;
213: if (!neg)
214: *k++ = ver;
215: if (absmot(rem) != 0) {
216: *k++ = c;
217: *k++ = rem;
218: }
219: while ((k < (cbuf + NC - 3)) && cnt--) {
220: *k++ = c;
221: *k++ = ver;
222: }
223: *(k - 2) &= ~ZBIT;
224: if (!neg)
225: k--;
226: *k = 0;
227: cp = cbuf;
228: vflag = 0;
229: }
230:
231:
232: setdraw() /* generate internal cookies for a drawing function */
233: {
234: int i, j, k, dx[100], dy[100], delim, type, temp;
235: tchar c;
236: /* input is \D'f x y x y ... c' (or at least it had better be) */
237: /* this does drawing function f with character c and the */
238: /* specified x,y pairs interpreted as appropriate */
239:
240: /* l x y: line from here by x,y */
241: /* c x: circle of diameter x, left side here */
242: /* e x y: ellipse of diameters x,y, left side here */
243: /* a x y r: arc to x,y with radius r (ccw) */
244: /* ~ x y ...: wiggly line */
245:
246: if (ismot(c = getch()))
247: return;
248: delim = cbits(c);
249: type = cbits(getch());
250: for (i = 0; i < 50 ; i++) {
251: c = getch();
252: if (cbits(c) == delim)
253: break;
254: /* ought to pick up optional drawing character */
255: if (cbits(c) != ' ')
256: ch = c;
257: vflag = 0;
258: dfact = EM;
259: dx[i] = quant(atoi(), HOR);
260: if (dx[i] > MAXMOT)
261: dx[i] = MAXMOT;
262: else if (dx[i] < -MAXMOT)
263: dx[i] = -MAXMOT;
264: if (cbits((c = getch())) == delim) { /* spacer */
265: dy[i++] = 0;
266: break;
267: }
268: vflag = 1;
269: dfact = lss;
270: dy[i] = quant(atoi(), VERT);
271: if (dy[i] > MAXMOT)
272: dy[i] = MAXMOT;
273: else if (dy[i] < -MAXMOT)
274: dy[i] = -MAXMOT;
275: }
276: dfact = 1;
277: vflag = 0;
278: #ifndef NROFF
279: cbuf[0] = DRAWFCN | chbits | ZBIT;
280: cbuf[1] = type | chbits | ZBIT;
281: cbuf[2] = '.' | chbits | ZBIT; /* indicates to use default drawing character */
282: for (k = 0, j = 3; k < i; k++) {
283: cbuf[j++] = MOT | ((dx[k] >= 0) ? dx[k] : (NMOT | -dx[k]));
284: cbuf[j++] = MOT | VMOT | ((dy[k] >= 0) ? dy[k] : (NMOT | -dy[k]));
285: }
286: if (type == DRAWELLIPSE) {
287: cbuf[5] = cbuf[4] | NMOT; /* so the net vertical is zero */
288: j = 6;
289: }
290: cbuf[j++] = '.' | chbits | ZBIT; /* marks end for ptout */
291: cbuf[j] = 0;
292: cp = cbuf;
293: #endif
294: }
295:
296:
297: casefc()
298: {
299: register i;
300: tchar j;
301:
302: fc = IMP;
303: padc = ' ';
304: if (skip() || ismot(j = getch()) || (i = cbits(j)) == '\n')
305: return;
306: fc = i;
307: if (skip() || ismot(ch) || (ch = cbits(ch)) == fc)
308: return;
309: padc = ch;
310: }
311:
312:
313: tchar setfield(x)
314: int x;
315: {
316: tchar ii, jj, *fp;
317: register i, j;
318: int length, ws, npad, temp, type;
319: tchar * *pp, *padptr[NPP];
320: static tchar fbuf[FBUFSZ];
321: int savfc, savtc, savlc;
322:
323: if (x == tabch)
324: rchar = tabc | chbits;
325: else if (x == ldrch)
326: rchar = dotc | chbits;
327: temp = npad = ws = 0;
328: savfc = fc;
329: savtc = tabch;
330: savlc = ldrch;
331: tabch = ldrch = fc = IMP;
332: for (j = 0; ; j++) {
333: if ((tabtab[j] & TMASK) == 0) {
334: if (x == savfc)
335: fprintf(stderr, "troff: zero field width.\n");
336: jj = 0;
337: goto rtn;
338: }
339: v.hp = sumhp(); /* XXX */
340: if ((length = ((tabtab[j] & TMASK) - v.hp)) > 0 )
341: break;
342: }
343: type = tabtab[j] & (~TMASK);
344: fp = fbuf;
345: pp = padptr;
346: if (x == savfc) {
347: while (1) {
348: if (((j = cbits(ii = getch()))) == padc) {
349: npad++;
350: *pp++ = fp;
351: if (pp > (padptr + NPP - 1))
352: break;
353: goto s1;
354: } else if (j == savfc)
355: break;
356: else if (j == '\n') {
357: temp = j;
358: nlflg = 0;
359: break;
360: }
361: ws += width(ii);
362: s1:
363: *fp++ = ii;
364: if (fp > (fbuf + FBUFSZ - 3))
365: break;
366: }
367: if (!npad) {
368: npad++;
369: *pp++ = fp;
370: *fp++ = 0;
371: }
372: *fp++ = temp;
373: *fp++ = 0;
374: temp = i = (j = length - ws) / npad;
375: i = (i / HOR) * HOR;
376: if ((j -= i * npad) < 0)
377: j = -j;
378: ii = makem(i);
379: if (temp < 0)
380: ii |= NMOT;
381: for (; npad > 0; npad--) {
382: *(*--pp) = ii;
383: if (j) {
384: j -= HOR;
385: (*(*pp)) += HOR;
386: }
387: }
388: cp = fbuf;
389: jj = 0;
390: } else if (type == 0) {
391: /*plain tab or leader*/
392: if ((j = width(rchar)) == 0)
393: nchar = 0;
394: else {
395: nchar = length / j;
396: length %= j;
397: }
398: if (length)
399: jj = length | MOT;
400: else
401: jj = getch0();
402: } else {
403: /*center tab*/
404: /*right tab*/
405: while (((j = cbits(ii = getch())) != savtc) && (j != '\n') && (j != savlc)) {
406: ws += width(ii);
407: *fp++ = ii;
408: if (fp > (fbuf + FBUFSZ - 3))
409: break;
410: }
411: *fp++ = ii;
412: *fp++ = 0;
413: if (type == RTAB)
414: length -= ws;
415: else
416: length -= ws / 2; /*CTAB*/
417: if (((j = width(rchar)) == 0) || (length <= 0))
418: nchar = 0;
419: else {
420: nchar = length / j;
421: length %= j;
422: }
423: length = (length / HOR) * HOR;
424: jj = makem(length);
425: cp = fbuf;
426: nlflg = 0;
427: }
428: rtn:
429: fc = savfc;
430: tabch = savtc;
431: ldrch = savlc;
432: return(jj);
433: }
434:
435:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.