Annotation of researchv10no/cmd/troff/ancient.nroff/n8.c, revision 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.