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