Blame


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