15 if (!ismot(i
= getch()))
25 int j
, w
, cnt
, delim
, rem
, temp
;
28 if (ismot(c
= getch()))
33 length
= quant(atoi0(), HOR
);
40 if ((j
= cbits(c
= getch())) == delim
|| j
== '\n') {
43 } else if (cbits(c
) == FILLER
)
47 ERROR
"zero-width underline character ignored" WARN
;
56 if (!(cnt
= length
/ w
)) {
57 *i
++ = makem(-(temp
= ((w
- length
) / 2)));
59 *i
++ = makem(-(w
- length
- temp
));
62 if (rem
= length
% w
) {
63 if (cbits(c
) == RULE
|| cbits(c
) == UNDERLINE
|| cbits(c
) == ROOTEN
)
83 while ((i
= cbits(getch())) != c
&& i
!= '\n')
95 if (ismot(i
= getch()))
98 for (k
= 0; k
< NOV
&& (j
= cbits(i
= getch())) != delim
&& j
!= '\n'; k
++) {
106 for (k
= 1; o
[k
] ; k
++) {
120 *pbp
++ = makem(w
[0] / 2);
121 for (k
= 0; o
[k
]; k
++)
125 *pbp
++ = makem(-((w
[k
] + w
[k
+1]) / 2));
138 if (ismot(i
= getch()))
144 dwn
= (2 * t
.Halfline
) | MOT
| VMOT
;
146 dwn
= EM
| MOT
| VMOT
;
147 while ((k
= cbits(i
= getch())) != delim
&& k
!= '\n' && j
<= brabuf
+ NC
- 4) {
160 *--j
= *brabuf
= (cnt
* t
.Halfline
) | MOT
| NMOT
| VMOT
;
162 *--j
= *brabuf
= (cnt
* EM
) / 2 | MOT
| NMOT
| VMOT
;
171 Tchar c
, rem
, ver
, neg
;
176 if (ismot(c
= getch()))
181 i
= quant(atoi0(), VERT
);
188 if ((cbits(c
= getch())) == delim
) {
189 c
= BOXRULE
| chbits
; /*default box rule*/
202 if (v
< VERT
) /* ATT EVK hack: Erik van Konijnenburg, */
203 v
= VERT
; /* hvlpb!evkonij, ATT NSI Hilversum, Holland */
207 rem
= makem(i
% v
) | neg
;
208 ver
= makem(v
) | neg
;
212 if (absmot(rem
) != 0) {
216 while (vlp
< vlbuf
+ NC
- 3 && cnt
--) {
228 #define NPAIR (NC/2-6) /* max pairs in spline, etc. */
230 void setdraw(void) /* generate internal cookies for a drawing function */
232 int i
, j
, k
, dx
[NPAIR
], dy
[NPAIR
], delim
, type
;
233 Tchar c
, drawbuf
[NC
];
234 int drawch
= '.'; /* character to draw with */
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 */
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 ... */
249 built-up character of type c, ht x */
250 /* f dx dy ...: f is any other char: like spline */
252 if (ismot(c
= getch()))
255 numerr
.escarg
= type
= cbits(getch());
256 if (type
== '~') /* head off the .tr ~ problem */
258 for (i
= 0; i
< NPAIR
; i
++) {
262 dx
[i
] = quant(atoi0(), HOR
);
265 else if (dx
[i
] < -MAXMOT
)
274 dy
[i
] = quant(atoi0(), VERT
);
277 else if (dy
[i
] < -MAXMOT
)
280 if (cbits(c
= getch()) != ' ') { /* must be the end */
281 if (cbits(c
) != delim
) {
292 drawbuf
[0] = DRAWFCN
| chbits
| ZBIT
;
293 drawbuf
[1] = type
| chbits
| ZBIT
;
294 drawbuf
[2] = drawch
| chbits
| ZBIT
;
295 for (k
= 0, j
= 3; k
< i
; k
++) {
296 drawbuf
[j
++] = MOT
| ((dx
[k
] >= 0) ? dx
[k
] : (NMOT
| -dx
[k
]));
297 drawbuf
[j
++] = MOT
| VMOT
| ((dy
[k
] >= 0) ? dy
[k
] : (NMOT
| -dy
[k
]));
299 if (type
== DRAWELLIPSE
) {
300 drawbuf
[5] = drawbuf
[4] | NMOT
; /* so the net vertical is zero */
302 } else if (type
== DRAWBUILD
) {
303 drawbuf
[4] = drawbuf
[3] | NMOT
; /* net horizontal motion is zero */
304 drawbuf
[2] &= ~ZBIT
; /* width taken from drawing char */
307 drawbuf
[j
++] = DRAWFCN
| chbits
| ZBIT
; /* marks end for ptout */
319 gchtab
[fc
] &= ~FCBIT
;
322 if (skip() || ismot(j
= getch()) || (i
= cbits(j
)) == '\n')
326 if (skip() || ismot(ch
) || (ch
= cbits(ch
)) == fc
)
332 Tchar
setfield(int x
)
336 int length
, ws
, npad
, temp
, type
;
337 Tchar
**pp
, *padptr
[NPP
];
339 int savfc
, savtc
, savlc
;
342 static Tchar wbuf
[] = { WORDSP
, 0};
345 rchar
= tabc
| chbits
;
347 rchar
= dotc
| chbits
;
348 temp
= npad
= ws
= 0;
352 tabch
= ldrch
= fc
= IMP
;
353 savepos
= numtabp
[HP
].val
;
354 gchtab
[tabch
] &= ~TABBIT
;
355 gchtab
[ldrch
] &= ~LDRBIT
;
356 gchtab
[fc
] &= ~FCBIT
;
357 gchtab
[IMP
] |= TABBIT
|LDRBIT
|FCBIT
;
359 if ((tabtab
[j
] & TABMASK
) == 0) {
361 ERROR
"zero field width." WARN
;
365 if ((length
= ((tabtab
[j
] & TABMASK
) - numtabp
[HP
].val
)) > 0 )
368 type
= tabtab
[j
] & ~TABMASK
;
373 j
= cbits(ii
= getch());
376 numtabp
[HP
].val
+= jj
;
380 if (pp
> padptr
+ NPP
- 1)
383 } else if (j
== savfc
)
385 else if (j
== '\n') {
387 if (nlflg
&& ip
== 0) {
396 if (fp
> fbuf
+ FBUFSZ
- 3)
408 temp
= i
= (j
= length
- ws
) / npad
;
410 if ((j
-= i
* npad
) < 0)
415 for (; npad
> 0; npad
--) {
424 } else if (type
== 0) {
425 /*plain tab or leader*/
426 if ((j
= width(rchar
)) > 0) {
427 int nchar
= length
/ j
;
428 while (nchar
-->0 && pbp
< &pbbuf
[NC
-3]) {
429 numtabp
[HP
].val
+= j
;
444 while ((j
= cbits(ii
= getch())) != savtc
&& j
!= '\n' && j
!= savlc
) {
447 numtabp
[HP
].val
+= jj
;
450 if (fp
> fbuf
+ FBUFSZ
- 3)
458 length
-= ws
/ 2; /*CTAB*/
460 if ((j
= width(rchar
)) != 0 && length
> 0) {
461 int nchar
= length
/ j
;
462 while (nchar
-- > 0 && pbp
< &pbbuf
[NC
-3])
468 length
= (length
/ HOR
) * HOR
;
477 gchtab
[fc
] &= ~FCBIT
;
478 gchtab
[tabch
] &= ~TABBIT
;
479 gchtab
[ldrch
] &= ~LDRBIT
;
484 gchtab
[tabch
] = TABBIT
;
485 gchtab
[ldrch
] |= LDRBIT
;
486 numtabp
[HP
].val
= savepos
;