Annotation of researchv10no/cmd/troff/ancient.nroff/n8.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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