1 5cedca1b 2004-05-15 devnull #include "tdef.h"
2 5cedca1b 2004-05-15 devnull #include "ext.h"
3 5cedca1b 2004-05-15 devnull #include "fns.h"
6 5cedca1b 2004-05-15 devnull * troff9.c
8 5cedca1b 2004-05-15 devnull * misc functions
11 5cedca1b 2004-05-15 devnull Tchar setz(void)
15 5cedca1b 2004-05-15 devnull if (!ismot(i = getch()))
16 5cedca1b 2004-05-15 devnull i |= ZBIT;
17 5cedca1b 2004-05-15 devnull return(i);
20 5cedca1b 2004-05-15 devnull void setline(void)
22 5cedca1b 2004-05-15 devnull Tchar *i;
24 5cedca1b 2004-05-15 devnull int length;
25 5cedca1b 2004-05-15 devnull int j, w, cnt, delim, rem, temp;
26 5cedca1b 2004-05-15 devnull Tchar linebuf[NC];
28 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
30 5cedca1b 2004-05-15 devnull delim = cbits(c);
31 5cedca1b 2004-05-15 devnull vflag = 0;
32 5cedca1b 2004-05-15 devnull dfact = EM;
33 5cedca1b 2004-05-15 devnull length = quant(atoi0(), HOR);
34 5cedca1b 2004-05-15 devnull dfact = 1;
35 5cedca1b 2004-05-15 devnull if (!length) {
36 5cedca1b 2004-05-15 devnull eat(delim);
40 5cedca1b 2004-05-15 devnull if ((j = cbits(c = getch())) == delim || j == '\n') {
42 5cedca1b 2004-05-15 devnull c = RULE | chbits;
43 5cedca1b 2004-05-15 devnull } else if (cbits(c) == FILLER)
45 5cedca1b 2004-05-15 devnull w = width(c);
46 5cedca1b 2004-05-15 devnull if (w <= 0) {
47 5cedca1b 2004-05-15 devnull ERROR "zero-width underline character ignored" WARN;
48 5cedca1b 2004-05-15 devnull c = RULE | chbits;
49 5cedca1b 2004-05-15 devnull w = width(c);
51 5cedca1b 2004-05-15 devnull i = linebuf;
52 5cedca1b 2004-05-15 devnull if (length < 0) {
53 5cedca1b 2004-05-15 devnull *i++ = makem(length);
54 5cedca1b 2004-05-15 devnull length = -length;
56 5cedca1b 2004-05-15 devnull if (!(cnt = length / w)) {
57 5cedca1b 2004-05-15 devnull *i++ = makem(-(temp = ((w - length) / 2)));
58 5cedca1b 2004-05-15 devnull *i++ = c;
59 5cedca1b 2004-05-15 devnull *i++ = makem(-(w - length - temp));
62 5cedca1b 2004-05-15 devnull if (rem = length % w) {
63 5cedca1b 2004-05-15 devnull if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN)
64 5cedca1b 2004-05-15 devnull *i++ = c | ZBIT;
65 5cedca1b 2004-05-15 devnull *i++ = makem(rem);
67 5cedca1b 2004-05-15 devnull if (cnt) {
68 5cedca1b 2004-05-15 devnull *i++ = RPT;
69 5cedca1b 2004-05-15 devnull *i++ = cnt;
70 5cedca1b 2004-05-15 devnull *i++ = c;
74 5cedca1b 2004-05-15 devnull eat(delim);
75 5cedca1b 2004-05-15 devnull pushback(linebuf);
79 5cedca1b 2004-05-15 devnull eat(int c)
83 5cedca1b 2004-05-15 devnull while ((i = cbits(getch())) != c && i != '\n')
85 5cedca1b 2004-05-15 devnull return(i);
89 5cedca1b 2004-05-15 devnull void setov(void)
91 5cedca1b 2004-05-15 devnull int j, k;
92 5cedca1b 2004-05-15 devnull Tchar i, o[NOV+1];
93 5cedca1b 2004-05-15 devnull int delim, w[NOV+1];
95 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
97 5cedca1b 2004-05-15 devnull delim = cbits(i);
98 5cedca1b 2004-05-15 devnull for (k = 0; k < NOV && (j = cbits(i = getch())) != delim && j != '\n'; k++) {
99 5cedca1b 2004-05-15 devnull o[k] = i;
100 5cedca1b 2004-05-15 devnull w[k] = width(i);
102 5cedca1b 2004-05-15 devnull o[k] = w[k] = 0;
103 5cedca1b 2004-05-15 devnull if (o[0])
104 5cedca1b 2004-05-15 devnull for (j = 1; j; ) {
106 5cedca1b 2004-05-15 devnull for (k = 1; o[k] ; k++) {
107 5cedca1b 2004-05-15 devnull if (w[k-1] < w[k]) {
109 5cedca1b 2004-05-15 devnull i = w[k];
110 5cedca1b 2004-05-15 devnull w[k] = w[k-1];
111 5cedca1b 2004-05-15 devnull w[k-1] = i;
112 5cedca1b 2004-05-15 devnull i = o[k];
113 5cedca1b 2004-05-15 devnull o[k] = o[k-1];
114 5cedca1b 2004-05-15 devnull o[k-1] = i;
120 5cedca1b 2004-05-15 devnull *pbp++ = makem(w[0] / 2);
121 5cedca1b 2004-05-15 devnull for (k = 0; o[k]; k++)
123 5cedca1b 2004-05-15 devnull while (k>0) {
125 5cedca1b 2004-05-15 devnull *pbp++ = makem(-((w[k] + w[k+1]) / 2));
126 5cedca1b 2004-05-15 devnull *pbp++ = o[k];
131 5cedca1b 2004-05-15 devnull void setbra(void)
134 5cedca1b 2004-05-15 devnull Tchar i, *j, dwn;
135 5cedca1b 2004-05-15 devnull int cnt, delim;
136 5cedca1b 2004-05-15 devnull Tchar brabuf[NC];
138 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
140 5cedca1b 2004-05-15 devnull delim = cbits(i);
141 5cedca1b 2004-05-15 devnull j = brabuf + 1;
142 5cedca1b 2004-05-15 devnull cnt = 0;
143 5cedca1b 2004-05-15 devnull if (NROFF)
144 5cedca1b 2004-05-15 devnull dwn = (2 * t.Halfline) | MOT | VMOT;
146 5cedca1b 2004-05-15 devnull dwn = EM | MOT | VMOT;
147 5cedca1b 2004-05-15 devnull while ((k = cbits(i = getch())) != delim && k != '\n' && j <= brabuf + NC - 4) {
148 5cedca1b 2004-05-15 devnull *j++ = i | ZBIT;
149 5cedca1b 2004-05-15 devnull *j++ = dwn;
152 5cedca1b 2004-05-15 devnull if (--cnt < 0)
154 5cedca1b 2004-05-15 devnull else if (!cnt) {
155 5cedca1b 2004-05-15 devnull ch = *(j - 2);
159 5cedca1b 2004-05-15 devnull if (NROFF)
160 5cedca1b 2004-05-15 devnull *--j = *brabuf = (cnt * t.Halfline) | MOT | NMOT | VMOT;
162 5cedca1b 2004-05-15 devnull *--j = *brabuf = (cnt * EM) / 2 | MOT | NMOT | VMOT;
163 5cedca1b 2004-05-15 devnull *--j &= ~ZBIT;
164 5cedca1b 2004-05-15 devnull pushback(brabuf);
168 5cedca1b 2004-05-15 devnull void setvline(void)
171 5cedca1b 2004-05-15 devnull Tchar c, rem, ver, neg;
172 5cedca1b 2004-05-15 devnull int cnt, delim, v;
173 5cedca1b 2004-05-15 devnull Tchar vlbuf[NC];
174 5cedca1b 2004-05-15 devnull Tchar *vlp;
176 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
178 5cedca1b 2004-05-15 devnull delim = cbits(c);
179 5cedca1b 2004-05-15 devnull dfact = lss;
180 5cedca1b 2004-05-15 devnull vflag++;
181 5cedca1b 2004-05-15 devnull i = quant(atoi0(), VERT);
182 5cedca1b 2004-05-15 devnull dfact = 1;
183 5cedca1b 2004-05-15 devnull if (!i) {
184 5cedca1b 2004-05-15 devnull eat(delim);
185 5cedca1b 2004-05-15 devnull vflag = 0;
188 5cedca1b 2004-05-15 devnull if ((cbits(c = getch())) == delim) {
189 5cedca1b 2004-05-15 devnull c = BOXRULE | chbits; /*default box rule*/
191 5cedca1b 2004-05-15 devnull getch();
192 5cedca1b 2004-05-15 devnull c |= ZBIT;
193 5cedca1b 2004-05-15 devnull neg = 0;
194 5cedca1b 2004-05-15 devnull if (i < 0) {
196 5cedca1b 2004-05-15 devnull neg = NMOT;
198 5cedca1b 2004-05-15 devnull if (NROFF)
199 5cedca1b 2004-05-15 devnull v = 2 * t.Halfline;
202 5cedca1b 2004-05-15 devnull if (v < VERT) /* ATT EVK hack: Erik van Konijnenburg, */
203 5cedca1b 2004-05-15 devnull v = VERT; /* hvlpb!evkonij, ATT NSI Hilversum, Holland */
206 5cedca1b 2004-05-15 devnull cnt = i / v;
207 5cedca1b 2004-05-15 devnull rem = makem(i % v) | neg;
208 5cedca1b 2004-05-15 devnull ver = makem(v) | neg;
209 5cedca1b 2004-05-15 devnull vlp = vlbuf;
210 5cedca1b 2004-05-15 devnull if (!neg)
211 5cedca1b 2004-05-15 devnull *vlp++ = ver;
212 5cedca1b 2004-05-15 devnull if (absmot(rem) != 0) {
213 5cedca1b 2004-05-15 devnull *vlp++ = c;
214 5cedca1b 2004-05-15 devnull *vlp++ = rem;
216 5cedca1b 2004-05-15 devnull while (vlp < vlbuf + NC - 3 && cnt--) {
217 5cedca1b 2004-05-15 devnull *vlp++ = c;
218 5cedca1b 2004-05-15 devnull *vlp++ = ver;
220 5cedca1b 2004-05-15 devnull *(vlp - 2) &= ~ZBIT;
221 5cedca1b 2004-05-15 devnull if (!neg)
223 5cedca1b 2004-05-15 devnull *vlp = 0;
224 5cedca1b 2004-05-15 devnull pushback(vlbuf);
225 5cedca1b 2004-05-15 devnull vflag = 0;
228 5cedca1b 2004-05-15 devnull #define NPAIR (NC/2-6) /* max pairs in spline, etc. */
230 5cedca1b 2004-05-15 devnull void setdraw(void) /* generate internal cookies for a drawing function */
232 5cedca1b 2004-05-15 devnull int i, j, k, dx[NPAIR], dy[NPAIR], delim, type;
233 5cedca1b 2004-05-15 devnull Tchar c, drawbuf[NC];
234 5cedca1b 2004-05-15 devnull int drawch = '.'; /* character to draw with */
236 5cedca1b 2004-05-15 devnull /* input is \D'f dx dy dx dy ... c' (or at least it had better be) */
237 5cedca1b 2004-05-15 devnull /* this does drawing function f with character c and the */
238 5cedca1b 2004-05-15 devnull /* specified dx,dy pairs interpreted as appropriate */
239 5cedca1b 2004-05-15 devnull /* pairs are deltas from last point, except for radii */
241 5cedca1b 2004-05-15 devnull /* l dx dy: line from here by dx,dy */
242 5cedca1b 2004-05-15 devnull /* c x: circle of diameter x, left side here */
243 5cedca1b 2004-05-15 devnull /* e x y: ellipse of diameters x,y, left side here */
244 5cedca1b 2004-05-15 devnull /* a dx1 dy1 dx2 dy2:
245 5cedca1b 2004-05-15 devnull ccw arc: ctr at dx1,dy1, then end at dx2,dy2 from there */
246 5cedca1b 2004-05-15 devnull /* ~ dx1 dy1 dx2 dy2...:
247 5cedca1b 2004-05-15 devnull spline to dx1,dy1 to dx2,dy2 ... */
248 5cedca1b 2004-05-15 devnull /* b x c:
249 5cedca1b 2004-05-15 devnull built-up character of type c, ht x */
250 5cedca1b 2004-05-15 devnull /* f dx dy ...: f is any other char: like spline */
252 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
254 5cedca1b 2004-05-15 devnull delim = cbits(c);
255 5cedca1b 2004-05-15 devnull numerr.escarg = type = cbits(getch());
256 5cedca1b 2004-05-15 devnull if (type == '~') /* head off the .tr ~ problem */
257 5cedca1b 2004-05-15 devnull type = 's';
258 5cedca1b 2004-05-15 devnull for (i = 0; i < NPAIR ; i++) {
260 5cedca1b 2004-05-15 devnull vflag = 0;
261 5cedca1b 2004-05-15 devnull dfact = EM;
262 5cedca1b 2004-05-15 devnull dx[i] = quant(atoi0(), HOR);
263 5cedca1b 2004-05-15 devnull if (dx[i] > MAXMOT)
264 5cedca1b 2004-05-15 devnull dx[i] = MAXMOT;
265 5cedca1b 2004-05-15 devnull else if (dx[i] < -MAXMOT)
266 5cedca1b 2004-05-15 devnull dx[i] = -MAXMOT;
268 5cedca1b 2004-05-15 devnull if (type == 'c') {
269 5cedca1b 2004-05-15 devnull dy[i] = 0;
270 5cedca1b 2004-05-15 devnull goto eat;
272 5cedca1b 2004-05-15 devnull vflag = 1;
273 5cedca1b 2004-05-15 devnull dfact = lss;
274 5cedca1b 2004-05-15 devnull dy[i] = quant(atoi0(), VERT);
275 5cedca1b 2004-05-15 devnull if (dy[i] > MAXMOT)
276 5cedca1b 2004-05-15 devnull dy[i] = MAXMOT;
277 5cedca1b 2004-05-15 devnull else if (dy[i] < -MAXMOT)
278 5cedca1b 2004-05-15 devnull dy[i] = -MAXMOT;
280 5cedca1b 2004-05-15 devnull if (cbits(c = getch()) != ' ') { /* must be the end */
281 5cedca1b 2004-05-15 devnull if (cbits(c) != delim) {
282 5cedca1b 2004-05-15 devnull drawch = cbits(c);
283 5cedca1b 2004-05-15 devnull getch();
289 5cedca1b 2004-05-15 devnull dfact = 1;
290 5cedca1b 2004-05-15 devnull vflag = 0;
291 5cedca1b 2004-05-15 devnull if (TROFF) {
292 5cedca1b 2004-05-15 devnull drawbuf[0] = DRAWFCN | chbits | ZBIT;
293 5cedca1b 2004-05-15 devnull drawbuf[1] = type | chbits | ZBIT;
294 5cedca1b 2004-05-15 devnull drawbuf[2] = drawch | chbits | ZBIT;
295 5cedca1b 2004-05-15 devnull for (k = 0, j = 3; k < i; k++) {
296 5cedca1b 2004-05-15 devnull drawbuf[j++] = MOT | ((dx[k] >= 0) ? dx[k] : (NMOT | -dx[k]));
297 5cedca1b 2004-05-15 devnull drawbuf[j++] = MOT | VMOT | ((dy[k] >= 0) ? dy[k] : (NMOT | -dy[k]));
299 5cedca1b 2004-05-15 devnull if (type == DRAWELLIPSE) {
300 5cedca1b 2004-05-15 devnull drawbuf[5] = drawbuf[4] | NMOT; /* so the net vertical is zero */
302 5cedca1b 2004-05-15 devnull } else if (type == DRAWBUILD) {
303 5cedca1b 2004-05-15 devnull drawbuf[4] = drawbuf[3] | NMOT; /* net horizontal motion is zero */
304 5cedca1b 2004-05-15 devnull drawbuf[2] &= ~ZBIT; /* width taken from drawing char */
307 5cedca1b 2004-05-15 devnull drawbuf[j++] = DRAWFCN | chbits | ZBIT; /* marks end for ptout */
308 5cedca1b 2004-05-15 devnull drawbuf[j] = 0;
309 5cedca1b 2004-05-15 devnull pushback(drawbuf);
314 5cedca1b 2004-05-15 devnull void casefc(void)
317 5cedca1b 2004-05-15 devnull Tchar j;
319 5cedca1b 2004-05-15 devnull gchtab[fc] &= ~FCBIT;
320 5cedca1b 2004-05-15 devnull fc = IMP;
321 5cedca1b 2004-05-15 devnull padc = ' ';
322 5cedca1b 2004-05-15 devnull if (skip() || ismot(j = getch()) || (i = cbits(j)) == '\n')
325 5cedca1b 2004-05-15 devnull gchtab[fc] |= FCBIT;
326 5cedca1b 2004-05-15 devnull if (skip() || ismot(ch) || (ch = cbits(ch)) == fc)
328 5cedca1b 2004-05-15 devnull padc = ch;
332 5cedca1b 2004-05-15 devnull Tchar setfield(int x)
334 5cedca1b 2004-05-15 devnull Tchar ii, jj, *fp;
335 5cedca1b 2004-05-15 devnull int i, j;
336 5cedca1b 2004-05-15 devnull int length, ws, npad, temp, type;
337 5cedca1b 2004-05-15 devnull Tchar **pp, *padptr[NPP];
338 5cedca1b 2004-05-15 devnull Tchar fbuf[FBUFSZ];
339 5cedca1b 2004-05-15 devnull int savfc, savtc, savlc;
340 5cedca1b 2004-05-15 devnull Tchar rchar;
341 5cedca1b 2004-05-15 devnull int savepos;
342 5cedca1b 2004-05-15 devnull static Tchar wbuf[] = { WORDSP, 0};
344 c5561c23 2004-05-16 devnull rchar = 0;
345 5cedca1b 2004-05-15 devnull if (x == tabch)
346 5cedca1b 2004-05-15 devnull rchar = tabc | chbits;
347 5cedca1b 2004-05-15 devnull else if (x == ldrch)
348 5cedca1b 2004-05-15 devnull rchar = dotc | chbits;
349 5cedca1b 2004-05-15 devnull temp = npad = ws = 0;
350 5cedca1b 2004-05-15 devnull savfc = fc;
351 5cedca1b 2004-05-15 devnull savtc = tabch;
352 5cedca1b 2004-05-15 devnull savlc = ldrch;
353 5cedca1b 2004-05-15 devnull tabch = ldrch = fc = IMP;
354 5cedca1b 2004-05-15 devnull savepos = numtabp[HP].val;
355 5cedca1b 2004-05-15 devnull gchtab[tabch] &= ~TABBIT;
356 5cedca1b 2004-05-15 devnull gchtab[ldrch] &= ~LDRBIT;
357 5cedca1b 2004-05-15 devnull gchtab[fc] &= ~FCBIT;
358 5cedca1b 2004-05-15 devnull gchtab[IMP] |= TABBIT|LDRBIT|FCBIT;
359 5cedca1b 2004-05-15 devnull for (j = 0; ; j++) {
360 5cedca1b 2004-05-15 devnull if ((tabtab[j] & TABMASK) == 0) {
361 5cedca1b 2004-05-15 devnull if (x == savfc)
362 5cedca1b 2004-05-15 devnull ERROR "zero field width." WARN;
364 5cedca1b 2004-05-15 devnull goto rtn;
366 5cedca1b 2004-05-15 devnull if ((length = ((tabtab[j] & TABMASK) - numtabp[HP].val)) > 0 )
369 5cedca1b 2004-05-15 devnull type = tabtab[j] & ~TABMASK;
370 5cedca1b 2004-05-15 devnull fp = fbuf;
371 5cedca1b 2004-05-15 devnull pp = padptr;
372 5cedca1b 2004-05-15 devnull if (x == savfc) {
373 5cedca1b 2004-05-15 devnull while (1) {
374 5cedca1b 2004-05-15 devnull j = cbits(ii = getch());
375 5cedca1b 2004-05-15 devnull jj = width(ii);
376 5cedca1b 2004-05-15 devnull widthp = jj;
377 5cedca1b 2004-05-15 devnull numtabp[HP].val += jj;
378 5cedca1b 2004-05-15 devnull if (j == padc) {
380 5cedca1b 2004-05-15 devnull *pp++ = fp;
381 5cedca1b 2004-05-15 devnull if (pp > padptr + NPP - 1)
383 5cedca1b 2004-05-15 devnull goto s1;
384 5cedca1b 2004-05-15 devnull } else if (j == savfc)
386 5cedca1b 2004-05-15 devnull else if (j == '\n') {
387 5cedca1b 2004-05-15 devnull temp = j;
388 5cedca1b 2004-05-15 devnull if (nlflg && ip == 0) {
389 5cedca1b 2004-05-15 devnull numtabp[CD].val--;
390 5cedca1b 2004-05-15 devnull nlflg = 0;
394 5cedca1b 2004-05-15 devnull ws += jj;
396 5cedca1b 2004-05-15 devnull *fp++ = ii;
397 5cedca1b 2004-05-15 devnull if (fp > fbuf + FBUFSZ - 3)
401 5cedca1b 2004-05-15 devnull *fp++ = WORDSP;
402 5cedca1b 2004-05-15 devnull if (!npad) {
404 5cedca1b 2004-05-15 devnull *pp++ = fp;
405 5cedca1b 2004-05-15 devnull *fp++ = 0;
407 5cedca1b 2004-05-15 devnull *fp++ = temp;
408 5cedca1b 2004-05-15 devnull *fp = 0;
409 5cedca1b 2004-05-15 devnull temp = i = (j = length - ws) / npad;
410 5cedca1b 2004-05-15 devnull i = (i / HOR) * HOR;
411 5cedca1b 2004-05-15 devnull if ((j -= i * npad) < 0)
413 5cedca1b 2004-05-15 devnull ii = makem(i);
414 5cedca1b 2004-05-15 devnull if (temp < 0)
415 5cedca1b 2004-05-15 devnull ii |= NMOT;
416 5cedca1b 2004-05-15 devnull for (; npad > 0; npad--) {
417 5cedca1b 2004-05-15 devnull *(*--pp) = ii;
418 5cedca1b 2004-05-15 devnull if (j) {
419 5cedca1b 2004-05-15 devnull j -= HOR;
420 5cedca1b 2004-05-15 devnull (*(*pp)) += HOR;
423 5cedca1b 2004-05-15 devnull pushback(fbuf);
425 5cedca1b 2004-05-15 devnull } else if (type == 0) {
426 5cedca1b 2004-05-15 devnull /*plain tab or leader*/
427 5cedca1b 2004-05-15 devnull if ((j = width(rchar)) > 0) {
428 5cedca1b 2004-05-15 devnull int nchar = length / j;
429 5cedca1b 2004-05-15 devnull while (nchar-->0 && pbp < &pbbuf[NC-3]) {
430 5cedca1b 2004-05-15 devnull numtabp[HP].val += j;
431 5cedca1b 2004-05-15 devnull widthp = j;
432 5cedca1b 2004-05-15 devnull *pbp++ = rchar;
434 5cedca1b 2004-05-15 devnull length %= j;
436 5cedca1b 2004-05-15 devnull if (length)
437 5cedca1b 2004-05-15 devnull jj = length | MOT;
439 5cedca1b 2004-05-15 devnull jj = getch0();
440 5cedca1b 2004-05-15 devnull if (savepos > 0)
441 5cedca1b 2004-05-15 devnull pushback(wbuf);
442 5cedca1b 2004-05-15 devnull } else {
443 5cedca1b 2004-05-15 devnull /*center tab*/
444 5cedca1b 2004-05-15 devnull /*right tab*/
445 5cedca1b 2004-05-15 devnull while ((j = cbits(ii = getch())) != savtc && j != '\n' && j != savlc) {
446 5cedca1b 2004-05-15 devnull jj = width(ii);
447 5cedca1b 2004-05-15 devnull ws += jj;
448 5cedca1b 2004-05-15 devnull numtabp[HP].val += jj;
449 5cedca1b 2004-05-15 devnull widthp = jj;
450 5cedca1b 2004-05-15 devnull *fp++ = ii;
451 5cedca1b 2004-05-15 devnull if (fp > fbuf + FBUFSZ - 3)
454 5cedca1b 2004-05-15 devnull *fp++ = ii;
455 5cedca1b 2004-05-15 devnull *fp = 0;
456 5cedca1b 2004-05-15 devnull if (type == RTAB)
457 5cedca1b 2004-05-15 devnull length -= ws;
459 5cedca1b 2004-05-15 devnull length -= ws / 2; /*CTAB*/
460 5cedca1b 2004-05-15 devnull pushback(fbuf);
461 5cedca1b 2004-05-15 devnull if ((j = width(rchar)) != 0 && length > 0) {
462 5cedca1b 2004-05-15 devnull int nchar = length / j;
463 5cedca1b 2004-05-15 devnull while (nchar-- > 0 && pbp < &pbbuf[NC-3])
464 5cedca1b 2004-05-15 devnull *pbp++ = rchar;
465 5cedca1b 2004-05-15 devnull length %= j;
467 5cedca1b 2004-05-15 devnull if (savepos > 0)
468 5cedca1b 2004-05-15 devnull pushback(wbuf);
469 5cedca1b 2004-05-15 devnull length = (length / HOR) * HOR;
470 5cedca1b 2004-05-15 devnull jj = makem(length);
471 5cedca1b 2004-05-15 devnull if (nlflg) {
472 5cedca1b 2004-05-15 devnull if (ip == 0)
473 5cedca1b 2004-05-15 devnull numtabp[CD].val--;
474 5cedca1b 2004-05-15 devnull nlflg = 0;
478 5cedca1b 2004-05-15 devnull gchtab[fc] &= ~FCBIT;
479 5cedca1b 2004-05-15 devnull gchtab[tabch] &= ~TABBIT;
480 5cedca1b 2004-05-15 devnull gchtab[ldrch] &= ~LDRBIT;
481 5cedca1b 2004-05-15 devnull fc = savfc;
482 5cedca1b 2004-05-15 devnull tabch = savtc;
483 5cedca1b 2004-05-15 devnull ldrch = savlc;
484 5cedca1b 2004-05-15 devnull gchtab[fc] |= FCBIT;
485 5cedca1b 2004-05-15 devnull gchtab[tabch] = TABBIT;
486 5cedca1b 2004-05-15 devnull gchtab[ldrch] |= LDRBIT;
487 5cedca1b 2004-05-15 devnull numtabp[HP].val = savepos;
488 5cedca1b 2004-05-15 devnull return(jj);