|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.