date and time created 86/08/15 00:38:02 by jaap
[unix-history] / usr / src / local / ditroff / ditroff.okeeffe / n7.c
CommitLineData
edbd42eb 1#ifndef lint
6a07289d 2static 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"
24int brflg;
25
26tbreak()
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
142donum()
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
155d1:
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
172text()
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) {
204t1:
205 nflush = pendt = ch = spcnt = 0;
206 callsp();
207 return;
208 }
209 ch = i;
210 if (spcnt) {
211t2:
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 }
223t3:
224 if (spread)
225 goto t5;
226 if (pendw || !wch)
227t4:
228 if (getword(0))
229 goto t6;
230 if (!movword())
231 goto t3;
232t5:
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;
251t6:
252 pendt = 0;
253 ckul();
254rtn:
255 nflush = 0;
256}
257
258
259nofill()
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();
302rtn:
303 pendnf = nflush = 0;
304}
305
306
307callsp()
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
320ckul()
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
332storeline(c, w)
655e9788 333register 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 }
346s1:
347 if (w == -1)
348 w = width(c);
349 ne += w;
350 nel -= w;
351 *linep++ = c;
352 nc++;
353}
354
355
356newline(a)
357int 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;
404nl1:
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 }
421nlpn:
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 }
440nl2:
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
456findn1(a)
457int 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
473chkpn()
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
489findt(a)
490int 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
517findt1()
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
529eject(a)
530struct 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;
543e1:
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
553movword()
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);
600m1:
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 }
616m2:
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 }
624m3:
625 nwd++;
626m4:
627 wordp = wp;
655e9788 628 return(1); /* line filled up */
edbd42eb
JA
629m5:
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
641horiz(i)
642int i;
643{
644 vflag = 0;
645 if (i)
646 pchar(makem(i));
647}
648
649
650setnel()
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
664getword(x)
665int 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
707g0:
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
733g1:
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 754rtn:
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
773storeword(c, w)
655e9788
JA
774register tchar c;
775register 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 }
789s1:
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
800tchar 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