Blame


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