Annotation of 43BSDReno/usr.bin/roff/common_source/n8.c, revision 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.