1 cbeb0b26 2006-04-01 devnull #define _BSD_SOURCE 1 /* isascii */
2 657f699e 2016-11-20 0intro #define _DEFAULT_SOURCE 1
3 5cedca1b 2004-05-15 devnull #include "tdef.h"
4 5cedca1b 2004-05-15 devnull #include "fns.h"
5 5cedca1b 2004-05-15 devnull #include "ext.h"
7 5cedca1b 2004-05-15 devnull #ifdef STRICT
8 5cedca1b 2004-05-15 devnull /* not in ANSI or POSIX */
9 5cedca1b 2004-05-15 devnull #define isascii(a) ((a) >= 0 && (a) <= 127)
12 5cedca1b 2004-05-15 devnull #define GETCH gettch
13 5cedca1b 2004-05-15 devnull Tchar gettch(void);
17 5cedca1b 2004-05-15 devnull * troff7.c
22 5cedca1b 2004-05-15 devnull int brflg;
24 5cedca1b 2004-05-15 devnull void tbreak(void)
26 5cedca1b 2004-05-15 devnull int pad, k;
27 5cedca1b 2004-05-15 devnull Tchar *i, j;
28 5cedca1b 2004-05-15 devnull int resol;
29 5cedca1b 2004-05-15 devnull int un0 = un;
31 5cedca1b 2004-05-15 devnull trap = 0;
34 5cedca1b 2004-05-15 devnull if (dip == d && numtabp[NL].val == -1) {
35 5cedca1b 2004-05-15 devnull newline(1);
38 5cedca1b 2004-05-15 devnull if (!nc) {
39 5cedca1b 2004-05-15 devnull setnel();
40 5cedca1b 2004-05-15 devnull if (!wch)
42 5cedca1b 2004-05-15 devnull if (pendw)
43 5cedca1b 2004-05-15 devnull getword(1);
44 5cedca1b 2004-05-15 devnull movword();
45 5cedca1b 2004-05-15 devnull } else if (pendw && !brflg) {
46 5cedca1b 2004-05-15 devnull getword(1);
47 5cedca1b 2004-05-15 devnull movword();
49 5cedca1b 2004-05-15 devnull *linep = dip->nls = 0;
50 5cedca1b 2004-05-15 devnull if (NROFF && dip == d)
51 5cedca1b 2004-05-15 devnull horiz(po);
52 5cedca1b 2004-05-15 devnull if (lnmod)
54 5cedca1b 2004-05-15 devnull lastl = ne;
55 5cedca1b 2004-05-15 devnull if (brflg != 1) {
56 5cedca1b 2004-05-15 devnull totout = 0;
57 5cedca1b 2004-05-15 devnull } else if (ad) {
58 5cedca1b 2004-05-15 devnull if ((lastl = ll - un) < ne)
59 5cedca1b 2004-05-15 devnull lastl = ne;
61 5cedca1b 2004-05-15 devnull if (admod && ad && (brflg != 2)) {
62 5cedca1b 2004-05-15 devnull lastl = ne;
63 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
64 5cedca1b 2004-05-15 devnull if (admod == 1)
65 5cedca1b 2004-05-15 devnull un += quant(nel / 2, HOR);
66 5cedca1b 2004-05-15 devnull else if (admod == 2)
67 5cedca1b 2004-05-15 devnull un += nel;
69 5cedca1b 2004-05-15 devnull totout++;
70 5cedca1b 2004-05-15 devnull brflg = 0;
71 5cedca1b 2004-05-15 devnull if (lastl + un > dip->maxl)
72 5cedca1b 2004-05-15 devnull dip->maxl = lastl + un;
73 5cedca1b 2004-05-15 devnull horiz(un);
74 5cedca1b 2004-05-15 devnull if (NROFF) {
75 5cedca1b 2004-05-15 devnull if (adrem % t.Adj)
76 fa325e9b 2020-01-10 cross resol = t.Hor;
78 5cedca1b 2004-05-15 devnull resol = t.Adj;
80 5cedca1b 2004-05-15 devnull resol = HOR;
82 5cedca1b 2004-05-15 devnull lastl = ne + (nwd-1) * adsp + adrem;
83 5cedca1b 2004-05-15 devnull for (i = line; nc > 0; ) {
84 5cedca1b 2004-05-15 devnull if ((cbits(j = *i++)) == ' ') {
87 5cedca1b 2004-05-15 devnull pad += width(j);
89 5cedca1b 2004-05-15 devnull } while ((cbits(j = *i++)) == ' ');
91 5cedca1b 2004-05-15 devnull pad += adsp;
93 5cedca1b 2004-05-15 devnull if (adrem) {
94 5cedca1b 2004-05-15 devnull if (adrem < 0) {
95 5cedca1b 2004-05-15 devnull pad -= resol;
96 5cedca1b 2004-05-15 devnull adrem += resol;
97 5cedca1b 2004-05-15 devnull } else if ((totout & 01) || adrem / resol >= nwd) {
98 5cedca1b 2004-05-15 devnull pad += resol;
99 5cedca1b 2004-05-15 devnull adrem -= resol;
102 5cedca1b 2004-05-15 devnull pchar((Tchar) WORDSP);
103 5cedca1b 2004-05-15 devnull horiz(pad);
104 5cedca1b 2004-05-15 devnull } else {
105 5cedca1b 2004-05-15 devnull pchar(j);
109 5cedca1b 2004-05-15 devnull if (ic) {
110 5cedca1b 2004-05-15 devnull if ((k = ll - un0 - lastl + ics) > 0)
111 5cedca1b 2004-05-15 devnull horiz(k);
112 5cedca1b 2004-05-15 devnull pchar(ic);
114 5cedca1b 2004-05-15 devnull if (icf)
118 5cedca1b 2004-05-15 devnull ne = nwd = 0;
119 5cedca1b 2004-05-15 devnull un = in;
120 5cedca1b 2004-05-15 devnull setnel();
121 5cedca1b 2004-05-15 devnull newline(0);
122 5cedca1b 2004-05-15 devnull if (dip != d) {
123 5cedca1b 2004-05-15 devnull if (dip->dnl > dip->hnl)
124 5cedca1b 2004-05-15 devnull dip->hnl = dip->dnl;
125 5cedca1b 2004-05-15 devnull } else {
126 5cedca1b 2004-05-15 devnull if (numtabp[NL].val > dip->hnl)
127 5cedca1b 2004-05-15 devnull dip->hnl = numtabp[NL].val;
129 5cedca1b 2004-05-15 devnull for (k = ls - 1; k > 0 && !trap; k--)
130 5cedca1b 2004-05-15 devnull newline(0);
131 5cedca1b 2004-05-15 devnull spread = 0;
134 5cedca1b 2004-05-15 devnull void donum(void)
136 5cedca1b 2004-05-15 devnull int i, nw;
137 5cedca1b 2004-05-15 devnull int lnv = numtabp[LN].val;
139 5cedca1b 2004-05-15 devnull nrbits = nmbits;
140 5cedca1b 2004-05-15 devnull nw = width('1' | nrbits);
141 5cedca1b 2004-05-15 devnull if (nn) {
143 5cedca1b 2004-05-15 devnull goto d1;
145 5cedca1b 2004-05-15 devnull if (lnv % ndf) {
146 5cedca1b 2004-05-15 devnull numtabp[LN].val++;
148 5cedca1b 2004-05-15 devnull un += nw * (nmwid + nms + ni);
152 5cedca1b 2004-05-15 devnull do { /* count digits in numtabp[LN].val */
154 5cedca1b 2004-05-15 devnull } while ((lnv /= 10) > 0);
155 5cedca1b 2004-05-15 devnull horiz(nw * (ni + max(nmwid-i, 0)));
156 5cedca1b 2004-05-15 devnull nform = 0;
157 5cedca1b 2004-05-15 devnull fnumb(numtabp[LN].val, pchar);
158 5cedca1b 2004-05-15 devnull un += nw * nms;
159 5cedca1b 2004-05-15 devnull numtabp[LN].val++;
163 5cedca1b 2004-05-15 devnull void text(void)
165 5cedca1b 2004-05-15 devnull Tchar i;
166 5cedca1b 2004-05-15 devnull static int spcnt;
168 5cedca1b 2004-05-15 devnull nflush++;
169 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
170 5cedca1b 2004-05-15 devnull if ((dip == d) && (numtabp[NL].val == -1)) {
171 fa325e9b 2020-01-10 cross newline(1);
174 5cedca1b 2004-05-15 devnull setnel();
175 5cedca1b 2004-05-15 devnull if (ce || !fi) {
176 5cedca1b 2004-05-15 devnull nofill();
179 5cedca1b 2004-05-15 devnull if (pendw)
180 5cedca1b 2004-05-15 devnull goto t4;
181 5cedca1b 2004-05-15 devnull if (pendt)
182 5cedca1b 2004-05-15 devnull if (spcnt)
185 5cedca1b 2004-05-15 devnull goto t3;
186 5cedca1b 2004-05-15 devnull pendt++;
187 5cedca1b 2004-05-15 devnull if (spcnt)
188 5cedca1b 2004-05-15 devnull goto t2;
189 5cedca1b 2004-05-15 devnull while ((cbits(i = GETCH())) == ' ') {
190 5cedca1b 2004-05-15 devnull spcnt++;
191 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
192 5cedca1b 2004-05-15 devnull widthp = sps;
194 5cedca1b 2004-05-15 devnull if (nlflg) {
196 5cedca1b 2004-05-15 devnull nflush = pendt = ch = spcnt = 0;
197 5cedca1b 2004-05-15 devnull callsp();
201 5cedca1b 2004-05-15 devnull if (spcnt) {
203 5cedca1b 2004-05-15 devnull tbreak();
204 5cedca1b 2004-05-15 devnull if (nc || wch)
205 5cedca1b 2004-05-15 devnull goto rtn;
206 5cedca1b 2004-05-15 devnull un += spcnt * sps;
207 5cedca1b 2004-05-15 devnull spcnt = 0;
208 5cedca1b 2004-05-15 devnull setnel();
209 5cedca1b 2004-05-15 devnull if (trap)
210 5cedca1b 2004-05-15 devnull goto rtn;
211 5cedca1b 2004-05-15 devnull if (nlflg)
212 5cedca1b 2004-05-15 devnull goto t1;
215 5cedca1b 2004-05-15 devnull if (spread)
216 5cedca1b 2004-05-15 devnull goto t5;
217 5cedca1b 2004-05-15 devnull if (pendw || !wch)
219 5cedca1b 2004-05-15 devnull if (getword(0))
220 5cedca1b 2004-05-15 devnull goto t6;
221 5cedca1b 2004-05-15 devnull if (!movword())
222 5cedca1b 2004-05-15 devnull goto t3;
224 5cedca1b 2004-05-15 devnull if (nlflg)
225 5cedca1b 2004-05-15 devnull pendt = 0;
226 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
227 5cedca1b 2004-05-15 devnull if (ad) {
228 5cedca1b 2004-05-15 devnull if (nwd == 1)
229 fa325e9b 2020-01-10 cross adsp = nel;
231 5cedca1b 2004-05-15 devnull adsp = nel / (nwd - 1);
232 5cedca1b 2004-05-15 devnull adsp = (adsp / HOR) * HOR;
233 5cedca1b 2004-05-15 devnull adrem = nel - adsp*(nwd-1);
235 5cedca1b 2004-05-15 devnull brflg = 1;
236 5cedca1b 2004-05-15 devnull tbreak();
237 5cedca1b 2004-05-15 devnull spread = 0;
238 5cedca1b 2004-05-15 devnull if (!trap)
239 5cedca1b 2004-05-15 devnull goto t3;
240 5cedca1b 2004-05-15 devnull if (!nlflg)
241 5cedca1b 2004-05-15 devnull goto rtn;
243 5cedca1b 2004-05-15 devnull pendt = 0;
246 5cedca1b 2004-05-15 devnull nflush = 0;
250 5cedca1b 2004-05-15 devnull void nofill(void)
253 5cedca1b 2004-05-15 devnull Tchar i;
255 5cedca1b 2004-05-15 devnull if (!pendnf) {
256 5cedca1b 2004-05-15 devnull over = 0;
257 5cedca1b 2004-05-15 devnull tbreak();
258 5cedca1b 2004-05-15 devnull if (trap)
259 5cedca1b 2004-05-15 devnull goto rtn;
260 5cedca1b 2004-05-15 devnull if (nlflg) {
261 5cedca1b 2004-05-15 devnull ch = nflush = 0;
262 5cedca1b 2004-05-15 devnull callsp();
265 5cedca1b 2004-05-15 devnull adsp = adrem = 0;
266 5cedca1b 2004-05-15 devnull nwd = 10000;
268 5cedca1b 2004-05-15 devnull while ((j = (cbits(i = GETCH()))) != '\n') {
269 5cedca1b 2004-05-15 devnull if (j == ohc)
270 5cedca1b 2004-05-15 devnull continue;
271 5cedca1b 2004-05-15 devnull if (j == CONT) {
272 5cedca1b 2004-05-15 devnull pendnf++;
273 5cedca1b 2004-05-15 devnull nflush = 0;
274 5cedca1b 2004-05-15 devnull flushi();
278 5cedca1b 2004-05-15 devnull j = width(i);
279 5cedca1b 2004-05-15 devnull widthp = j;
280 5cedca1b 2004-05-15 devnull numtabp[HP].val += j;
281 5cedca1b 2004-05-15 devnull storeline(i, j);
283 5cedca1b 2004-05-15 devnull if (ce) {
285 5cedca1b 2004-05-15 devnull if ((i = quant(nel / 2, HOR)) > 0)
286 5cedca1b 2004-05-15 devnull un += i;
288 5cedca1b 2004-05-15 devnull if (!nc)
289 5cedca1b 2004-05-15 devnull storeline((Tchar)FILLER, 0);
290 5cedca1b 2004-05-15 devnull brflg = 2;
291 5cedca1b 2004-05-15 devnull tbreak();
294 5cedca1b 2004-05-15 devnull pendnf = nflush = 0;
298 5cedca1b 2004-05-15 devnull void callsp(void)
302 5cedca1b 2004-05-15 devnull if (flss)
305 5cedca1b 2004-05-15 devnull i = lss;
306 5cedca1b 2004-05-15 devnull flss = 0;
307 5cedca1b 2004-05-15 devnull casesp1(i);
311 5cedca1b 2004-05-15 devnull void ckul(void)
313 5cedca1b 2004-05-15 devnull if (ul && (--ul == 0)) {
315 5cedca1b 2004-05-15 devnull font = sfont;
316 5cedca1b 2004-05-15 devnull mchbits();
318 5cedca1b 2004-05-15 devnull if (it && --it == 0 && itmac)
319 5cedca1b 2004-05-15 devnull control(itmac, 0);
323 5cedca1b 2004-05-15 devnull void storeline(Tchar c, int w)
325 5cedca1b 2004-05-15 devnull int diff;
327 5cedca1b 2004-05-15 devnull if (linep >= line + lnsize - 2) {
328 5cedca1b 2004-05-15 devnull lnsize += LNSIZE;
329 5cedca1b 2004-05-15 devnull diff = linep - line;
330 5cedca1b 2004-05-15 devnull if (( line = (Tchar *)realloc((char *)line, lnsize * sizeof(Tchar))) != NULL) {
331 5cedca1b 2004-05-15 devnull if (linep && diff)
332 5cedca1b 2004-05-15 devnull linep = line + diff;
333 5cedca1b 2004-05-15 devnull } else {
334 5cedca1b 2004-05-15 devnull if (over) {
336 5cedca1b 2004-05-15 devnull } else {
337 5cedca1b 2004-05-15 devnull flusho();
338 5cedca1b 2004-05-15 devnull ERROR "Line overflow." WARN;
340 5cedca1b 2004-05-15 devnull *linep++ = LEFTHAND;
341 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
343 5cedca1b 2004-05-15 devnull c = '\n';
347 5cedca1b 2004-05-15 devnull *linep++ = c;
348 5cedca1b 2004-05-15 devnull ne += w;
349 5cedca1b 2004-05-15 devnull nel -= w;
354 5cedca1b 2004-05-15 devnull void newline(int a)
356 5cedca1b 2004-05-15 devnull int i, j, nlss;
357 5cedca1b 2004-05-15 devnull int opn;
359 c5561c23 2004-05-16 devnull nlss = 0;
361 5cedca1b 2004-05-15 devnull goto nl1;
362 5cedca1b 2004-05-15 devnull if (dip != d) {
363 5cedca1b 2004-05-15 devnull j = lss;
364 5cedca1b 2004-05-15 devnull pchar1((Tchar)FLSS);
365 5cedca1b 2004-05-15 devnull if (flss)
366 5cedca1b 2004-05-15 devnull lss = flss;
367 5cedca1b 2004-05-15 devnull i = lss + dip->blss;
368 5cedca1b 2004-05-15 devnull dip->dnl += i;
369 5cedca1b 2004-05-15 devnull pchar1((Tchar)i);
370 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
371 5cedca1b 2004-05-15 devnull lss = j;
372 5cedca1b 2004-05-15 devnull dip->blss = flss = 0;
373 5cedca1b 2004-05-15 devnull if (dip->alss) {
374 5cedca1b 2004-05-15 devnull pchar1((Tchar)FLSS);
375 5cedca1b 2004-05-15 devnull pchar1((Tchar)dip->alss);
376 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
377 5cedca1b 2004-05-15 devnull dip->dnl += dip->alss;
378 5cedca1b 2004-05-15 devnull dip->alss = 0;
380 5cedca1b 2004-05-15 devnull if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac)
381 5cedca1b 2004-05-15 devnull if (control(dip->dimac, 0)) {
383 5cedca1b 2004-05-15 devnull dip->ditf++;
387 5cedca1b 2004-05-15 devnull j = lss;
388 5cedca1b 2004-05-15 devnull if (flss)
389 5cedca1b 2004-05-15 devnull lss = flss;
390 5cedca1b 2004-05-15 devnull nlss = dip->alss + dip->blss + lss;
391 5cedca1b 2004-05-15 devnull numtabp[NL].val += nlss;
392 5cedca1b 2004-05-15 devnull if (TROFF && ascii) {
393 5cedca1b 2004-05-15 devnull dip->alss = dip->blss = 0;
395 5cedca1b 2004-05-15 devnull pchar1((Tchar)'\n');
396 5cedca1b 2004-05-15 devnull flss = 0;
397 5cedca1b 2004-05-15 devnull lss = j;
398 5cedca1b 2004-05-15 devnull if (numtabp[NL].val < pl)
399 5cedca1b 2004-05-15 devnull goto nl2;
401 5cedca1b 2004-05-15 devnull ejf = dip->hnl = numtabp[NL].val = 0;
402 5cedca1b 2004-05-15 devnull ejl = frame;
403 5cedca1b 2004-05-15 devnull if (donef) {
404 5cedca1b 2004-05-15 devnull if ((!nc && !wch) || ndone)
405 5cedca1b 2004-05-15 devnull done1(0);
406 5cedca1b 2004-05-15 devnull ndone++;
407 5cedca1b 2004-05-15 devnull donef = 0;
408 5cedca1b 2004-05-15 devnull if (frame == stk)
409 5cedca1b 2004-05-15 devnull nflush++;
411 5cedca1b 2004-05-15 devnull opn = numtabp[PN].val;
412 5cedca1b 2004-05-15 devnull numtabp[PN].val++;
413 5cedca1b 2004-05-15 devnull if (npnflg) {
414 5cedca1b 2004-05-15 devnull numtabp[PN].val = npn;
415 5cedca1b 2004-05-15 devnull npn = npnflg = 0;
418 5cedca1b 2004-05-15 devnull if (numtabp[PN].val == pfrom) {
419 5cedca1b 2004-05-15 devnull print++;
420 5cedca1b 2004-05-15 devnull pfrom = -1;
421 5cedca1b 2004-05-15 devnull } else if (opn == pto) {
422 5cedca1b 2004-05-15 devnull print = 0;
423 5cedca1b 2004-05-15 devnull opn = -1;
424 5cedca1b 2004-05-15 devnull chkpn();
425 5cedca1b 2004-05-15 devnull goto nlpn;
427 5cedca1b 2004-05-15 devnull if (print)
428 5cedca1b 2004-05-15 devnull ptpage(numtabp[PN].val); /* supposedly in a clean state so can pause */
429 5cedca1b 2004-05-15 devnull if (stop && print) {
431 5cedca1b 2004-05-15 devnull if (dpn >= stop) {
432 5cedca1b 2004-05-15 devnull dpn = 0;
433 5cedca1b 2004-05-15 devnull ptpause();
437 5cedca1b 2004-05-15 devnull trap = 0;
438 5cedca1b 2004-05-15 devnull if (numtabp[NL].val == 0) {
439 5cedca1b 2004-05-15 devnull if ((j = findn(0)) != NTRAP)
440 5cedca1b 2004-05-15 devnull trap = control(mlist[j], 0);
441 5cedca1b 2004-05-15 devnull } else if ((i = findt(numtabp[NL].val - nlss)) <= nlss) {
442 5cedca1b 2004-05-15 devnull if ((j = findn1(numtabp[NL].val - nlss + i)) == NTRAP) {
443 5cedca1b 2004-05-15 devnull flusho();
444 5cedca1b 2004-05-15 devnull ERROR "Trap botch." WARN;
445 5cedca1b 2004-05-15 devnull done2(-5);
447 5cedca1b 2004-05-15 devnull trap = control(mlist[j], 0);
452 5cedca1b 2004-05-15 devnull findn1(int a)
454 5cedca1b 2004-05-15 devnull int i, j;
456 5cedca1b 2004-05-15 devnull for (i = 0; i < NTRAP; i++) {
457 5cedca1b 2004-05-15 devnull if (mlist[i]) {
458 5cedca1b 2004-05-15 devnull if ((j = nlist[i]) < 0)
459 5cedca1b 2004-05-15 devnull j += pl;
460 5cedca1b 2004-05-15 devnull if (j == a)
464 5cedca1b 2004-05-15 devnull return(i);
468 5cedca1b 2004-05-15 devnull void chkpn(void)
470 5cedca1b 2004-05-15 devnull pto = *(pnp++);
471 5cedca1b 2004-05-15 devnull pfrom = pto>=0 ? pto : -pto;
472 5cedca1b 2004-05-15 devnull if (pto == -INT_MAX) {
473 5cedca1b 2004-05-15 devnull flusho();
474 5cedca1b 2004-05-15 devnull done1(0);
476 5cedca1b 2004-05-15 devnull if (pto < 0) {
477 5cedca1b 2004-05-15 devnull pto = -pto;
478 5cedca1b 2004-05-15 devnull print++;
479 5cedca1b 2004-05-15 devnull pfrom = 0;
484 5cedca1b 2004-05-15 devnull findt(int a)
486 5cedca1b 2004-05-15 devnull int i, j, k;
488 5cedca1b 2004-05-15 devnull k = INT_MAX;
489 5cedca1b 2004-05-15 devnull if (dip != d) {
490 5cedca1b 2004-05-15 devnull if (dip->dimac && (i = dip->ditrap - a) > 0)
492 5cedca1b 2004-05-15 devnull return(k);
494 5cedca1b 2004-05-15 devnull for (i = 0; i < NTRAP; i++) {
495 5cedca1b 2004-05-15 devnull if (mlist[i]) {
496 5cedca1b 2004-05-15 devnull if ((j = nlist[i]) < 0)
497 5cedca1b 2004-05-15 devnull j += pl;
498 5cedca1b 2004-05-15 devnull if ((j -= a) <= 0)
499 5cedca1b 2004-05-15 devnull continue;
500 5cedca1b 2004-05-15 devnull if (j < k)
504 5cedca1b 2004-05-15 devnull i = pl - a;
505 5cedca1b 2004-05-15 devnull if (k > i)
507 5cedca1b 2004-05-15 devnull return(k);
511 5cedca1b 2004-05-15 devnull findt1(void)
515 5cedca1b 2004-05-15 devnull if (dip != d)
516 5cedca1b 2004-05-15 devnull i = dip->dnl;
518 5cedca1b 2004-05-15 devnull i = numtabp[NL].val;
519 5cedca1b 2004-05-15 devnull return(findt(i));
523 5cedca1b 2004-05-15 devnull void eject(Stack *a)
525 5cedca1b 2004-05-15 devnull int savlss;
527 5cedca1b 2004-05-15 devnull if (dip != d)
531 5cedca1b 2004-05-15 devnull ejl = a;
533 5cedca1b 2004-05-15 devnull ejl = frame;
534 5cedca1b 2004-05-15 devnull if (trap)
537 5cedca1b 2004-05-15 devnull savlss = lss;
538 5cedca1b 2004-05-15 devnull lss = findt(numtabp[NL].val);
539 5cedca1b 2004-05-15 devnull newline(0);
540 5cedca1b 2004-05-15 devnull lss = savlss;
541 5cedca1b 2004-05-15 devnull if (numtabp[NL].val && !trap)
542 5cedca1b 2004-05-15 devnull goto e1;
546 5cedca1b 2004-05-15 devnull movword(void)
549 5cedca1b 2004-05-15 devnull Tchar i, *wp;
550 5cedca1b 2004-05-15 devnull int savwch, hys;
552 5cedca1b 2004-05-15 devnull over = 0;
553 5cedca1b 2004-05-15 devnull wp = wordp;
554 5cedca1b 2004-05-15 devnull if (!nwd) {
555 5cedca1b 2004-05-15 devnull while (cbits(*wp++) == ' ') {
557 5cedca1b 2004-05-15 devnull wne -= sps;
561 5cedca1b 2004-05-15 devnull if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) &&
562 5cedca1b 2004-05-15 devnull (!(hyf & 02) || (findt1() > lss)))
563 5cedca1b 2004-05-15 devnull hyphen(wp);
564 5cedca1b 2004-05-15 devnull savwch = wch;
565 5cedca1b 2004-05-15 devnull hyp = hyptr;
566 5cedca1b 2004-05-15 devnull nhyp = 0;
567 5cedca1b 2004-05-15 devnull while (*hyp && *hyp <= wp)
569 5cedca1b 2004-05-15 devnull while (wch) {
570 5cedca1b 2004-05-15 devnull if (hyoff != 1 && *hyp == wp) {
572 5cedca1b 2004-05-15 devnull if (!wdstart || (wp > wdstart + 1 && wp < wdend &&
573 5cedca1b 2004-05-15 devnull (!(hyf & 04) || wp < wdend - 1) && /* 04 => last 2 */
574 5cedca1b 2004-05-15 devnull (!(hyf & 010) || wp > wdstart + 2))) { /* 010 => 1st 2 */
576 5cedca1b 2004-05-15 devnull storeline((Tchar)IMP, 0);
579 5cedca1b 2004-05-15 devnull i = *wp++;
580 5cedca1b 2004-05-15 devnull w = width(i);
581 5cedca1b 2004-05-15 devnull wne -= w;
583 5cedca1b 2004-05-15 devnull storeline(i, w);
585 5cedca1b 2004-05-15 devnull if (nel >= 0) {
587 5cedca1b 2004-05-15 devnull return(0); /* line didn't fill up */
589 5cedca1b 2004-05-15 devnull if (TROFF)
590 5cedca1b 2004-05-15 devnull xbits((Tchar)HYPHEN, 1);
591 5cedca1b 2004-05-15 devnull hys = width((Tchar)HYPHEN);
593 5cedca1b 2004-05-15 devnull if (!nhyp) {
594 5cedca1b 2004-05-15 devnull if (!nwd)
595 5cedca1b 2004-05-15 devnull goto m3;
596 5cedca1b 2004-05-15 devnull if (wch == savwch)
597 5cedca1b 2004-05-15 devnull goto m4;
599 5cedca1b 2004-05-15 devnull if (*--linep != IMP)
600 5cedca1b 2004-05-15 devnull goto m5;
601 5cedca1b 2004-05-15 devnull if (!(--nhyp))
602 5cedca1b 2004-05-15 devnull if (!nwd)
603 5cedca1b 2004-05-15 devnull goto m2;
604 5cedca1b 2004-05-15 devnull if (nel < hys) {
606 5cedca1b 2004-05-15 devnull goto m1;
609 5cedca1b 2004-05-15 devnull if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) {
610 5cedca1b 2004-05-15 devnull *linep = (*(linep - 1) & SFMASK) | HYPHEN;
611 5cedca1b 2004-05-15 devnull w = width(*linep);
612 5cedca1b 2004-05-15 devnull nel -= w;
613 5cedca1b 2004-05-15 devnull ne += w;
614 5cedca1b 2004-05-15 devnull linep++;
619 5cedca1b 2004-05-15 devnull wordp = wp;
620 5cedca1b 2004-05-15 devnull return(1); /* line filled up */
623 5cedca1b 2004-05-15 devnull w = width(*linep);
624 5cedca1b 2004-05-15 devnull ne -= w;
625 5cedca1b 2004-05-15 devnull nel += w;
626 5cedca1b 2004-05-15 devnull wne += w;
629 5cedca1b 2004-05-15 devnull goto m1;
633 5cedca1b 2004-05-15 devnull void horiz(int i)
635 5cedca1b 2004-05-15 devnull vflag = 0;
637 5cedca1b 2004-05-15 devnull pchar(makem(i));
641 5cedca1b 2004-05-15 devnull void setnel(void)
643 5cedca1b 2004-05-15 devnull if (!nc) {
644 5cedca1b 2004-05-15 devnull linep = line;
645 5cedca1b 2004-05-15 devnull if (un1 >= 0) {
646 5cedca1b 2004-05-15 devnull un = un1;
647 5cedca1b 2004-05-15 devnull un1 = -1;
649 5cedca1b 2004-05-15 devnull nel = ll - un;
650 5cedca1b 2004-05-15 devnull ne = adsp = adrem = 0;
655 5cedca1b 2004-05-15 devnull getword(int x)
657 5cedca1b 2004-05-15 devnull int j, k;
658 5cedca1b 2004-05-15 devnull Tchar i, *wp;
659 5cedca1b 2004-05-15 devnull int noword;
660 5cedca1b 2004-05-15 devnull int obits;
663 5cedca1b 2004-05-15 devnull noword = 0;
665 5cedca1b 2004-05-15 devnull if (pendw) {
666 5cedca1b 2004-05-15 devnull *pendw = 0;
667 5cedca1b 2004-05-15 devnull goto rtn;
669 5cedca1b 2004-05-15 devnull if (wordp = pendw)
670 5cedca1b 2004-05-15 devnull goto g1;
671 5cedca1b 2004-05-15 devnull hyp = hyptr;
672 5cedca1b 2004-05-15 devnull wordp = word;
673 5cedca1b 2004-05-15 devnull over = wne = wch = 0;
674 5cedca1b 2004-05-15 devnull hyoff = 0;
675 5cedca1b 2004-05-15 devnull obits = chbits;
676 5cedca1b 2004-05-15 devnull while (1) { /* picks up 1st char of word */
677 5cedca1b 2004-05-15 devnull j = cbits(i = GETCH());
678 5cedca1b 2004-05-15 devnull if (j == '\n') {
679 5cedca1b 2004-05-15 devnull wne = wch = 0;
680 5cedca1b 2004-05-15 devnull noword = 1;
681 5cedca1b 2004-05-15 devnull goto rtn;
683 5cedca1b 2004-05-15 devnull if (j == ohc) {
684 5cedca1b 2004-05-15 devnull hyoff = 1; /* 1 => don't hyphenate */
685 5cedca1b 2004-05-15 devnull continue;
687 5cedca1b 2004-05-15 devnull if (j == ' ') {
688 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
689 5cedca1b 2004-05-15 devnull widthp = sps;
690 5cedca1b 2004-05-15 devnull storeword(i, sps);
691 5cedca1b 2004-05-15 devnull continue;
695 5cedca1b 2004-05-15 devnull storeword(' ' | obits, sps);
696 5cedca1b 2004-05-15 devnull if (spflg) {
697 5cedca1b 2004-05-15 devnull storeword(' ' | obits, sps);
698 5cedca1b 2004-05-15 devnull spflg = 0;
701 5cedca1b 2004-05-15 devnull if (j == CONT) {
702 5cedca1b 2004-05-15 devnull pendw = wordp;
703 5cedca1b 2004-05-15 devnull nflush = 0;
704 5cedca1b 2004-05-15 devnull flushi();
705 5cedca1b 2004-05-15 devnull return(1);
707 5cedca1b 2004-05-15 devnull if (hyoff != 1) {
708 5cedca1b 2004-05-15 devnull if (j == ohc) {
709 5cedca1b 2004-05-15 devnull hyoff = 2;
710 5cedca1b 2004-05-15 devnull *hyp++ = wordp;
711 5cedca1b 2004-05-15 devnull if (hyp > hyptr + NHYP - 1)
712 5cedca1b 2004-05-15 devnull hyp = hyptr + NHYP - 1;
713 5cedca1b 2004-05-15 devnull goto g1;
715 5cedca1b 2004-05-15 devnull if (((j == '-' || j == EMDASH)) && !(i & ZBIT)) /* zbit avoids \X */
716 5cedca1b 2004-05-15 devnull if (wordp > word + 1) {
717 5cedca1b 2004-05-15 devnull hyoff = 2;
718 5cedca1b 2004-05-15 devnull *hyp++ = wordp + 1;
719 5cedca1b 2004-05-15 devnull if (hyp > hyptr + NHYP - 1)
720 5cedca1b 2004-05-15 devnull hyp = hyptr + NHYP - 1;
723 5cedca1b 2004-05-15 devnull j = width(i);
724 5cedca1b 2004-05-15 devnull numtabp[HP].val += j;
725 5cedca1b 2004-05-15 devnull storeword(i, j);
727 5cedca1b 2004-05-15 devnull j = cbits(i = GETCH());
728 5cedca1b 2004-05-15 devnull if (j != ' ') {
729 5cedca1b 2004-05-15 devnull static char *sentchar = ".?!"; /* sentence terminators */
730 5cedca1b 2004-05-15 devnull if (j != '\n')
731 5cedca1b 2004-05-15 devnull goto g0;
732 5cedca1b 2004-05-15 devnull wp = wordp-1; /* handle extra space at end of sentence */
733 5cedca1b 2004-05-15 devnull while (wp >= word) {
734 5cedca1b 2004-05-15 devnull j = cbits(*wp--);
735 5cedca1b 2004-05-15 devnull if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER)
736 5cedca1b 2004-05-15 devnull continue;
737 5cedca1b 2004-05-15 devnull for (k = 0; sentchar[k]; k++)
738 5cedca1b 2004-05-15 devnull if (j == sentchar[k]) {
739 5cedca1b 2004-05-15 devnull spflg++;
745 5cedca1b 2004-05-15 devnull *wordp = 0;
746 5cedca1b 2004-05-15 devnull numtabp[HP].val += sps;
748 5cedca1b 2004-05-15 devnull for (wp = word; *wp; wp++) {
749 5cedca1b 2004-05-15 devnull if (ismot(j))
750 5cedca1b 2004-05-15 devnull break; /* drechsler */
751 5cedca1b 2004-05-15 devnull j = cbits(*wp);
752 5cedca1b 2004-05-15 devnull if (j == ' ')
753 5cedca1b 2004-05-15 devnull continue;
754 5cedca1b 2004-05-15 devnull if (!(isascii(j) && isdigit(j)) && j != '-')
757 5cedca1b 2004-05-15 devnull if (*wp == 0) /* all numbers, so don't hyphenate */
758 5cedca1b 2004-05-15 devnull hyoff = 1;
759 5cedca1b 2004-05-15 devnull wdstart = 0;
760 5cedca1b 2004-05-15 devnull wordp = word;
761 5cedca1b 2004-05-15 devnull pendw = 0;
762 5cedca1b 2004-05-15 devnull *hyp++ = 0;
763 5cedca1b 2004-05-15 devnull setnel();
764 5cedca1b 2004-05-15 devnull return(noword);
768 5cedca1b 2004-05-15 devnull void storeword(Tchar c, int w)
770 5cedca1b 2004-05-15 devnull Tchar *savp;
773 5cedca1b 2004-05-15 devnull if (wordp >= word + wdsize - 2) {
774 5cedca1b 2004-05-15 devnull wdsize += WDSIZE;
775 5cedca1b 2004-05-15 devnull savp = word;
776 5cedca1b 2004-05-15 devnull if (( word = (Tchar *)realloc((char *)word, wdsize * sizeof(Tchar))) != NULL) {
777 5cedca1b 2004-05-15 devnull if (wordp)
778 5cedca1b 2004-05-15 devnull wordp = word + (wordp - savp);
779 5cedca1b 2004-05-15 devnull if (pendw)
780 5cedca1b 2004-05-15 devnull pendw = word + (pendw - savp);
781 5cedca1b 2004-05-15 devnull if (wdstart)
782 5cedca1b 2004-05-15 devnull wdstart = word + (wdstart - savp);
783 5cedca1b 2004-05-15 devnull if (wdend)
784 5cedca1b 2004-05-15 devnull wdend = word + (wdend - savp);
785 5cedca1b 2004-05-15 devnull for (i = 0; i < NHYP; i++)
786 5cedca1b 2004-05-15 devnull if (hyptr[i])
787 5cedca1b 2004-05-15 devnull hyptr[i] = word + (hyptr[i] - savp);
788 5cedca1b 2004-05-15 devnull } else {
789 5cedca1b 2004-05-15 devnull if (over) {
791 5cedca1b 2004-05-15 devnull } else {
792 5cedca1b 2004-05-15 devnull flusho();
793 5cedca1b 2004-05-15 devnull ERROR "Word overflow." WARN;
795 5cedca1b 2004-05-15 devnull c = LEFTHAND;
796 5cedca1b 2004-05-15 devnull w = width(LEFTHAND);
800 5cedca1b 2004-05-15 devnull widthp = w;
801 5cedca1b 2004-05-15 devnull wne += w;
802 5cedca1b 2004-05-15 devnull *wordp++ = c;
807 5cedca1b 2004-05-15 devnull Tchar gettch(void)
809 5cedca1b 2004-05-15 devnull extern int c_isalnum;
810 5cedca1b 2004-05-15 devnull Tchar i;
813 5cedca1b 2004-05-15 devnull if (TROFF)
814 5cedca1b 2004-05-15 devnull return getch();
816 5cedca1b 2004-05-15 devnull i = getch();
817 5cedca1b 2004-05-15 devnull j = cbits(i);
818 5cedca1b 2004-05-15 devnull if (ismot(i) || fbits(i) != ulfont)
819 5cedca1b 2004-05-15 devnull return(i);
820 5cedca1b 2004-05-15 devnull if (cu) {
821 5cedca1b 2004-05-15 devnull if (trtab[j] == ' ') {
822 5cedca1b 2004-05-15 devnull setcbits(i, '_');
823 5cedca1b 2004-05-15 devnull setfbits(i, FT); /* default */
825 5cedca1b 2004-05-15 devnull return(i);
827 5cedca1b 2004-05-15 devnull /* should test here for characters that ought to be underlined */
828 5cedca1b 2004-05-15 devnull /* in the old nroff, that was the 200 bit on the width! */
829 5cedca1b 2004-05-15 devnull /* for now, just do letters, digits and certain special chars */
830 5cedca1b 2004-05-15 devnull if (j <= 127) {
831 5cedca1b 2004-05-15 devnull if (!isalnum(j))
832 5cedca1b 2004-05-15 devnull setfbits(i, FT);
833 5cedca1b 2004-05-15 devnull } else {
834 5cedca1b 2004-05-15 devnull if (j < c_isalnum)
835 5cedca1b 2004-05-15 devnull setfbits(i, FT);
837 5cedca1b 2004-05-15 devnull return(i);