home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / troff / n8.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.0 KB  |  277 lines

  1. #include "tdef.h"
  2.  
  3. /*
  4. troff8.c
  5.  
  6. hyphenation
  7. */
  8.  
  9. char hbuf[NHEX];
  10. char *nexth = hbuf;
  11. int *hyend;
  12. extern int *wdstart, *wdend;
  13. extern int *hyptr[];
  14. extern int **hyp;
  15. extern int hyoff;
  16. extern int noscale;
  17. extern int xxx;
  18. #define THRESH 160 /*digram goodness threshold*/
  19. int thresh = THRESH;
  20.  
  21. hyphen(wp)
  22. int *wp;
  23. {
  24.     register *i, j;
  25.  
  26.     i = wp;
  27.     while(punct(*i++))
  28.         ;
  29.     if (!alph(*--i))
  30.         return;
  31.     wdstart = i++;
  32.     while(alph(*i++))
  33.         ;
  34.     hyend = wdend = --i-1;
  35.     while(punct(*i++))
  36.         ;
  37.     if (*--i)
  38.         return;
  39.     if ((wdend-wdstart-4) < 0)
  40.         return;
  41.     hyp = hyptr;
  42.     *hyp = 0;
  43.     hyoff = 2;
  44.     if (!exword() && !suffix())
  45.         digram();
  46.     *hyp++ = 0;
  47.     if (*hyptr) for(j = 1; j;) {
  48.         j = 0;
  49.         for(hyp = hyptr+1; *hyp != 0; hyp++) {
  50.             if (*(hyp-1) > *hyp) {
  51.                 j++;
  52.                 i = *hyp;
  53.                 *hyp = *(hyp-1);
  54.                 *(hyp-1) = i;
  55.             }
  56.         }
  57.     }
  58. }
  59.  
  60. punct(i)
  61. int i;
  62. {
  63.     if (!i || alph(i))
  64.         return(0);
  65.     else
  66.         return(1);
  67. }
  68.  
  69. alph(i)
  70. int i;
  71. {
  72.     register j;
  73.  
  74.     j = i & CMASK;
  75.     if (((j >= 'A') && (j <= 'Z')) || ((j >= 'a') && (j <= 'z')))
  76.         return(1);
  77.     else
  78.         return(0);
  79. }
  80.  
  81. caseht()
  82. {
  83.     thresh = THRESH;
  84.     if (skip())
  85.         return;
  86.     noscale++;
  87.     thresh = atoi();
  88.     noscale = 0;
  89. }
  90.  
  91. casehw()
  92. {
  93.     register i, k;
  94.     register char *j;
  95.  
  96.     k = 0;
  97.     while(!skip()) {
  98.         if ((j = nexth) >= (hbuf + NHEX - 2))
  99.             goto full;
  100.         for (;;) {
  101.             if ((i = getch()) & MOT)
  102.                 continue;
  103.             if (((i &= CMASK) == ' ') || (i == '\n')) {
  104.                 *j++ = 0;
  105.                 nexth = j;
  106.                 *j = 0;
  107.                 if (i == ' ')
  108.                     break;
  109.                 else
  110.                     return;
  111.             }
  112.             if (i == '-') {
  113.                 k = 0200;
  114.                 continue;
  115.             }
  116.             *j++ = maplow(i) | k;
  117.             k = 0;
  118.             if (j >= (hbuf + NHEX - 2))
  119.                 goto full;
  120.         }
  121.     }
  122.     return;
  123. full:
  124.     prstr("Exception word list full.\n");
  125.     *nexth = 0;
  126. }
  127.  
  128. exword()
  129. {
  130.     register int *w;
  131.     register char *e;
  132.     char *save;
  133.  
  134.     e = hbuf;
  135.     while(1) {
  136.         save = e;
  137.         if (*e == 0)return(0);
  138.         w = wdstart;
  139.         while((*e && (w <= hyend)) &&
  140.               ((*e & 0177) == maplow(*w & CMASK))) {e++; w++;};
  141.         if (!*e) {
  142.             if (((w-1) == hyend) ||
  143.                ((w == wdend) && (maplow(*w & CMASK) == 's'))) {
  144.                 w = wdstart;
  145.                 for(e = save; *e; e++) {
  146.                     if (*e & 0200)*hyp++ = w;
  147.                     if (hyp > (hyptr+NHYP-1))
  148.                         hyp = hyptr+NHYP-1;
  149.                     w++;
  150.                 }
  151.                 return(1);
  152.             }else{e++; continue;}
  153.         }else while(*e++);
  154.     }
  155. }
  156.  
  157. suffix()
  158. {
  159.     register int *w;
  160.     register char *s, *s0;
  161.     int i;
  162.     extern char *suftab[];
  163.     extern int *chkvow();
  164.  
  165. again:
  166.     if (!alph(i = *hyend & CMASK))
  167.         return(0);
  168.     if (i < 'a')
  169.         i -= 'A'-'a';
  170.     if ((s0 = suftab[i-'a']) == 0)
  171.         return(0);
  172.     for (;;) {
  173.         if ((i = *s0 & 017) == 0)
  174.             return(0);
  175.         s = s0 + i - 1;
  176.         w = hyend - 1;
  177.         while(((s > s0) && (w >= wdstart)) &&
  178.            ((*s & 0177) == maplow(*w))) {
  179.             s--;
  180.             w--;
  181.         }
  182.         if (s == s0)
  183.             break;
  184.         s0 += i;
  185.     }
  186.     s = s0 + i - 1;
  187.     w = hyend;
  188.     if (*s0 & 0200) goto mark;
  189.     while(s > s0) {
  190.         w--;
  191.         if (*s-- & 0200) {
  192.     mark:
  193.             hyend = w - 1;
  194.             if (*s0 & 0100)
  195.                 continue;
  196.             if (!chkvow(w))
  197.                 return(0);
  198.             *hyp++ = w;
  199.         }
  200.     }
  201.     if (*s0 & 040)
  202.         return(0);
  203.     if (exword())
  204.         return(1);
  205.     goto again;
  206. }
  207.  
  208. maplow(i)
  209. int i;
  210. {
  211.     if ((i &= CMASK) < 'a')i += 'a' - 'A';
  212.     return(i);
  213. }
  214.  
  215. vowel(i)
  216. int i;
  217. {
  218.     switch(maplow(i)) {
  219.         case 'a':
  220.         case 'e':
  221.         case 'i':
  222.         case 'o':
  223.         case 'u':
  224.         case 'y':
  225.             return(1);
  226.         default:
  227.             return(0);
  228.     }
  229. }
  230.  
  231. int *chkvow(w)
  232. int *w;
  233. {
  234.     while(--w >= wdstart)if(vowel(*w & CMASK))return(w);
  235.     return(0);
  236. }
  237.  
  238. digram() {
  239.     register *w, val;
  240.     int *nhyend, *maxw, maxval;
  241.     extern char bxh[26][13], bxxh[26][13], xxh[26][13], xhx[26][13], hxx[26][13];
  242.  
  243. again:
  244.     if (!(w=chkvow(hyend+1)))return;
  245.     hyend = w;
  246.     if (!(w=chkvow(hyend)))return;
  247.     nhyend = w;
  248.     maxval = 0;
  249.     w--;
  250.     while((++w < hyend) && (w < (wdend-1))) {
  251.         val = 1;
  252.         if (w == wdstart)val *= dilook('a',*w,bxh);
  253.         else if(w == wdstart+1)val *= dilook(*(w-1),*w,bxxh);
  254.         else val *= dilook(*(w-1),*w,xxh);
  255.         val *= dilook(*w, *(w+1), xhx);
  256.         val *= dilook(*(w+1), *(w+2), hxx);
  257.         if (val > maxval) {
  258.             maxval = val;
  259.             maxw = w + 1;
  260.         }
  261.     }
  262.     hyend = nhyend;
  263.     if (maxval > thresh)*hyp++ = maxw;
  264.     goto again;
  265. }
  266.  
  267. dilook(a,b,t)
  268. int a, b;
  269. char t[26][13];
  270. {
  271.     register i, j;
  272.  
  273.     i = t[maplow(a)-'a'][(j = maplow(b)-'a')/2];
  274.     if (!(j & 01))i >>= 4;
  275.     return(i & 017);
  276. }
  277.