Annotation of researchv10no/cmd/ap/apkeys/suft.c, revision 1.1

1.1     ! root        1: # include "stdio.h"
        !             2: # include "assert.h"
        !             3: # define SAME 0
        !             4: struct suft {
        !             5:        char *told;
        !             6:        int tlen;
        !             7:        char *tnew;
        !             8:        int type;
        !             9:        }
        !            10: # define S 1
        !            11: # define EDING 2
        !            12: # define LY 3
        !            13: suftab[] = {
        !            14: {"is", 2, "is", S},
        !            15: {"ies", 3, "y", S},
        !            16: {"us", 2, "us", S},
        !            17: {"sses", 4, "ss", S},
        !            18: {"xes", 3, "x", S},
        !            19: {"jones", 5, "jones", S},
        !            20: {"ss", 2, "ss", S},
        !            21: {"ings", 4, "", EDING},
        !            22: {"namics", 6, "namics", S},
        !            23: {"hysics", 6, "hysics", S},
        !            24: {"hes", 3, "h", S},
        !            25: {"autics", 6, "autics", S},
        !            26: {"matics", 6, "matics", S},
        !            27: {"stics", 5, "stics", S},
        !            28: {"news", 4, "news", S},
        !            29: {"setts", 5, "setts", S},
        !            30: {"denes", 5, "denes", S},
        !            31: {"'s", 2, "", S},
        !            32: {"s", 1, "", S},
        !            33: {"speed", 5, "speed", EDING},
        !            34: {"ied", 3, "y", EDING},
        !            35: {"ed", 2, "", EDING},
        !            36: {"ssing", 5, "ss", EDING},
        !            37: {"ing", 3, "", EDING},
        !            38: {"ply", 3, "ply", LY},
        !            39: {"ily", 3, "ily", LY},
        !            40: {"ly", 2, "", LY},
        !            41: {0, 0, 0}};
        !            42: # define OK 0
        !            43: # define ADD 1
        !            44: struct et {
        !            45:        char *esuf;
        !            46:        int elen;
        !            47:        int evow;
        !            48:        int eadd;
        !            49:        } etab[] = {
        !            50: {"x", 1, 0, OK},
        !            51: {"sponsor", 7, 0, OK},
        !            52: {"monitor", 7, 0, OK},
        !            53: {"og", 2, 2, OK},
        !            54: {"Vg", 2, 0, ADD},
        !            55: {"ow", 2, 0, OK},
        !            56: {"dit", 3, 0, OK},
        !            57: {"er", 2, 0, OK},
        !            58: {"el", 2, 0, OK},
        !            59: {"ss", 2, 0, OK},
        !            60: {"et", 2, 0, OK},
        !            61: {"el", 2, 0, OK},
        !            62: {"air", 3, 0, OK},
        !            63: {"en", 2, 2, OK},
        !            64: {"on", 2, 2, OK},
        !            65: {"ong", 3, 0, OK},
        !            66: {"CVC", 3, 0, ADD},
        !            67: {"VVv", 3, 0, ADD},
        !            68: {"Vlv", 3, 0, ADD},
        !            69: {"nc", 2, 0, ADD},
        !            70: {"pl", 2, 0, ADD},
        !            71: {"bl", 2, 0, ADD},
        !            72: {"rg", 2, 0, ADD},
        !            73: {"lg", 2, 0, ADD},
        !            74: {"dg", 2, 0, ADD},
        !            75: {"ng", 2, 0, ADD},
        !            76: {"iat", 3, 0, ADD},
        !            77: {"u", 1, 0, ADD},
        !            78: {"uir", 3, 0, ADD},
        !            79: {"Cs", 2, 0, ADD},
        !            80: {"us", 2, 0, ADD},
        !            81: {0, 0, 0}};
        !            82: char vow[] = {
        !            83: /*nul  soh  stx  etx  eot  enq  ack  bel  */
        !            84:    0,   0,   0,   0,   0,   0,   0,   0,
        !            85: /*bs   ht   nl   vt   np   cr   so   si   */
        !            86:    0,   0,   0,   0,   0,   0,   0,   0,
        !            87: /*dle  dc1  dc2  dc3  dc4  nak  syn  etb  */
        !            88:    0,   0,   0,   0,   0,   0,   0,   0,
        !            89: /*can  em   sub  esc  fs   gs   rs   us   */
        !            90:    0,   0,   0,   0,   0,   0,   0,   0,
        !            91: /*sp    !    "    #    $    %    &    '   */
        !            92:    0,   0,   0,   0,   0,   0,   0,   0,
        !            93: /* (    )    *    +    ,    -    .    /   */
        !            94:    0,   0,   0,   0,   0,   0,   0,   0,
        !            95: /* 0    1    2    3    4    5    6    7   */
        !            96:    0,   0,   0,   0,   0,   0,   0,   0,
        !            97: /* 8    9    :    ;    <    =    >    ?   */
        !            98:    0,   0,   0,   0,   0,   0,   0,   0,
        !            99: /* @    A    B    C    D    E    F    G   */
        !           100:    0,   1,   0,   0,   0,   1,   0,   0,
        !           101: /* H    I    J    K    L    M    N    O   */
        !           102:    0,   1,   0,   0,   0,   0,   0,   1,
        !           103: /* P    Q    R    S    T    U    V    W   */
        !           104:    0,   0,   0,   0,   0,   1,   0,   0,
        !           105: /* X    Y    Z    [    \    ]    ^    _   */
        !           106:    0,   1,   0,   0,   0,   0,   0,   0,
        !           107: /* `    a    b    c    d    e    f    g   */
        !           108:    0,   1,   0,   0,   0,   1,   0,   0,
        !           109: /* h    i    j    k    l    m    n    o   */
        !           110:    0,   1,   0,   0,   0,   0,   0,   1,
        !           111: /* p    q    r    s    t    u    v    w   */
        !           112:    0,   0,   0,   0,   0,   1,   0,   0,
        !           113: /* x    y    z    {         }    ~   del  */
        !           114:    0,   1,   0,   0,   0,   0,   0,   0 };
        !           115: char *
        !           116: sufstr(p)
        !           117:        char *p;
        !           118: { /* removes a few common suffixes */
        !           119: static char wd[50];
        !           120: struct suft *x;
        !           121: struct et *xe;
        !           122: register char *s; register int c;
        !           123: int nl, nv;
        !           124: strcpy(wd, p);
        !           125: nl = strlen(wd);
        !           126: for(s=wd; *s; s++);
        !           127: for(x=suftab; x->told; x++)
        !           128:        {
        !           129:        if (nl < x->tlen) continue;
        !           130:        if (strcmp(x->told, s-x->tlen)==SAME)
        !           131:                {
        !           132:                s -= x->tlen;
        !           133:                strcpy(s, x->tnew);
        !           134:                nv = novow(wd);
        !           135:                if (strlen(wd)<3 || nv==0)
        !           136:                        return(p);
        !           137:                switch(x->type)
        !           138:                        {
        !           139:                        case S:
        !           140:                                return(wd);
        !           141:                        case EDING:
        !           142:                        c = s[-1];
        !           143:                        if (s[0]!=0) return(wd);
        !           144:                        /* undouble final consonant? */
        !           145:                        if (!vow[c] && c!= 's' && c==s[-2] && (c!='l'||nv>1))
        !           146:                                {
        !           147:                                s[-1]=0;
        !           148:                                return(wd);
        !           149:                                }
        !           150:                        /* add final e decision */
        !           151:                        for( xe = etab; xe->esuf; xe++)
        !           152:                                {
        !           153:                                if (xe->evow > nv)
        !           154:                                        continue;
        !           155:                                if (ecomp(xe->esuf, s-xe->elen))
        !           156:                                        {
        !           157:                                        if (xe->eadd)
        !           158:                                                strcpy(s, "e");
        !           159:                                        return(wd);
        !           160:                                        }
        !           161:                                }
        !           162:                        return(wd);
        !           163:                        case LY:
        !           164:                                return(wd);
        !           165:                        }
        !           166:                return(wd);
        !           167:                }
        !           168:        }
        !           169: return(p);
        !           170: }
        !           171: ecomp (etent, wd)
        !           172:        char *etent, *wd;
        !           173: {
        !           174: register int c, d;
        !           175: while ( c= *etent++)
        !           176:        {
        !           177:        d = *wd++;
        !           178:        switch(c)
        !           179:                {
        !           180:                case 'C':
        !           181:                        if (!vow[d])
        !           182:                                continue;
        !           183:                        else
        !           184:                                return(0);
        !           185:                case 'V':
        !           186:                        if (vow[d])
        !           187:                                continue;
        !           188:                        else
        !           189:                                return(0);
        !           190:                default:
        !           191:                        if (c==d)
        !           192:                                continue;
        !           193:                        else
        !           194:                                return(0);
        !           195:                }
        !           196:        }
        !           197: return(1);
        !           198: }
        !           199: novow(s)
        !           200:        char *s;
        !           201: {
        !           202: int c, k=0;
        !           203: while (c = *s++)
        !           204:        if (vow[c])
        !           205:                k++;
        !           206: return(k);
        !           207: }
        !           208: char *comwords[420];
        !           209: # define NCHASH 401
        !           210: int hashc[NCHASH];
        !           211: char comspace[2000];
        !           212: char *combuff=comspace;
        !           213: char *comname = "/usr/lib/refer/function";
        !           214: common (s)
        !           215:        char *s;
        !           216: {
        !           217: char *p;
        !           218: static int cgate=0;
        !           219: register int k, c, i;
        !           220: if (cgate==0)
        !           221:        {
        !           222:        cgate=1;
        !           223:        comstart();
        !           224:        }
        !           225: c = s[0];
        !           226: for(k = hash(s); i = hashc[k]; k=(k+1)%NCHASH)
        !           227:        {
        !           228:        p = comwords[i];
        !           229:        if (p==NULL) continue;
        !           230:        if (c!= *p) continue;
        !           231:        if (strcmp(p, s)==SAME)
        !           232:                return(1);
        !           233:        }
        !           234: return(0);
        !           235: }
        !           236: hash(s)
        !           237:        register char *s;
        !           238: {
        !           239: register int n=0, c;
        !           240: while ( c = *s++)
        !           241:        {
        !           242:        n += (c<<n%4);
        !           243:        }
        !           244: return ( ( n & 077777) %NCHASH);
        !           245: }
        !           246: comstart()
        !           247: {
        !           248: FILE *comf;
        !           249: char line[300];
        !           250: int nw=1, j, i;
        !           251: /* to permit fast test, we skip one byte at start of combuff */
        !           252: comf= fopen(comname, "r");
        !           253: assert(comf!=NULL);
        !           254: while (fgets(line, 300, comf))
        !           255:        {
        !           256:        trimnl(line);
        !           257:        comwords[i=nw++]=combuff;
        !           258:        strcpy(combuff, line);
        !           259:        while (*combuff++);
        !           260:        assert(nw<300);
        !           261:        assert(combuff<comspace+2000);
        !           262:        j = hash (comwords[i]);
        !           263:        while (hashc[j]) j++;
        !           264:        hashc[j]=i;
        !           265:        assert(j<1500);
        !           266:        }
        !           267: fclose(comf);
        !           268: }

unix.superglobalmegacorp.com

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