Annotation of 43BSD/usr.bin/troff/n8.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.