Blame


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"
4 5cedca1b 2004-05-15 devnull
5 5cedca1b 2004-05-15 devnull /*
6 5cedca1b 2004-05-15 devnull * troff9.c
7 fa325e9b 2020-01-10 cross *
8 5cedca1b 2004-05-15 devnull * misc functions
9 5cedca1b 2004-05-15 devnull */
10 5cedca1b 2004-05-15 devnull
11 5cedca1b 2004-05-15 devnull Tchar setz(void)
12 5cedca1b 2004-05-15 devnull {
13 5cedca1b 2004-05-15 devnull Tchar i;
14 5cedca1b 2004-05-15 devnull
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);
18 5cedca1b 2004-05-15 devnull }
19 5cedca1b 2004-05-15 devnull
20 5cedca1b 2004-05-15 devnull void setline(void)
21 5cedca1b 2004-05-15 devnull {
22 5cedca1b 2004-05-15 devnull Tchar *i;
23 5cedca1b 2004-05-15 devnull Tchar c;
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];
27 5cedca1b 2004-05-15 devnull
28 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
29 5cedca1b 2004-05-15 devnull return;
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);
37 5cedca1b 2004-05-15 devnull return;
38 5cedca1b 2004-05-15 devnull }
39 5cedca1b 2004-05-15 devnull s0:
40 5cedca1b 2004-05-15 devnull if ((j = cbits(c = getch())) == delim || j == '\n') {
41 5cedca1b 2004-05-15 devnull ch = c;
42 5cedca1b 2004-05-15 devnull c = RULE | chbits;
43 5cedca1b 2004-05-15 devnull } else if (cbits(c) == FILLER)
44 5cedca1b 2004-05-15 devnull goto s0;
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);
50 5cedca1b 2004-05-15 devnull }
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;
55 5cedca1b 2004-05-15 devnull }
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));
60 5cedca1b 2004-05-15 devnull goto s1;
61 5cedca1b 2004-05-15 devnull }
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);
66 5cedca1b 2004-05-15 devnull }
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;
71 5cedca1b 2004-05-15 devnull }
72 5cedca1b 2004-05-15 devnull s1:
73 5cedca1b 2004-05-15 devnull *i = 0;
74 5cedca1b 2004-05-15 devnull eat(delim);
75 5cedca1b 2004-05-15 devnull pushback(linebuf);
76 5cedca1b 2004-05-15 devnull }
77 5cedca1b 2004-05-15 devnull
78 c5561c23 2004-05-16 devnull int
79 5cedca1b 2004-05-15 devnull eat(int c)
80 5cedca1b 2004-05-15 devnull {
81 5cedca1b 2004-05-15 devnull int i;
82 5cedca1b 2004-05-15 devnull
83 5cedca1b 2004-05-15 devnull while ((i = cbits(getch())) != c && i != '\n')
84 5cedca1b 2004-05-15 devnull ;
85 5cedca1b 2004-05-15 devnull return(i);
86 5cedca1b 2004-05-15 devnull }
87 5cedca1b 2004-05-15 devnull
88 5cedca1b 2004-05-15 devnull
89 5cedca1b 2004-05-15 devnull void setov(void)
90 5cedca1b 2004-05-15 devnull {
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];
94 5cedca1b 2004-05-15 devnull
95 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
96 5cedca1b 2004-05-15 devnull return;
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);
101 5cedca1b 2004-05-15 devnull }
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; ) {
105 5cedca1b 2004-05-15 devnull j = 0;
106 5cedca1b 2004-05-15 devnull for (k = 1; o[k] ; k++) {
107 5cedca1b 2004-05-15 devnull if (w[k-1] < w[k]) {
108 5cedca1b 2004-05-15 devnull j++;
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;
115 5cedca1b 2004-05-15 devnull }
116 5cedca1b 2004-05-15 devnull }
117 5cedca1b 2004-05-15 devnull }
118 fa325e9b 2020-01-10 cross else
119 5cedca1b 2004-05-15 devnull return;
120 5cedca1b 2004-05-15 devnull *pbp++ = makem(w[0] / 2);
121 5cedca1b 2004-05-15 devnull for (k = 0; o[k]; k++)
122 5cedca1b 2004-05-15 devnull ;
123 5cedca1b 2004-05-15 devnull while (k>0) {
124 5cedca1b 2004-05-15 devnull k--;
125 5cedca1b 2004-05-15 devnull *pbp++ = makem(-((w[k] + w[k+1]) / 2));
126 5cedca1b 2004-05-15 devnull *pbp++ = o[k];
127 5cedca1b 2004-05-15 devnull }
128 5cedca1b 2004-05-15 devnull }
129 5cedca1b 2004-05-15 devnull
130 5cedca1b 2004-05-15 devnull
131 5cedca1b 2004-05-15 devnull void setbra(void)
132 5cedca1b 2004-05-15 devnull {
133 5cedca1b 2004-05-15 devnull int k;
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];
137 5cedca1b 2004-05-15 devnull
138 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
139 5cedca1b 2004-05-15 devnull return;
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;
145 5cedca1b 2004-05-15 devnull else
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;
150 5cedca1b 2004-05-15 devnull cnt++;
151 5cedca1b 2004-05-15 devnull }
152 5cedca1b 2004-05-15 devnull if (--cnt < 0)
153 5cedca1b 2004-05-15 devnull return;
154 5cedca1b 2004-05-15 devnull else if (!cnt) {
155 5cedca1b 2004-05-15 devnull ch = *(j - 2);
156 5cedca1b 2004-05-15 devnull return;
157 5cedca1b 2004-05-15 devnull }
158 5cedca1b 2004-05-15 devnull *j = 0;
159 5cedca1b 2004-05-15 devnull if (NROFF)
160 5cedca1b 2004-05-15 devnull *--j = *brabuf = (cnt * t.Halfline) | MOT | NMOT | VMOT;
161 5cedca1b 2004-05-15 devnull else
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);
165 5cedca1b 2004-05-15 devnull }
166 5cedca1b 2004-05-15 devnull
167 5cedca1b 2004-05-15 devnull
168 5cedca1b 2004-05-15 devnull void setvline(void)
169 5cedca1b 2004-05-15 devnull {
170 5cedca1b 2004-05-15 devnull int i;
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;
175 5cedca1b 2004-05-15 devnull
176 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
177 5cedca1b 2004-05-15 devnull return;
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;
186 5cedca1b 2004-05-15 devnull return;
187 5cedca1b 2004-05-15 devnull }
188 5cedca1b 2004-05-15 devnull if ((cbits(c = getch())) == delim) {
189 5cedca1b 2004-05-15 devnull c = BOXRULE | chbits; /*default box rule*/
190 fa325e9b 2020-01-10 cross } else
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) {
195 5cedca1b 2004-05-15 devnull i = -i;
196 5cedca1b 2004-05-15 devnull neg = NMOT;
197 5cedca1b 2004-05-15 devnull }
198 5cedca1b 2004-05-15 devnull if (NROFF)
199 5cedca1b 2004-05-15 devnull v = 2 * t.Halfline;
200 5cedca1b 2004-05-15 devnull else {
201 5cedca1b 2004-05-15 devnull v = EM;
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 */
204 5cedca1b 2004-05-15 devnull }
205 5cedca1b 2004-05-15 devnull
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;
215 5cedca1b 2004-05-15 devnull }
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;
219 5cedca1b 2004-05-15 devnull }
220 5cedca1b 2004-05-15 devnull *(vlp - 2) &= ~ZBIT;
221 5cedca1b 2004-05-15 devnull if (!neg)
222 5cedca1b 2004-05-15 devnull vlp--;
223 5cedca1b 2004-05-15 devnull *vlp = 0;
224 5cedca1b 2004-05-15 devnull pushback(vlbuf);
225 5cedca1b 2004-05-15 devnull vflag = 0;
226 5cedca1b 2004-05-15 devnull }
227 5cedca1b 2004-05-15 devnull
228 5cedca1b 2004-05-15 devnull #define NPAIR (NC/2-6) /* max pairs in spline, etc. */
229 5cedca1b 2004-05-15 devnull
230 5cedca1b 2004-05-15 devnull void setdraw(void) /* generate internal cookies for a drawing function */
231 5cedca1b 2004-05-15 devnull {
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 */
235 5cedca1b 2004-05-15 devnull
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 */
240 5cedca1b 2004-05-15 devnull
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 */
251 5cedca1b 2004-05-15 devnull
252 5cedca1b 2004-05-15 devnull if (ismot(c = getch()))
253 5cedca1b 2004-05-15 devnull return;
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++) {
259 5cedca1b 2004-05-15 devnull skip();
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;
267 5cedca1b 2004-05-15 devnull skip();
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;
271 5cedca1b 2004-05-15 devnull }
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;
279 5cedca1b 2004-05-15 devnull eat:
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();
284 5cedca1b 2004-05-15 devnull }
285 5cedca1b 2004-05-15 devnull i++;
286 5cedca1b 2004-05-15 devnull break;
287 5cedca1b 2004-05-15 devnull }
288 5cedca1b 2004-05-15 devnull }
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]));
298 5cedca1b 2004-05-15 devnull }
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 */
301 5cedca1b 2004-05-15 devnull j = 6;
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 */
305 5cedca1b 2004-05-15 devnull j = 5;
306 5cedca1b 2004-05-15 devnull }
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);
310 5cedca1b 2004-05-15 devnull }
311 5cedca1b 2004-05-15 devnull }
312 5cedca1b 2004-05-15 devnull
313 5cedca1b 2004-05-15 devnull
314 5cedca1b 2004-05-15 devnull void casefc(void)
315 5cedca1b 2004-05-15 devnull {
316 5cedca1b 2004-05-15 devnull int i;
317 5cedca1b 2004-05-15 devnull Tchar j;
318 5cedca1b 2004-05-15 devnull
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')
323 5cedca1b 2004-05-15 devnull return;
324 5cedca1b 2004-05-15 devnull fc = i;
325 5cedca1b 2004-05-15 devnull gchtab[fc] |= FCBIT;
326 5cedca1b 2004-05-15 devnull if (skip() || ismot(ch) || (ch = cbits(ch)) == fc)
327 5cedca1b 2004-05-15 devnull return;
328 5cedca1b 2004-05-15 devnull padc = ch;
329 5cedca1b 2004-05-15 devnull }
330 5cedca1b 2004-05-15 devnull
331 5cedca1b 2004-05-15 devnull
332 5cedca1b 2004-05-15 devnull Tchar setfield(int x)
333 5cedca1b 2004-05-15 devnull {
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};
343 5cedca1b 2004-05-15 devnull
344 c5561c23 2004-05-16 devnull rchar = 0;
345 fa325e9b 2020-01-10 cross if (x == tabch)
346 5cedca1b 2004-05-15 devnull rchar = tabc | chbits;
347 fa325e9b 2020-01-10 cross 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;
363 5cedca1b 2004-05-15 devnull jj = 0;
364 5cedca1b 2004-05-15 devnull goto rtn;
365 5cedca1b 2004-05-15 devnull }
366 5cedca1b 2004-05-15 devnull if ((length = ((tabtab[j] & TABMASK) - numtabp[HP].val)) > 0 )
367 5cedca1b 2004-05-15 devnull break;
368 5cedca1b 2004-05-15 devnull }
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) {
379 5cedca1b 2004-05-15 devnull npad++;
380 5cedca1b 2004-05-15 devnull *pp++ = fp;
381 5cedca1b 2004-05-15 devnull if (pp > padptr + NPP - 1)
382 5cedca1b 2004-05-15 devnull break;
383 5cedca1b 2004-05-15 devnull goto s1;
384 fa325e9b 2020-01-10 cross } else if (j == savfc)
385 5cedca1b 2004-05-15 devnull break;
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;
391 5cedca1b 2004-05-15 devnull }
392 5cedca1b 2004-05-15 devnull break;
393 5cedca1b 2004-05-15 devnull }
394 5cedca1b 2004-05-15 devnull ws += jj;
395 5cedca1b 2004-05-15 devnull s1:
396 5cedca1b 2004-05-15 devnull *fp++ = ii;
397 5cedca1b 2004-05-15 devnull if (fp > fbuf + FBUFSZ - 3)
398 5cedca1b 2004-05-15 devnull break;
399 5cedca1b 2004-05-15 devnull }
400 5cedca1b 2004-05-15 devnull if (ws)
401 5cedca1b 2004-05-15 devnull *fp++ = WORDSP;
402 5cedca1b 2004-05-15 devnull if (!npad) {
403 5cedca1b 2004-05-15 devnull npad++;
404 5cedca1b 2004-05-15 devnull *pp++ = fp;
405 5cedca1b 2004-05-15 devnull *fp++ = 0;
406 5cedca1b 2004-05-15 devnull }
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)
412 5cedca1b 2004-05-15 devnull j = -j;
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;
421 5cedca1b 2004-05-15 devnull }
422 5cedca1b 2004-05-15 devnull }
423 5cedca1b 2004-05-15 devnull pushback(fbuf);
424 5cedca1b 2004-05-15 devnull jj = 0;
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;
433 5cedca1b 2004-05-15 devnull }
434 5cedca1b 2004-05-15 devnull length %= j;
435 5cedca1b 2004-05-15 devnull }
436 5cedca1b 2004-05-15 devnull if (length)
437 5cedca1b 2004-05-15 devnull jj = length | MOT;
438 fa325e9b 2020-01-10 cross else
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 fa325e9b 2020-01-10 cross if (fp > fbuf + FBUFSZ - 3)
452 5cedca1b 2004-05-15 devnull break;
453 5cedca1b 2004-05-15 devnull }
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;
458 fa325e9b 2020-01-10 cross else
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;
466 5cedca1b 2004-05-15 devnull }
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;
475 5cedca1b 2004-05-15 devnull }
476 5cedca1b 2004-05-15 devnull }
477 5cedca1b 2004-05-15 devnull rtn:
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);
489 5cedca1b 2004-05-15 devnull }