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