#ifndef lint static char sccsid[] = "@(#)n8.c 4.1 6/7/82"; #endif lint #include "tdef.h" /* troff8.c hyphenation */ char hbuf[NHEX]; char *nexth = hbuf; int *hyend; extern int *wdstart, *wdend; extern int *hyptr[]; extern int **hyp; extern int hyoff; extern int noscale; extern int xxx; #define THRESH 160 /*digram goodness threshold*/ int thresh = THRESH; hyphen(wp) int *wp; { register *i, j; i = wp; while(punct(*i++)) ; if (!alph(*--i)) return; wdstart = i++; while(alph(*i++)) ; hyend = wdend = --i-1; while(punct(*i++)) ; if (*--i) return; if ((wdend-wdstart-4) < 0) return; hyp = hyptr; *hyp = 0; hyoff = 2; if (!exword() && !suffix()) digram(); *hyp++ = 0; if (*hyptr) for(j = 1; j;) { j = 0; for(hyp = hyptr+1; *hyp != 0; hyp++) { if (*(hyp-1) > *hyp) { j++; i = *hyp; *hyp = *(hyp-1); *(hyp-1) = i; } } } } punct(i) int i; { if (!i || alph(i)) return(0); else return(1); } alph(i) int i; { register j; j = i & CMASK; if (((j >= 'A') && (j <= 'Z')) || ((j >= 'a') && (j <= 'z'))) return(1); else return(0); } caseht() { thresh = THRESH; if (skip()) return; noscale++; thresh = atoi(); noscale = 0; } casehw() { register i, k; register char *j; k = 0; while(!skip()) { if ((j = nexth) >= (hbuf + NHEX - 2)) goto full; for (;;) { if ((i = getch()) & MOT) continue; if (((i &= CMASK) == ' ') || (i == '\n')) { *j++ = 0; nexth = j; *j = 0; if (i == ' ') break; else return; } if (i == '-') { k = 0200; continue; } *j++ = maplow(i) | k; k = 0; if (j >= (hbuf + NHEX - 2)) goto full; } } return; full: prstr("Exception word list full.\n"); *nexth = 0; } exword() { register int *w; register char *e; char *save; e = hbuf; while(1) { save = e; if (*e == 0)return(0); w = wdstart; while((*e && (w <= hyend)) && ((*e & 0177) == maplow(*w & CMASK))) {e++; w++;}; if (!*e) { if (((w-1) == hyend) || ((w == wdend) && (maplow(*w & CMASK) == 's'))) { w = wdstart; for(e = save; *e; e++) { if (*e & 0200)*hyp++ = w; if (hyp > (hyptr+NHYP-1)) hyp = hyptr+NHYP-1; w++; } return(1); }else{e++; continue;} }else while(*e++); } } suffix() { register int *w; register char *s, *s0; int i; extern char *suftab[]; extern int *chkvow(); again: if (!alph(i = *hyend & CMASK)) return(0); if (i < 'a') i -= 'A'-'a'; if ((s0 = suftab[i-'a']) == 0) return(0); for (;;) { if ((i = *s0 & 017) == 0) return(0); s = s0 + i - 1; w = hyend - 1; while(((s > s0) && (w >= wdstart)) && ((*s & 0177) == maplow(*w))) { s--; w--; } if (s == s0) break; s0 += i; } s = s0 + i - 1; w = hyend; if (*s0 & 0200) goto mark; while(s > s0) { w--; if (*s-- & 0200) { mark: hyend = w - 1; if (*s0 & 0100) continue; if (!chkvow(w)) return(0); *hyp++ = w; } } if (*s0 & 040) return(0); if (exword()) return(1); goto again; } maplow(i) int i; { if ((i &= CMASK) < 'a')i += 'a' - 'A'; return(i); } vowel(i) int i; { switch(maplow(i)) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': return(1); default: return(0); } } int *chkvow(w) int *w; { while(--w >= wdstart)if(vowel(*w & CMASK))return(w); return(0); } digram() { register *w, val; int *nhyend, *maxw, maxval; extern char bxh[26][13], bxxh[26][13], xxh[26][13], xhx[26][13], hxx[26][13]; again: if (!(w=chkvow(hyend+1)))return; hyend = w; if (!(w=chkvow(hyend)))return; nhyend = w; maxval = 0; w--; while((++w < hyend) && (w < (wdend-1))) { val = 1; if (w == wdstart)val *= dilook('a',*w,bxh); else if(w == wdstart+1)val *= dilook(*(w-1),*w,bxxh); else val *= dilook(*(w-1),*w,xxh); val *= dilook(*w, *(w+1), xhx); val *= dilook(*(w+1), *(w+2), hxx); if (val > maxval) { maxval = val; maxw = w + 1; } } hyend = nhyend; if (maxval > thresh)*hyp++ = maxw; goto again; } dilook(a,b,t) int a, b; char t[26][13]; { register i, j; i = t[maplow(a)-'a'][(j = maplow(b)-'a')/2]; if (!(j & 01))i >>= 4; return(i & 017); }