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: }

Defined functions

alph defined in line 69; used 5 times
caseht defined in line 81; used 2 times
casehw defined in line 91; used 2 times
chkvow defined in line 231; used 4 times
digram defined in line 238; used 1 times
  • in line 45
dilook defined in line 267; used 5 times
exword defined in line 128; used 2 times
hyphen defined in line 21; used 1 times
maplow defined in line 208; used 7 times
punct defined in line 60; used 2 times
suffix defined in line 157; used 1 times
  • in line 44
vowel defined in line 215; used 1 times

Defined variables

hbuf defined in line 9; used 4 times
hyend defined in line 11; used 12 times
nexth defined in line 10; used 3 times
thresh defined in line 19; used 3 times

Defined macros

THRESH defined in line 18; used 2 times
Last modified: 1981-07-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1097
Valid CSS Valid XHTML 1.0 Strict