Annotation of researchv10no/cmd/troff/Old/n8.c, revision 1.1

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

unix.superglobalmegacorp.com

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