Blame


1 cbeb0b26 2006-04-01 devnull #define _BSD_SOURCE 1 /* isascii */
2 657f699e 2016-11-20 0intro #define _DEFAULT_SOURCE 1
3 5cedca1b 2004-05-15 devnull #include "tdef.h"
4 5cedca1b 2004-05-15 devnull #include "fns.h"
5 5cedca1b 2004-05-15 devnull #include "ext.h"
6 5cedca1b 2004-05-15 devnull
7 5cedca1b 2004-05-15 devnull #ifdef STRICT
8 5cedca1b 2004-05-15 devnull /* not in ANSI or POSIX */
9 5cedca1b 2004-05-15 devnull #define isascii(a) ((a) >= 0 && (a) <= 127)
10 5cedca1b 2004-05-15 devnull #endif
11 5cedca1b 2004-05-15 devnull
12 5cedca1b 2004-05-15 devnull #define GETCH gettch
13 5cedca1b 2004-05-15 devnull Tchar gettch(void);
14 5cedca1b 2004-05-15 devnull
15 5cedca1b 2004-05-15 devnull
16 5cedca1b 2004-05-15 devnull /*
17 5cedca1b 2004-05-15 devnull * troff7.c
18 fa325e9b 2020-01-10 cross *
19 5cedca1b 2004-05-15 devnull * text
20 5cedca1b 2004-05-15 devnull */
21 5cedca1b 2004-05-15 devnull
22 5cedca1b 2004-05-15 devnull int brflg;
23 5cedca1b 2004-05-15 devnull
24 5cedca1b 2004-05-15 devnull void tbreak(void)
25 5cedca1b 2004-05-15 devnull {
26 5cedca1b 2004-05-15 devnull int pad, k;
27 5cedca1b 2004-05-15 devnull Tchar *i, j;
28 5cedca1b 2004-05-15 devnull int resol;
29 5cedca1b 2004-05-15 devnull int un0 = un;
30 5cedca1b 2004-05-15 devnull
31 5cedca1b 2004-05-15 devnull trap = 0;
32 5cedca1b 2004-05-15 devnull if (nb)
33 5cedca1b 2004-05-15 devnull return;
34 5cedca1b 2004-05-15 devnull if (dip == d && numtabp[NL].val == -1) {
35 5cedca1b 2004-05-15 devnull newline(1);
36 5cedca1b 2004-05-15 devnull return;
37 5cedca1b 2004-05-15 devnull }
38 5cedca1b 2004-05-15 devnull if (!nc) {
39 5cedca1b 2004-05-15 devnull setnel();
40 5cedca1b 2004-05-15 devnull if (!wch)
41 5cedca1b 2004-05-15 devnull return;
42 5cedca1b 2004-05-15 devnull if (pendw)
43 5cedca1b 2004-05-15 devnull getword(1);
44 5cedca1b 2004-05-15 devnull movword();
45 5cedca1b 2004-05-15 devnull } else if (pendw && !brflg) {
46 5cedca1b 2004-05-15 devnull getword(1);
47 5cedca1b 2004-05-15 devnull movword();
48 5cedca1b 2004-05-15 devnull }
49 5cedca1b 2004-05-15 devnull *linep = dip->nls = 0;
50 5cedca1b 2004-05-15 devnull if (NROFF && dip == d)
51 5cedca1b 2004-05-15 devnull horiz(po);
52 5cedca1b 2004-05-15 devnull if (lnmod)
53 5cedca1b 2004-05-15 devnull donum();
54 5cedca1b 2004-05-15 devnull lastl = ne;
55 5cedca1b 2004-05-15 devnull if (brflg != 1) {
56 5cedca1b 2004-05-15 devnull totout = 0;
57 5cedca1b 2004-05-15 devnull } else if (ad) {
58 5cedca1b 2004-05-15 devnull if ((lastl = ll - un) < ne)
59 5cedca1b 2004-05-15 devnull lastl = ne;
60 5cedca1b 2004-05-15 devnull }
61 5cedca1b 2004-05-15 devnull if (admod && ad && (brflg != 2)) {
62 5cedca1b 2004-05-15 devnull lastl = ne;
63 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
64 5cedca1b 2004-05-15 devnull if (admod == 1)
65 5cedca1b 2004-05-15 devnull un += quant(nel / 2, HOR);
66 5cedca1b 2004-05-15 devnull else if (admod == 2)
67 5cedca1b 2004-05-15 devnull un += nel;
68 5cedca1b 2004-05-15 devnull }
69 5cedca1b 2004-05-15 devnull totout++;
70 5cedca1b 2004-05-15 devnull brflg = 0;
71 5cedca1b 2004-05-15 devnull if (lastl + un > dip->maxl)
72 5cedca1b 2004-05-15 devnull dip->maxl = lastl + un;
73 5cedca1b 2004-05-15 devnull horiz(un);
74 5cedca1b 2004-05-15 devnull if (NROFF) {
75 5cedca1b 2004-05-15 devnull if (adrem % t.Adj)
76 fa325e9b 2020-01-10 cross resol = t.Hor;
77 fa325e9b 2020-01-10 cross else
78 5cedca1b 2004-05-15 devnull resol = t.Adj;
79 5cedca1b 2004-05-15 devnull } else
80 5cedca1b 2004-05-15 devnull resol = HOR;
81 5cedca1b 2004-05-15 devnull
82 5cedca1b 2004-05-15 devnull lastl = ne + (nwd-1) * adsp + adrem;
83 5cedca1b 2004-05-15 devnull for (i = line; nc > 0; ) {
84 5cedca1b 2004-05-15 devnull if ((cbits(j = *i++)) == ' ') {
85 5cedca1b 2004-05-15 devnull pad = 0;
86 5cedca1b 2004-05-15 devnull do {
87 5cedca1b 2004-05-15 devnull pad += width(j);
88 5cedca1b 2004-05-15 devnull nc--;
89 5cedca1b 2004-05-15 devnull } while ((cbits(j = *i++)) == ' ');
90 5cedca1b 2004-05-15 devnull i--;
91 5cedca1b 2004-05-15 devnull pad += adsp;
92 5cedca1b 2004-05-15 devnull --nwd;
93 5cedca1b 2004-05-15 devnull if (adrem) {
94 5cedca1b 2004-05-15 devnull if (adrem < 0) {
95 5cedca1b 2004-05-15 devnull pad -= resol;
96 5cedca1b 2004-05-15 devnull adrem += resol;
97 5cedca1b 2004-05-15 devnull } else if ((totout & 01) || adrem / resol >= nwd) {
98 5cedca1b 2004-05-15 devnull pad += resol;
99 5cedca1b 2004-05-15 devnull adrem -= resol;
100 5cedca1b 2004-05-15 devnull }
101 5cedca1b 2004-05-15 devnull }
102 5cedca1b 2004-05-15 devnull pchar((Tchar) WORDSP);
103 5cedca1b 2004-05-15 devnull horiz(pad);
104 5cedca1b 2004-05-15 devnull } else {
105 5cedca1b 2004-05-15 devnull pchar(j);
106 5cedca1b 2004-05-15 devnull nc--;
107 5cedca1b 2004-05-15 devnull }
108 5cedca1b 2004-05-15 devnull }
109 5cedca1b 2004-05-15 devnull if (ic) {
110 5cedca1b 2004-05-15 devnull if ((k = ll - un0 - lastl + ics) > 0)
111 5cedca1b 2004-05-15 devnull horiz(k);
112 5cedca1b 2004-05-15 devnull pchar(ic);
113 5cedca1b 2004-05-15 devnull }
114 5cedca1b 2004-05-15 devnull if (icf)
115 5cedca1b 2004-05-15 devnull icf++;
116 fa325e9b 2020-01-10 cross else
117 5cedca1b 2004-05-15 devnull ic = 0;
118 5cedca1b 2004-05-15 devnull ne = nwd = 0;
119 5cedca1b 2004-05-15 devnull un = in;
120 5cedca1b 2004-05-15 devnull setnel();
121 5cedca1b 2004-05-15 devnull newline(0);
122 5cedca1b 2004-05-15 devnull if (dip != d) {
123 5cedca1b 2004-05-15 devnull if (dip->dnl > dip->hnl)
124 5cedca1b 2004-05-15 devnull dip->hnl = dip->dnl;
125 5cedca1b 2004-05-15 devnull } else {
126 5cedca1b 2004-05-15 devnull if (numtabp[NL].val > dip->hnl)
127 5cedca1b 2004-05-15 devnull dip->hnl = numtabp[NL].val;
128 5cedca1b 2004-05-15 devnull }
129 5cedca1b 2004-05-15 devnull for (k = ls - 1; k > 0 && !trap; k--)
130 5cedca1b 2004-05-15 devnull newline(0);
131 5cedca1b 2004-05-15 devnull spread = 0;
132 5cedca1b 2004-05-15 devnull }
133 5cedca1b 2004-05-15 devnull
134 5cedca1b 2004-05-15 devnull void donum(void)
135 5cedca1b 2004-05-15 devnull {
136 5cedca1b 2004-05-15 devnull int i, nw;
137 5cedca1b 2004-05-15 devnull int lnv = numtabp[LN].val;
138 5cedca1b 2004-05-15 devnull
139 5cedca1b 2004-05-15 devnull nrbits = nmbits;
140 5cedca1b 2004-05-15 devnull nw = width('1' | nrbits);
141 5cedca1b 2004-05-15 devnull if (nn) {
142 5cedca1b 2004-05-15 devnull nn--;
143 5cedca1b 2004-05-15 devnull goto d1;
144 5cedca1b 2004-05-15 devnull }
145 5cedca1b 2004-05-15 devnull if (lnv % ndf) {
146 5cedca1b 2004-05-15 devnull numtabp[LN].val++;
147 5cedca1b 2004-05-15 devnull d1:
148 5cedca1b 2004-05-15 devnull un += nw * (nmwid + nms + ni);
149 5cedca1b 2004-05-15 devnull return;
150 5cedca1b 2004-05-15 devnull }
151 5cedca1b 2004-05-15 devnull i = 0;
152 5cedca1b 2004-05-15 devnull do { /* count digits in numtabp[LN].val */
153 5cedca1b 2004-05-15 devnull i++;
154 5cedca1b 2004-05-15 devnull } while ((lnv /= 10) > 0);
155 5cedca1b 2004-05-15 devnull horiz(nw * (ni + max(nmwid-i, 0)));
156 5cedca1b 2004-05-15 devnull nform = 0;
157 5cedca1b 2004-05-15 devnull fnumb(numtabp[LN].val, pchar);
158 5cedca1b 2004-05-15 devnull un += nw * nms;
159 5cedca1b 2004-05-15 devnull numtabp[LN].val++;
160 5cedca1b 2004-05-15 devnull }
161 5cedca1b 2004-05-15 devnull
162 5cedca1b 2004-05-15 devnull
163 5cedca1b 2004-05-15 devnull void text(void)
164 5cedca1b 2004-05-15 devnull {
165 5cedca1b 2004-05-15 devnull Tchar i;
166 5cedca1b 2004-05-15 devnull static int spcnt;
167 5cedca1b 2004-05-15 devnull
168 5cedca1b 2004-05-15 devnull nflush++;
169 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
170 5cedca1b 2004-05-15 devnull if ((dip == d) && (numtabp[NL].val == -1)) {
171 fa325e9b 2020-01-10 cross newline(1);
172 5cedca1b 2004-05-15 devnull return;
173 5cedca1b 2004-05-15 devnull }
174 5cedca1b 2004-05-15 devnull setnel();
175 5cedca1b 2004-05-15 devnull if (ce || !fi) {
176 5cedca1b 2004-05-15 devnull nofill();
177 5cedca1b 2004-05-15 devnull return;
178 5cedca1b 2004-05-15 devnull }
179 5cedca1b 2004-05-15 devnull if (pendw)
180 5cedca1b 2004-05-15 devnull goto t4;
181 5cedca1b 2004-05-15 devnull if (pendt)
182 5cedca1b 2004-05-15 devnull if (spcnt)
183 fa325e9b 2020-01-10 cross goto t2;
184 fa325e9b 2020-01-10 cross else
185 5cedca1b 2004-05-15 devnull goto t3;
186 5cedca1b 2004-05-15 devnull pendt++;
187 5cedca1b 2004-05-15 devnull if (spcnt)
188 5cedca1b 2004-05-15 devnull goto t2;
189 5cedca1b 2004-05-15 devnull while ((cbits(i = GETCH())) == ' ') {
190 5cedca1b 2004-05-15 devnull spcnt++;
191 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
192 5cedca1b 2004-05-15 devnull widthp = sps;
193 5cedca1b 2004-05-15 devnull }
194 5cedca1b 2004-05-15 devnull if (nlflg) {
195 5cedca1b 2004-05-15 devnull t1:
196 5cedca1b 2004-05-15 devnull nflush = pendt = ch = spcnt = 0;
197 5cedca1b 2004-05-15 devnull callsp();
198 5cedca1b 2004-05-15 devnull return;
199 5cedca1b 2004-05-15 devnull }
200 5cedca1b 2004-05-15 devnull ch = i;
201 5cedca1b 2004-05-15 devnull if (spcnt) {
202 5cedca1b 2004-05-15 devnull t2:
203 5cedca1b 2004-05-15 devnull tbreak();
204 5cedca1b 2004-05-15 devnull if (nc || wch)
205 5cedca1b 2004-05-15 devnull goto rtn;
206 5cedca1b 2004-05-15 devnull un += spcnt * sps;
207 5cedca1b 2004-05-15 devnull spcnt = 0;
208 5cedca1b 2004-05-15 devnull setnel();
209 5cedca1b 2004-05-15 devnull if (trap)
210 5cedca1b 2004-05-15 devnull goto rtn;
211 5cedca1b 2004-05-15 devnull if (nlflg)
212 5cedca1b 2004-05-15 devnull goto t1;
213 5cedca1b 2004-05-15 devnull }
214 5cedca1b 2004-05-15 devnull t3:
215 5cedca1b 2004-05-15 devnull if (spread)
216 5cedca1b 2004-05-15 devnull goto t5;
217 5cedca1b 2004-05-15 devnull if (pendw || !wch)
218 5cedca1b 2004-05-15 devnull t4:
219 5cedca1b 2004-05-15 devnull if (getword(0))
220 5cedca1b 2004-05-15 devnull goto t6;
221 5cedca1b 2004-05-15 devnull if (!movword())
222 5cedca1b 2004-05-15 devnull goto t3;
223 5cedca1b 2004-05-15 devnull t5:
224 5cedca1b 2004-05-15 devnull if (nlflg)
225 5cedca1b 2004-05-15 devnull pendt = 0;
226 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
227 5cedca1b 2004-05-15 devnull if (ad) {
228 5cedca1b 2004-05-15 devnull if (nwd == 1)
229 fa325e9b 2020-01-10 cross adsp = nel;
230 fa325e9b 2020-01-10 cross else
231 5cedca1b 2004-05-15 devnull adsp = nel / (nwd - 1);
232 5cedca1b 2004-05-15 devnull adsp = (adsp / HOR) * HOR;
233 5cedca1b 2004-05-15 devnull adrem = nel - adsp*(nwd-1);
234 5cedca1b 2004-05-15 devnull }
235 5cedca1b 2004-05-15 devnull brflg = 1;
236 5cedca1b 2004-05-15 devnull tbreak();
237 5cedca1b 2004-05-15 devnull spread = 0;
238 5cedca1b 2004-05-15 devnull if (!trap)
239 5cedca1b 2004-05-15 devnull goto t3;
240 5cedca1b 2004-05-15 devnull if (!nlflg)
241 5cedca1b 2004-05-15 devnull goto rtn;
242 5cedca1b 2004-05-15 devnull t6:
243 5cedca1b 2004-05-15 devnull pendt = 0;
244 5cedca1b 2004-05-15 devnull ckul();
245 5cedca1b 2004-05-15 devnull rtn:
246 5cedca1b 2004-05-15 devnull nflush = 0;
247 5cedca1b 2004-05-15 devnull }
248 5cedca1b 2004-05-15 devnull
249 5cedca1b 2004-05-15 devnull
250 5cedca1b 2004-05-15 devnull void nofill(void)
251 5cedca1b 2004-05-15 devnull {
252 5cedca1b 2004-05-15 devnull int j;
253 5cedca1b 2004-05-15 devnull Tchar i;
254 5cedca1b 2004-05-15 devnull
255 5cedca1b 2004-05-15 devnull if (!pendnf) {
256 5cedca1b 2004-05-15 devnull over = 0;
257 5cedca1b 2004-05-15 devnull tbreak();
258 5cedca1b 2004-05-15 devnull if (trap)
259 5cedca1b 2004-05-15 devnull goto rtn;
260 5cedca1b 2004-05-15 devnull if (nlflg) {
261 5cedca1b 2004-05-15 devnull ch = nflush = 0;
262 5cedca1b 2004-05-15 devnull callsp();
263 5cedca1b 2004-05-15 devnull return;
264 5cedca1b 2004-05-15 devnull }
265 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
266 5cedca1b 2004-05-15 devnull nwd = 10000;
267 5cedca1b 2004-05-15 devnull }
268 5cedca1b 2004-05-15 devnull while ((j = (cbits(i = GETCH()))) != '\n') {
269 5cedca1b 2004-05-15 devnull if (j == ohc)
270 5cedca1b 2004-05-15 devnull continue;
271 5cedca1b 2004-05-15 devnull if (j == CONT) {
272 5cedca1b 2004-05-15 devnull pendnf++;
273 5cedca1b 2004-05-15 devnull nflush = 0;
274 5cedca1b 2004-05-15 devnull flushi();
275 5cedca1b 2004-05-15 devnull ckul();
276 5cedca1b 2004-05-15 devnull return;
277 5cedca1b 2004-05-15 devnull }
278 5cedca1b 2004-05-15 devnull j = width(i);
279 5cedca1b 2004-05-15 devnull widthp = j;
280 5cedca1b 2004-05-15 devnull numtabp[HP].val += j;
281 5cedca1b 2004-05-15 devnull storeline(i, j);
282 5cedca1b 2004-05-15 devnull }
283 5cedca1b 2004-05-15 devnull if (ce) {
284 5cedca1b 2004-05-15 devnull ce--;
285 5cedca1b 2004-05-15 devnull if ((i = quant(nel / 2, HOR)) > 0)
286 5cedca1b 2004-05-15 devnull un += i;
287 5cedca1b 2004-05-15 devnull }
288 5cedca1b 2004-05-15 devnull if (!nc)
289 5cedca1b 2004-05-15 devnull storeline((Tchar)FILLER, 0);
290 5cedca1b 2004-05-15 devnull brflg = 2;
291 5cedca1b 2004-05-15 devnull tbreak();
292 5cedca1b 2004-05-15 devnull ckul();
293 5cedca1b 2004-05-15 devnull rtn:
294 5cedca1b 2004-05-15 devnull pendnf = nflush = 0;
295 5cedca1b 2004-05-15 devnull }
296 5cedca1b 2004-05-15 devnull
297 5cedca1b 2004-05-15 devnull
298 5cedca1b 2004-05-15 devnull void callsp(void)
299 5cedca1b 2004-05-15 devnull {
300 5cedca1b 2004-05-15 devnull int i;
301 5cedca1b 2004-05-15 devnull
302 5cedca1b 2004-05-15 devnull if (flss)
303 fa325e9b 2020-01-10 cross i = flss;
304 fa325e9b 2020-01-10 cross else
305 5cedca1b 2004-05-15 devnull i = lss;
306 5cedca1b 2004-05-15 devnull flss = 0;
307 5cedca1b 2004-05-15 devnull casesp1(i);
308 5cedca1b 2004-05-15 devnull }
309 5cedca1b 2004-05-15 devnull
310 5cedca1b 2004-05-15 devnull
311 5cedca1b 2004-05-15 devnull void ckul(void)
312 5cedca1b 2004-05-15 devnull {
313 5cedca1b 2004-05-15 devnull if (ul && (--ul == 0)) {
314 5cedca1b 2004-05-15 devnull cu = 0;
315 5cedca1b 2004-05-15 devnull font = sfont;
316 5cedca1b 2004-05-15 devnull mchbits();
317 5cedca1b 2004-05-15 devnull }
318 5cedca1b 2004-05-15 devnull if (it && --it == 0 && itmac)
319 5cedca1b 2004-05-15 devnull control(itmac, 0);
320 5cedca1b 2004-05-15 devnull }
321 5cedca1b 2004-05-15 devnull
322 5cedca1b 2004-05-15 devnull
323 5cedca1b 2004-05-15 devnull void storeline(Tchar c, int w)
324 5cedca1b 2004-05-15 devnull {
325 5cedca1b 2004-05-15 devnull int diff;
326 5cedca1b 2004-05-15 devnull
327 5cedca1b 2004-05-15 devnull if (linep >= line + lnsize - 2) {
328 5cedca1b 2004-05-15 devnull lnsize += LNSIZE;
329 5cedca1b 2004-05-15 devnull diff = linep - line;
330 5cedca1b 2004-05-15 devnull if (( line = (Tchar *)realloc((char *)line, lnsize * sizeof(Tchar))) != NULL) {
331 5cedca1b 2004-05-15 devnull if (linep && diff)
332 5cedca1b 2004-05-15 devnull linep = line + diff;
333 5cedca1b 2004-05-15 devnull } else {
334 5cedca1b 2004-05-15 devnull if (over) {
335 5cedca1b 2004-05-15 devnull return;
336 5cedca1b 2004-05-15 devnull } else {
337 5cedca1b 2004-05-15 devnull flusho();
338 5cedca1b 2004-05-15 devnull ERROR "Line overflow." WARN;
339 5cedca1b 2004-05-15 devnull over++;
340 5cedca1b 2004-05-15 devnull *linep++ = LEFTHAND;
341 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
342 5cedca1b 2004-05-15 devnull nc++;
343 5cedca1b 2004-05-15 devnull c = '\n';
344 5cedca1b 2004-05-15 devnull }
345 5cedca1b 2004-05-15 devnull }
346 5cedca1b 2004-05-15 devnull }
347 5cedca1b 2004-05-15 devnull *linep++ = c;
348 5cedca1b 2004-05-15 devnull ne += w;
349 5cedca1b 2004-05-15 devnull nel -= w;
350 5cedca1b 2004-05-15 devnull nc++;
351 5cedca1b 2004-05-15 devnull }
352 5cedca1b 2004-05-15 devnull
353 5cedca1b 2004-05-15 devnull
354 5cedca1b 2004-05-15 devnull void newline(int a)
355 5cedca1b 2004-05-15 devnull {
356 5cedca1b 2004-05-15 devnull int i, j, nlss;
357 5cedca1b 2004-05-15 devnull int opn;
358 5cedca1b 2004-05-15 devnull
359 c5561c23 2004-05-16 devnull nlss = 0;
360 5cedca1b 2004-05-15 devnull if (a)
361 5cedca1b 2004-05-15 devnull goto nl1;
362 5cedca1b 2004-05-15 devnull if (dip != d) {
363 5cedca1b 2004-05-15 devnull j = lss;
364 5cedca1b 2004-05-15 devnull pchar1((Tchar)FLSS);
365 5cedca1b 2004-05-15 devnull if (flss)
366 5cedca1b 2004-05-15 devnull lss = flss;
367 5cedca1b 2004-05-15 devnull i = lss + dip->blss;
368 5cedca1b 2004-05-15 devnull dip->dnl += i;
369 5cedca1b 2004-05-15 devnull pchar1((Tchar)i);
370 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
371 5cedca1b 2004-05-15 devnull lss = j;
372 5cedca1b 2004-05-15 devnull dip->blss = flss = 0;
373 5cedca1b 2004-05-15 devnull if (dip->alss) {
374 5cedca1b 2004-05-15 devnull pchar1((Tchar)FLSS);
375 5cedca1b 2004-05-15 devnull pchar1((Tchar)dip->alss);
376 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
377 5cedca1b 2004-05-15 devnull dip->dnl += dip->alss;
378 5cedca1b 2004-05-15 devnull dip->alss = 0;
379 5cedca1b 2004-05-15 devnull }
380 5cedca1b 2004-05-15 devnull if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac)
381 5cedca1b 2004-05-15 devnull if (control(dip->dimac, 0)) {
382 fa325e9b 2020-01-10 cross trap++;
383 5cedca1b 2004-05-15 devnull dip->ditf++;
384 5cedca1b 2004-05-15 devnull }
385 5cedca1b 2004-05-15 devnull return;
386 5cedca1b 2004-05-15 devnull }
387 5cedca1b 2004-05-15 devnull j = lss;
388 5cedca1b 2004-05-15 devnull if (flss)
389 5cedca1b 2004-05-15 devnull lss = flss;
390 5cedca1b 2004-05-15 devnull nlss = dip->alss + dip->blss + lss;
391 5cedca1b 2004-05-15 devnull numtabp[NL].val += nlss;
392 5cedca1b 2004-05-15 devnull if (TROFF && ascii) {
393 5cedca1b 2004-05-15 devnull dip->alss = dip->blss = 0;
394 5cedca1b 2004-05-15 devnull }
395 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
396 5cedca1b 2004-05-15 devnull flss = 0;
397 5cedca1b 2004-05-15 devnull lss = j;
398 5cedca1b 2004-05-15 devnull if (numtabp[NL].val < pl)
399 5cedca1b 2004-05-15 devnull goto nl2;
400 5cedca1b 2004-05-15 devnull nl1:
401 5cedca1b 2004-05-15 devnull ejf = dip->hnl = numtabp[NL].val = 0;
402 5cedca1b 2004-05-15 devnull ejl = frame;
403 5cedca1b 2004-05-15 devnull if (donef) {
404 5cedca1b 2004-05-15 devnull if ((!nc && !wch) || ndone)
405 5cedca1b 2004-05-15 devnull done1(0);
406 5cedca1b 2004-05-15 devnull ndone++;
407 5cedca1b 2004-05-15 devnull donef = 0;
408 5cedca1b 2004-05-15 devnull if (frame == stk)
409 5cedca1b 2004-05-15 devnull nflush++;
410 5cedca1b 2004-05-15 devnull }
411 5cedca1b 2004-05-15 devnull opn = numtabp[PN].val;
412 5cedca1b 2004-05-15 devnull numtabp[PN].val++;
413 5cedca1b 2004-05-15 devnull if (npnflg) {
414 5cedca1b 2004-05-15 devnull numtabp[PN].val = npn;
415 5cedca1b 2004-05-15 devnull npn = npnflg = 0;
416 5cedca1b 2004-05-15 devnull }
417 5cedca1b 2004-05-15 devnull nlpn:
418 5cedca1b 2004-05-15 devnull if (numtabp[PN].val == pfrom) {
419 5cedca1b 2004-05-15 devnull print++;
420 5cedca1b 2004-05-15 devnull pfrom = -1;
421 5cedca1b 2004-05-15 devnull } else if (opn == pto) {
422 5cedca1b 2004-05-15 devnull print = 0;
423 5cedca1b 2004-05-15 devnull opn = -1;
424 5cedca1b 2004-05-15 devnull chkpn();
425 5cedca1b 2004-05-15 devnull goto nlpn;
426 5cedca1b 2004-05-15 devnull }
427 5cedca1b 2004-05-15 devnull if (print)
428 5cedca1b 2004-05-15 devnull ptpage(numtabp[PN].val); /* supposedly in a clean state so can pause */
429 5cedca1b 2004-05-15 devnull if (stop && print) {
430 5cedca1b 2004-05-15 devnull dpn++;
431 5cedca1b 2004-05-15 devnull if (dpn >= stop) {
432 5cedca1b 2004-05-15 devnull dpn = 0;
433 5cedca1b 2004-05-15 devnull ptpause();
434 5cedca1b 2004-05-15 devnull }
435 5cedca1b 2004-05-15 devnull }
436 5cedca1b 2004-05-15 devnull nl2:
437 5cedca1b 2004-05-15 devnull trap = 0;
438 5cedca1b 2004-05-15 devnull if (numtabp[NL].val == 0) {
439 5cedca1b 2004-05-15 devnull if ((j = findn(0)) != NTRAP)
440 5cedca1b 2004-05-15 devnull trap = control(mlist[j], 0);
441 5cedca1b 2004-05-15 devnull } else if ((i = findt(numtabp[NL].val - nlss)) <= nlss) {
442 5cedca1b 2004-05-15 devnull if ((j = findn1(numtabp[NL].val - nlss + i)) == NTRAP) {
443 5cedca1b 2004-05-15 devnull flusho();
444 5cedca1b 2004-05-15 devnull ERROR "Trap botch." WARN;
445 5cedca1b 2004-05-15 devnull done2(-5);
446 5cedca1b 2004-05-15 devnull }
447 5cedca1b 2004-05-15 devnull trap = control(mlist[j], 0);
448 5cedca1b 2004-05-15 devnull }
449 5cedca1b 2004-05-15 devnull }
450 5cedca1b 2004-05-15 devnull
451 c5561c23 2004-05-16 devnull int
452 5cedca1b 2004-05-15 devnull findn1(int a)
453 5cedca1b 2004-05-15 devnull {
454 5cedca1b 2004-05-15 devnull int i, j;
455 5cedca1b 2004-05-15 devnull
456 5cedca1b 2004-05-15 devnull for (i = 0; i < NTRAP; i++) {
457 5cedca1b 2004-05-15 devnull if (mlist[i]) {
458 5cedca1b 2004-05-15 devnull if ((j = nlist[i]) < 0)
459 5cedca1b 2004-05-15 devnull j += pl;
460 5cedca1b 2004-05-15 devnull if (j == a)
461 5cedca1b 2004-05-15 devnull break;
462 5cedca1b 2004-05-15 devnull }
463 5cedca1b 2004-05-15 devnull }
464 5cedca1b 2004-05-15 devnull return(i);
465 5cedca1b 2004-05-15 devnull }
466 5cedca1b 2004-05-15 devnull
467 5cedca1b 2004-05-15 devnull
468 5cedca1b 2004-05-15 devnull void chkpn(void)
469 5cedca1b 2004-05-15 devnull {
470 5cedca1b 2004-05-15 devnull pto = *(pnp++);
471 5cedca1b 2004-05-15 devnull pfrom = pto>=0 ? pto : -pto;
472 5cedca1b 2004-05-15 devnull if (pto == -INT_MAX) {
473 5cedca1b 2004-05-15 devnull flusho();
474 5cedca1b 2004-05-15 devnull done1(0);
475 5cedca1b 2004-05-15 devnull }
476 5cedca1b 2004-05-15 devnull if (pto < 0) {
477 5cedca1b 2004-05-15 devnull pto = -pto;
478 5cedca1b 2004-05-15 devnull print++;
479 5cedca1b 2004-05-15 devnull pfrom = 0;
480 5cedca1b 2004-05-15 devnull }
481 5cedca1b 2004-05-15 devnull }
482 5cedca1b 2004-05-15 devnull
483 c5561c23 2004-05-16 devnull int
484 5cedca1b 2004-05-15 devnull findt(int a)
485 5cedca1b 2004-05-15 devnull {
486 5cedca1b 2004-05-15 devnull int i, j, k;
487 5cedca1b 2004-05-15 devnull
488 5cedca1b 2004-05-15 devnull k = INT_MAX;
489 5cedca1b 2004-05-15 devnull if (dip != d) {
490 5cedca1b 2004-05-15 devnull if (dip->dimac && (i = dip->ditrap - a) > 0)
491 5cedca1b 2004-05-15 devnull k = i;
492 5cedca1b 2004-05-15 devnull return(k);
493 5cedca1b 2004-05-15 devnull }
494 5cedca1b 2004-05-15 devnull for (i = 0; i < NTRAP; i++) {
495 5cedca1b 2004-05-15 devnull if (mlist[i]) {
496 5cedca1b 2004-05-15 devnull if ((j = nlist[i]) < 0)
497 5cedca1b 2004-05-15 devnull j += pl;
498 5cedca1b 2004-05-15 devnull if ((j -= a) <= 0)
499 5cedca1b 2004-05-15 devnull continue;
500 5cedca1b 2004-05-15 devnull if (j < k)
501 5cedca1b 2004-05-15 devnull k = j;
502 5cedca1b 2004-05-15 devnull }
503 5cedca1b 2004-05-15 devnull }
504 5cedca1b 2004-05-15 devnull i = pl - a;
505 5cedca1b 2004-05-15 devnull if (k > i)
506 5cedca1b 2004-05-15 devnull k = i;
507 5cedca1b 2004-05-15 devnull return(k);
508 5cedca1b 2004-05-15 devnull }
509 5cedca1b 2004-05-15 devnull
510 c5561c23 2004-05-16 devnull int
511 5cedca1b 2004-05-15 devnull findt1(void)
512 5cedca1b 2004-05-15 devnull {
513 5cedca1b 2004-05-15 devnull int i;
514 5cedca1b 2004-05-15 devnull
515 5cedca1b 2004-05-15 devnull if (dip != d)
516 5cedca1b 2004-05-15 devnull i = dip->dnl;
517 fa325e9b 2020-01-10 cross else
518 5cedca1b 2004-05-15 devnull i = numtabp[NL].val;
519 5cedca1b 2004-05-15 devnull return(findt(i));
520 5cedca1b 2004-05-15 devnull }
521 5cedca1b 2004-05-15 devnull
522 5cedca1b 2004-05-15 devnull
523 5cedca1b 2004-05-15 devnull void eject(Stack *a)
524 5cedca1b 2004-05-15 devnull {
525 5cedca1b 2004-05-15 devnull int savlss;
526 5cedca1b 2004-05-15 devnull
527 5cedca1b 2004-05-15 devnull if (dip != d)
528 5cedca1b 2004-05-15 devnull return;
529 5cedca1b 2004-05-15 devnull ejf++;
530 5cedca1b 2004-05-15 devnull if (a)
531 5cedca1b 2004-05-15 devnull ejl = a;
532 fa325e9b 2020-01-10 cross else
533 5cedca1b 2004-05-15 devnull ejl = frame;
534 5cedca1b 2004-05-15 devnull if (trap)
535 5cedca1b 2004-05-15 devnull return;
536 5cedca1b 2004-05-15 devnull e1:
537 5cedca1b 2004-05-15 devnull savlss = lss;
538 5cedca1b 2004-05-15 devnull lss = findt(numtabp[NL].val);
539 5cedca1b 2004-05-15 devnull newline(0);
540 5cedca1b 2004-05-15 devnull lss = savlss;
541 5cedca1b 2004-05-15 devnull if (numtabp[NL].val && !trap)
542 5cedca1b 2004-05-15 devnull goto e1;
543 5cedca1b 2004-05-15 devnull }
544 5cedca1b 2004-05-15 devnull
545 c5561c23 2004-05-16 devnull int
546 5cedca1b 2004-05-15 devnull movword(void)
547 5cedca1b 2004-05-15 devnull {
548 5cedca1b 2004-05-15 devnull int w;
549 5cedca1b 2004-05-15 devnull Tchar i, *wp;
550 5cedca1b 2004-05-15 devnull int savwch, hys;
551 5cedca1b 2004-05-15 devnull
552 5cedca1b 2004-05-15 devnull over = 0;
553 5cedca1b 2004-05-15 devnull wp = wordp;
554 5cedca1b 2004-05-15 devnull if (!nwd) {
555 5cedca1b 2004-05-15 devnull while (cbits(*wp++) == ' ') {
556 5cedca1b 2004-05-15 devnull wch--;
557 5cedca1b 2004-05-15 devnull wne -= sps;
558 5cedca1b 2004-05-15 devnull }
559 5cedca1b 2004-05-15 devnull wp--;
560 5cedca1b 2004-05-15 devnull }
561 5cedca1b 2004-05-15 devnull if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) &&
562 5cedca1b 2004-05-15 devnull (!(hyf & 02) || (findt1() > lss)))
563 5cedca1b 2004-05-15 devnull hyphen(wp);
564 5cedca1b 2004-05-15 devnull savwch = wch;
565 5cedca1b 2004-05-15 devnull hyp = hyptr;
566 5cedca1b 2004-05-15 devnull nhyp = 0;
567 5cedca1b 2004-05-15 devnull while (*hyp && *hyp <= wp)
568 5cedca1b 2004-05-15 devnull hyp++;
569 5cedca1b 2004-05-15 devnull while (wch) {
570 5cedca1b 2004-05-15 devnull if (hyoff != 1 && *hyp == wp) {
571 5cedca1b 2004-05-15 devnull hyp++;
572 5cedca1b 2004-05-15 devnull if (!wdstart || (wp > wdstart + 1 && wp < wdend &&
573 5cedca1b 2004-05-15 devnull (!(hyf & 04) || wp < wdend - 1) && /* 04 => last 2 */
574 5cedca1b 2004-05-15 devnull (!(hyf & 010) || wp > wdstart + 2))) { /* 010 => 1st 2 */
575 5cedca1b 2004-05-15 devnull nhyp++;
576 5cedca1b 2004-05-15 devnull storeline((Tchar)IMP, 0);
577 5cedca1b 2004-05-15 devnull }
578 5cedca1b 2004-05-15 devnull }
579 5cedca1b 2004-05-15 devnull i = *wp++;
580 5cedca1b 2004-05-15 devnull w = width(i);
581 5cedca1b 2004-05-15 devnull wne -= w;
582 5cedca1b 2004-05-15 devnull wch--;
583 5cedca1b 2004-05-15 devnull storeline(i, w);
584 5cedca1b 2004-05-15 devnull }
585 5cedca1b 2004-05-15 devnull if (nel >= 0) {
586 5cedca1b 2004-05-15 devnull nwd++;
587 5cedca1b 2004-05-15 devnull return(0); /* line didn't fill up */
588 5cedca1b 2004-05-15 devnull }
589 5cedca1b 2004-05-15 devnull if (TROFF)
590 5cedca1b 2004-05-15 devnull xbits((Tchar)HYPHEN, 1);
591 5cedca1b 2004-05-15 devnull hys = width((Tchar)HYPHEN);
592 5cedca1b 2004-05-15 devnull m1:
593 5cedca1b 2004-05-15 devnull if (!nhyp) {
594 5cedca1b 2004-05-15 devnull if (!nwd)
595 5cedca1b 2004-05-15 devnull goto m3;
596 5cedca1b 2004-05-15 devnull if (wch == savwch)
597 5cedca1b 2004-05-15 devnull goto m4;
598 5cedca1b 2004-05-15 devnull }
599 5cedca1b 2004-05-15 devnull if (*--linep != IMP)
600 5cedca1b 2004-05-15 devnull goto m5;
601 5cedca1b 2004-05-15 devnull if (!(--nhyp))
602 5cedca1b 2004-05-15 devnull if (!nwd)
603 5cedca1b 2004-05-15 devnull goto m2;
604 5cedca1b 2004-05-15 devnull if (nel < hys) {
605 5cedca1b 2004-05-15 devnull nc--;
606 5cedca1b 2004-05-15 devnull goto m1;
607 5cedca1b 2004-05-15 devnull }
608 5cedca1b 2004-05-15 devnull m2:
609 5cedca1b 2004-05-15 devnull if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) {
610 5cedca1b 2004-05-15 devnull *linep = (*(linep - 1) & SFMASK) | HYPHEN;
611 5cedca1b 2004-05-15 devnull w = width(*linep);
612 5cedca1b 2004-05-15 devnull nel -= w;
613 5cedca1b 2004-05-15 devnull ne += w;
614 5cedca1b 2004-05-15 devnull linep++;
615 5cedca1b 2004-05-15 devnull }
616 5cedca1b 2004-05-15 devnull m3:
617 5cedca1b 2004-05-15 devnull nwd++;
618 5cedca1b 2004-05-15 devnull m4:
619 5cedca1b 2004-05-15 devnull wordp = wp;
620 5cedca1b 2004-05-15 devnull return(1); /* line filled up */
621 5cedca1b 2004-05-15 devnull m5:
622 5cedca1b 2004-05-15 devnull nc--;
623 5cedca1b 2004-05-15 devnull w = width(*linep);
624 5cedca1b 2004-05-15 devnull ne -= w;
625 5cedca1b 2004-05-15 devnull nel += w;
626 5cedca1b 2004-05-15 devnull wne += w;
627 5cedca1b 2004-05-15 devnull wch++;
628 5cedca1b 2004-05-15 devnull wp--;
629 5cedca1b 2004-05-15 devnull goto m1;
630 5cedca1b 2004-05-15 devnull }
631 5cedca1b 2004-05-15 devnull
632 5cedca1b 2004-05-15 devnull
633 5cedca1b 2004-05-15 devnull void horiz(int i)
634 5cedca1b 2004-05-15 devnull {
635 5cedca1b 2004-05-15 devnull vflag = 0;
636 5cedca1b 2004-05-15 devnull if (i)
637 5cedca1b 2004-05-15 devnull pchar(makem(i));
638 5cedca1b 2004-05-15 devnull }
639 5cedca1b 2004-05-15 devnull
640 5cedca1b 2004-05-15 devnull
641 5cedca1b 2004-05-15 devnull void setnel(void)
642 5cedca1b 2004-05-15 devnull {
643 5cedca1b 2004-05-15 devnull if (!nc) {
644 5cedca1b 2004-05-15 devnull linep = line;
645 5cedca1b 2004-05-15 devnull if (un1 >= 0) {
646 5cedca1b 2004-05-15 devnull un = un1;
647 5cedca1b 2004-05-15 devnull un1 = -1;
648 5cedca1b 2004-05-15 devnull }
649 5cedca1b 2004-05-15 devnull nel = ll - un;
650 5cedca1b 2004-05-15 devnull ne = adsp = adrem = 0;
651 5cedca1b 2004-05-15 devnull }
652 5cedca1b 2004-05-15 devnull }
653 5cedca1b 2004-05-15 devnull
654 c5561c23 2004-05-16 devnull int
655 5cedca1b 2004-05-15 devnull getword(int x)
656 5cedca1b 2004-05-15 devnull {
657 5cedca1b 2004-05-15 devnull int j, k;
658 5cedca1b 2004-05-15 devnull Tchar i, *wp;
659 5cedca1b 2004-05-15 devnull int noword;
660 5cedca1b 2004-05-15 devnull int obits;
661 5cedca1b 2004-05-15 devnull
662 c5561c23 2004-05-16 devnull j = 0;
663 5cedca1b 2004-05-15 devnull noword = 0;
664 5cedca1b 2004-05-15 devnull if (x)
665 5cedca1b 2004-05-15 devnull if (pendw) {
666 5cedca1b 2004-05-15 devnull *pendw = 0;
667 5cedca1b 2004-05-15 devnull goto rtn;
668 5cedca1b 2004-05-15 devnull }
669 5cedca1b 2004-05-15 devnull if (wordp = pendw)
670 5cedca1b 2004-05-15 devnull goto g1;
671 5cedca1b 2004-05-15 devnull hyp = hyptr;
672 5cedca1b 2004-05-15 devnull wordp = word;
673 5cedca1b 2004-05-15 devnull over = wne = wch = 0;
674 5cedca1b 2004-05-15 devnull hyoff = 0;
675 5cedca1b 2004-05-15 devnull obits = chbits;
676 5cedca1b 2004-05-15 devnull while (1) { /* picks up 1st char of word */
677 5cedca1b 2004-05-15 devnull j = cbits(i = GETCH());
678 5cedca1b 2004-05-15 devnull if (j == '\n') {
679 5cedca1b 2004-05-15 devnull wne = wch = 0;
680 5cedca1b 2004-05-15 devnull noword = 1;
681 5cedca1b 2004-05-15 devnull goto rtn;
682 5cedca1b 2004-05-15 devnull }
683 5cedca1b 2004-05-15 devnull if (j == ohc) {
684 5cedca1b 2004-05-15 devnull hyoff = 1; /* 1 => don't hyphenate */
685 5cedca1b 2004-05-15 devnull continue;
686 5cedca1b 2004-05-15 devnull }
687 5cedca1b 2004-05-15 devnull if (j == ' ') {
688 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
689 5cedca1b 2004-05-15 devnull widthp = sps;
690 5cedca1b 2004-05-15 devnull storeword(i, sps);
691 5cedca1b 2004-05-15 devnull continue;
692 5cedca1b 2004-05-15 devnull }
693 5cedca1b 2004-05-15 devnull break;
694 5cedca1b 2004-05-15 devnull }
695 5cedca1b 2004-05-15 devnull storeword(' ' | obits, sps);
696 5cedca1b 2004-05-15 devnull if (spflg) {
697 5cedca1b 2004-05-15 devnull storeword(' ' | obits, sps);
698 5cedca1b 2004-05-15 devnull spflg = 0;
699 5cedca1b 2004-05-15 devnull }
700 5cedca1b 2004-05-15 devnull g0:
701 5cedca1b 2004-05-15 devnull if (j == CONT) {
702 5cedca1b 2004-05-15 devnull pendw = wordp;
703 5cedca1b 2004-05-15 devnull nflush = 0;
704 5cedca1b 2004-05-15 devnull flushi();
705 5cedca1b 2004-05-15 devnull return(1);
706 5cedca1b 2004-05-15 devnull }
707 5cedca1b 2004-05-15 devnull if (hyoff != 1) {
708 5cedca1b 2004-05-15 devnull if (j == ohc) {
709 5cedca1b 2004-05-15 devnull hyoff = 2;
710 5cedca1b 2004-05-15 devnull *hyp++ = wordp;
711 5cedca1b 2004-05-15 devnull if (hyp > hyptr + NHYP - 1)
712 5cedca1b 2004-05-15 devnull hyp = hyptr + NHYP - 1;
713 5cedca1b 2004-05-15 devnull goto g1;
714 5cedca1b 2004-05-15 devnull }
715 5cedca1b 2004-05-15 devnull if (((j == '-' || j == EMDASH)) && !(i & ZBIT)) /* zbit avoids \X */
716 5cedca1b 2004-05-15 devnull if (wordp > word + 1) {
717 5cedca1b 2004-05-15 devnull hyoff = 2;
718 5cedca1b 2004-05-15 devnull *hyp++ = wordp + 1;
719 5cedca1b 2004-05-15 devnull if (hyp > hyptr + NHYP - 1)
720 5cedca1b 2004-05-15 devnull hyp = hyptr + NHYP - 1;
721 5cedca1b 2004-05-15 devnull }
722 5cedca1b 2004-05-15 devnull }
723 5cedca1b 2004-05-15 devnull j = width(i);
724 5cedca1b 2004-05-15 devnull numtabp[HP].val += j;
725 5cedca1b 2004-05-15 devnull storeword(i, j);
726 5cedca1b 2004-05-15 devnull g1:
727 5cedca1b 2004-05-15 devnull j = cbits(i = GETCH());
728 5cedca1b 2004-05-15 devnull if (j != ' ') {
729 5cedca1b 2004-05-15 devnull static char *sentchar = ".?!"; /* sentence terminators */
730 5cedca1b 2004-05-15 devnull if (j != '\n')
731 5cedca1b 2004-05-15 devnull goto g0;
732 5cedca1b 2004-05-15 devnull wp = wordp-1; /* handle extra space at end of sentence */
733 5cedca1b 2004-05-15 devnull while (wp >= word) {
734 5cedca1b 2004-05-15 devnull j = cbits(*wp--);
735 5cedca1b 2004-05-15 devnull if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER)
736 5cedca1b 2004-05-15 devnull continue;
737 5cedca1b 2004-05-15 devnull for (k = 0; sentchar[k]; k++)
738 5cedca1b 2004-05-15 devnull if (j == sentchar[k]) {
739 5cedca1b 2004-05-15 devnull spflg++;
740 5cedca1b 2004-05-15 devnull break;
741 5cedca1b 2004-05-15 devnull }
742 5cedca1b 2004-05-15 devnull break;
743 5cedca1b 2004-05-15 devnull }
744 5cedca1b 2004-05-15 devnull }
745 5cedca1b 2004-05-15 devnull *wordp = 0;
746 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
747 5cedca1b 2004-05-15 devnull rtn:
748 5cedca1b 2004-05-15 devnull for (wp = word; *wp; wp++) {
749 5cedca1b 2004-05-15 devnull if (ismot(j))
750 5cedca1b 2004-05-15 devnull break; /* drechsler */
751 5cedca1b 2004-05-15 devnull j = cbits(*wp);
752 5cedca1b 2004-05-15 devnull if (j == ' ')
753 5cedca1b 2004-05-15 devnull continue;
754 5cedca1b 2004-05-15 devnull if (!(isascii(j) && isdigit(j)) && j != '-')
755 5cedca1b 2004-05-15 devnull break;
756 5cedca1b 2004-05-15 devnull }
757 5cedca1b 2004-05-15 devnull if (*wp == 0) /* all numbers, so don't hyphenate */
758 5cedca1b 2004-05-15 devnull hyoff = 1;
759 5cedca1b 2004-05-15 devnull wdstart = 0;
760 5cedca1b 2004-05-15 devnull wordp = word;
761 5cedca1b 2004-05-15 devnull pendw = 0;
762 5cedca1b 2004-05-15 devnull *hyp++ = 0;
763 5cedca1b 2004-05-15 devnull setnel();
764 5cedca1b 2004-05-15 devnull return(noword);
765 5cedca1b 2004-05-15 devnull }
766 5cedca1b 2004-05-15 devnull
767 5cedca1b 2004-05-15 devnull
768 5cedca1b 2004-05-15 devnull void storeword(Tchar c, int w)
769 5cedca1b 2004-05-15 devnull {
770 5cedca1b 2004-05-15 devnull Tchar *savp;
771 5cedca1b 2004-05-15 devnull int i;
772 5cedca1b 2004-05-15 devnull
773 5cedca1b 2004-05-15 devnull if (wordp >= word + wdsize - 2) {
774 5cedca1b 2004-05-15 devnull wdsize += WDSIZE;
775 5cedca1b 2004-05-15 devnull savp = word;
776 5cedca1b 2004-05-15 devnull if (( word = (Tchar *)realloc((char *)word, wdsize * sizeof(Tchar))) != NULL) {
777 5cedca1b 2004-05-15 devnull if (wordp)
778 5cedca1b 2004-05-15 devnull wordp = word + (wordp - savp);
779 5cedca1b 2004-05-15 devnull if (pendw)
780 5cedca1b 2004-05-15 devnull pendw = word + (pendw - savp);
781 5cedca1b 2004-05-15 devnull if (wdstart)
782 5cedca1b 2004-05-15 devnull wdstart = word + (wdstart - savp);
783 5cedca1b 2004-05-15 devnull if (wdend)
784 5cedca1b 2004-05-15 devnull wdend = word + (wdend - savp);
785 5cedca1b 2004-05-15 devnull for (i = 0; i < NHYP; i++)
786 5cedca1b 2004-05-15 devnull if (hyptr[i])
787 5cedca1b 2004-05-15 devnull hyptr[i] = word + (hyptr[i] - savp);
788 5cedca1b 2004-05-15 devnull } else {
789 5cedca1b 2004-05-15 devnull if (over) {
790 5cedca1b 2004-05-15 devnull return;
791 5cedca1b 2004-05-15 devnull } else {
792 5cedca1b 2004-05-15 devnull flusho();
793 5cedca1b 2004-05-15 devnull ERROR "Word overflow." WARN;
794 5cedca1b 2004-05-15 devnull over++;
795 5cedca1b 2004-05-15 devnull c = LEFTHAND;
796 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
797 5cedca1b 2004-05-15 devnull }
798 5cedca1b 2004-05-15 devnull }
799 5cedca1b 2004-05-15 devnull }
800 5cedca1b 2004-05-15 devnull widthp = w;
801 5cedca1b 2004-05-15 devnull wne += w;
802 5cedca1b 2004-05-15 devnull *wordp++ = c;
803 5cedca1b 2004-05-15 devnull wch++;
804 5cedca1b 2004-05-15 devnull }
805 5cedca1b 2004-05-15 devnull
806 5cedca1b 2004-05-15 devnull
807 5cedca1b 2004-05-15 devnull Tchar gettch(void)
808 5cedca1b 2004-05-15 devnull {
809 5cedca1b 2004-05-15 devnull extern int c_isalnum;
810 5cedca1b 2004-05-15 devnull Tchar i;
811 5cedca1b 2004-05-15 devnull int j;
812 5cedca1b 2004-05-15 devnull
813 5cedca1b 2004-05-15 devnull if (TROFF)
814 5cedca1b 2004-05-15 devnull return getch();
815 5cedca1b 2004-05-15 devnull
816 5cedca1b 2004-05-15 devnull i = getch();
817 5cedca1b 2004-05-15 devnull j = cbits(i);
818 5cedca1b 2004-05-15 devnull if (ismot(i) || fbits(i) != ulfont)
819 5cedca1b 2004-05-15 devnull return(i);
820 5cedca1b 2004-05-15 devnull if (cu) {
821 5cedca1b 2004-05-15 devnull if (trtab[j] == ' ') {
822 5cedca1b 2004-05-15 devnull setcbits(i, '_');
823 5cedca1b 2004-05-15 devnull setfbits(i, FT); /* default */
824 5cedca1b 2004-05-15 devnull }
825 5cedca1b 2004-05-15 devnull return(i);
826 5cedca1b 2004-05-15 devnull }
827 5cedca1b 2004-05-15 devnull /* should test here for characters that ought to be underlined */
828 5cedca1b 2004-05-15 devnull /* in the old nroff, that was the 200 bit on the width! */
829 5cedca1b 2004-05-15 devnull /* for now, just do letters, digits and certain special chars */
830 5cedca1b 2004-05-15 devnull if (j <= 127) {
831 5cedca1b 2004-05-15 devnull if (!isalnum(j))
832 5cedca1b 2004-05-15 devnull setfbits(i, FT);
833 5cedca1b 2004-05-15 devnull } else {
834 5cedca1b 2004-05-15 devnull if (j < c_isalnum)
835 5cedca1b 2004-05-15 devnull setfbits(i, FT);
836 5cedca1b 2004-05-15 devnull }
837 5cedca1b 2004-05-15 devnull return(i);
838 5cedca1b 2004-05-15 devnull }