Annotation of researchv10no/cmd/ap/apkeys/suft.c, revision 1.1.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.