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"
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)
10 5cedca1b 2004-05-15 devnull #define GETCH gettch
11 5cedca1b 2004-05-15 devnull Tchar gettch(void);
15 5cedca1b 2004-05-15 devnull * troff7.c
20 5cedca1b 2004-05-15 devnull int brflg;
22 5cedca1b 2004-05-15 devnull void tbreak(void)
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;
29 5cedca1b 2004-05-15 devnull trap = 0;
32 5cedca1b 2004-05-15 devnull if (dip == d && numtabp[NL].val == -1) {
33 5cedca1b 2004-05-15 devnull newline(1);
36 5cedca1b 2004-05-15 devnull if (!nc) {
37 5cedca1b 2004-05-15 devnull setnel();
38 5cedca1b 2004-05-15 devnull if (!wch)
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();
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)
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;
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;
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;
76 5cedca1b 2004-05-15 devnull resol = t.Adj;
78 5cedca1b 2004-05-15 devnull resol = HOR;
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++)) == ' ') {
85 5cedca1b 2004-05-15 devnull pad += width(j);
87 5cedca1b 2004-05-15 devnull } while ((cbits(j = *i++)) == ' ');
89 5cedca1b 2004-05-15 devnull pad += adsp;
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;
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);
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);
112 5cedca1b 2004-05-15 devnull if (icf)
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;
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;
132 5cedca1b 2004-05-15 devnull void donum(void)
134 5cedca1b 2004-05-15 devnull int i, nw;
135 5cedca1b 2004-05-15 devnull int lnv = numtabp[LN].val;
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) {
141 5cedca1b 2004-05-15 devnull goto d1;
143 5cedca1b 2004-05-15 devnull if (lnv % ndf) {
144 5cedca1b 2004-05-15 devnull numtabp[LN].val++;
146 5cedca1b 2004-05-15 devnull un += nw * (nmwid + nms + ni);
150 5cedca1b 2004-05-15 devnull do { /* count digits in numtabp[LN].val */
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++;
161 5cedca1b 2004-05-15 devnull void text(void)
163 5cedca1b 2004-05-15 devnull Tchar i;
164 5cedca1b 2004-05-15 devnull static int spcnt;
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);
172 5cedca1b 2004-05-15 devnull setnel();
173 5cedca1b 2004-05-15 devnull if (ce || !fi) {
174 5cedca1b 2004-05-15 devnull nofill();
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;
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;
192 5cedca1b 2004-05-15 devnull if (nlflg) {
194 5cedca1b 2004-05-15 devnull nflush = pendt = ch = spcnt = 0;
195 5cedca1b 2004-05-15 devnull callsp();
199 5cedca1b 2004-05-15 devnull if (spcnt) {
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;
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)
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;
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;
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);
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;
241 5cedca1b 2004-05-15 devnull pendt = 0;
244 5cedca1b 2004-05-15 devnull nflush = 0;
248 5cedca1b 2004-05-15 devnull void nofill(void)
251 5cedca1b 2004-05-15 devnull Tchar i;
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();
263 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
264 5cedca1b 2004-05-15 devnull nwd = 10000;
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();
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);
281 5cedca1b 2004-05-15 devnull if (ce) {
283 5cedca1b 2004-05-15 devnull if ((i = quant(nel / 2, HOR)) > 0)
284 5cedca1b 2004-05-15 devnull un += i;
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();
292 5cedca1b 2004-05-15 devnull pendnf = nflush = 0;
296 5cedca1b 2004-05-15 devnull void callsp(void)
300 5cedca1b 2004-05-15 devnull if (flss)
301 5cedca1b 2004-05-15 devnull i = flss;
303 5cedca1b 2004-05-15 devnull i = lss;
304 5cedca1b 2004-05-15 devnull flss = 0;
305 5cedca1b 2004-05-15 devnull casesp1(i);
309 5cedca1b 2004-05-15 devnull void ckul(void)
311 5cedca1b 2004-05-15 devnull if (ul && (--ul == 0)) {
313 5cedca1b 2004-05-15 devnull font = sfont;
314 5cedca1b 2004-05-15 devnull mchbits();
316 5cedca1b 2004-05-15 devnull if (it && --it == 0 && itmac)
317 5cedca1b 2004-05-15 devnull control(itmac, 0);
321 5cedca1b 2004-05-15 devnull void storeline(Tchar c, int w)
323 5cedca1b 2004-05-15 devnull int diff;
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) {
334 5cedca1b 2004-05-15 devnull } else {
335 5cedca1b 2004-05-15 devnull flusho();
336 5cedca1b 2004-05-15 devnull ERROR "Line overflow." WARN;
338 5cedca1b 2004-05-15 devnull *linep++ = LEFTHAND;
339 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
341 5cedca1b 2004-05-15 devnull c = '\n';
345 5cedca1b 2004-05-15 devnull *linep++ = c;
346 5cedca1b 2004-05-15 devnull ne += w;
347 5cedca1b 2004-05-15 devnull nel -= w;
352 5cedca1b 2004-05-15 devnull void newline(int a)
354 5cedca1b 2004-05-15 devnull int i, j, nlss;
355 5cedca1b 2004-05-15 devnull int opn;
357 c5561c23 2004-05-16 devnull nlss = 0;
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;
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)) {
381 5cedca1b 2004-05-15 devnull dip->ditf++;
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;
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;
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++;
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;
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;
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) {
429 5cedca1b 2004-05-15 devnull if (dpn >= stop) {
430 5cedca1b 2004-05-15 devnull dpn = 0;
431 5cedca1b 2004-05-15 devnull ptpause();
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);
445 5cedca1b 2004-05-15 devnull trap = control(mlist[j], 0);
450 5cedca1b 2004-05-15 devnull findn1(int a)
452 5cedca1b 2004-05-15 devnull int i, j;
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)
462 5cedca1b 2004-05-15 devnull return(i);
466 5cedca1b 2004-05-15 devnull void chkpn(void)
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);
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;
482 5cedca1b 2004-05-15 devnull findt(int a)
484 5cedca1b 2004-05-15 devnull int i, j, k;
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)
490 5cedca1b 2004-05-15 devnull return(k);
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)
502 5cedca1b 2004-05-15 devnull i = pl - a;
503 5cedca1b 2004-05-15 devnull if (k > i)
505 5cedca1b 2004-05-15 devnull return(k);
509 5cedca1b 2004-05-15 devnull findt1(void)
513 5cedca1b 2004-05-15 devnull if (dip != d)
514 5cedca1b 2004-05-15 devnull i = dip->dnl;
516 5cedca1b 2004-05-15 devnull i = numtabp[NL].val;
517 5cedca1b 2004-05-15 devnull return(findt(i));
521 5cedca1b 2004-05-15 devnull void eject(Stack *a)
523 5cedca1b 2004-05-15 devnull int savlss;
525 5cedca1b 2004-05-15 devnull if (dip != d)
529 5cedca1b 2004-05-15 devnull ejl = a;
531 5cedca1b 2004-05-15 devnull ejl = frame;
532 5cedca1b 2004-05-15 devnull if (trap)
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;
544 5cedca1b 2004-05-15 devnull movword(void)
547 5cedca1b 2004-05-15 devnull Tchar i, *wp;
548 5cedca1b 2004-05-15 devnull int savwch, hys;
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++) == ' ') {
555 5cedca1b 2004-05-15 devnull wne -= sps;
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)
567 5cedca1b 2004-05-15 devnull while (wch) {
568 5cedca1b 2004-05-15 devnull if (hyoff != 1 && *hyp == wp) {
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 */
574 5cedca1b 2004-05-15 devnull storeline((Tchar)IMP, 0);
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;
581 5cedca1b 2004-05-15 devnull storeline(i, w);
583 5cedca1b 2004-05-15 devnull if (nel >= 0) {
585 5cedca1b 2004-05-15 devnull return(0); /* line didn't fill up */
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);
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;
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) {
604 5cedca1b 2004-05-15 devnull goto m1;
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++;
617 5cedca1b 2004-05-15 devnull wordp = wp;
618 5cedca1b 2004-05-15 devnull return(1); /* line filled up */
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;
627 5cedca1b 2004-05-15 devnull goto m1;
631 5cedca1b 2004-05-15 devnull void horiz(int i)
633 5cedca1b 2004-05-15 devnull vflag = 0;
635 5cedca1b 2004-05-15 devnull pchar(makem(i));
639 5cedca1b 2004-05-15 devnull void setnel(void)
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;
647 5cedca1b 2004-05-15 devnull nel = ll - un;
648 5cedca1b 2004-05-15 devnull ne = adsp = adrem = 0;
653 5cedca1b 2004-05-15 devnull getword(int x)
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;
661 5cedca1b 2004-05-15 devnull noword = 0;
663 5cedca1b 2004-05-15 devnull if (pendw) {
664 5cedca1b 2004-05-15 devnull *pendw = 0;
665 5cedca1b 2004-05-15 devnull goto rtn;
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;
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;
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;
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;
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);
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;
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;
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);
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++;
743 5cedca1b 2004-05-15 devnull *wordp = 0;
744 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
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 != '-')
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);
766 5cedca1b 2004-05-15 devnull void storeword(Tchar c, int w)
768 5cedca1b 2004-05-15 devnull Tchar *savp;
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) {
789 5cedca1b 2004-05-15 devnull } else {
790 5cedca1b 2004-05-15 devnull flusho();
791 5cedca1b 2004-05-15 devnull ERROR "Word overflow." WARN;
793 5cedca1b 2004-05-15 devnull c = LEFTHAND;
794 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
798 5cedca1b 2004-05-15 devnull widthp = w;
799 5cedca1b 2004-05-15 devnull wne += w;
800 5cedca1b 2004-05-15 devnull *wordp++ = c;
805 5cedca1b 2004-05-15 devnull Tchar gettch(void)
807 5cedca1b 2004-05-15 devnull extern int c_isalnum;
808 5cedca1b 2004-05-15 devnull Tchar i;
811 5cedca1b 2004-05-15 devnull if (TROFF)
812 5cedca1b 2004-05-15 devnull return getch();
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 */
823 5cedca1b 2004-05-15 devnull return(i);
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);
835 5cedca1b 2004-05-15 devnull return(i);