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