Annotation of researchv9/cmd/troff/n8.c, revision 1.1

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

unix.superglobalmegacorp.com

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