Annotation of researchv10no/cmd/visi/hashing.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *      hashing.c 1.3
                      3:  *
                      4:  *     Hashing Functions for Spreadsheet Program `vis'
                      5:  *
                      6:  *      A. F. Gettier
                      7:  *      Bell Laboratories
                      8:  *      Update made 11/1/82 11:11:37
                      9:  *      Retrieved 11/15/82 13:22:21
                     10:  */
                     11: #include       <stdio.h>
                     12: #include       "vis.h"
                     13: #include       "y.tab.h"
                     14: 
                     15: struct hashhdr htbl;
                     16: 
                     17: static struct reswd reswd[]={
                     18:        "PI", PI,
                     19:        "ABS", ABS,
                     20:        "ACOS", ACOS,
                     21:        "ASIN", ASIN,
                     22:        "AT", AT,
                     23:        "ATAN", ATAN,
                     24:        "ATAN2", ATAN2,
                     25:        "COS", COS,
                     26:        "EXP", EXP,
                     27:        "GAMMA", GAMMA,
                     28:        "HYPOT", HYPOT,
                     29:        "INT", INT,
                     30:        "LOG", LOG,
                     31:        "POW", POW,
                     32:        "SIN", SIN,
                     33:        "SQRT", SQRT,
                     34:        "COL", COL,
                     35:        "COPY", COPY,
                     36:        "DEBUG", DEBUG,
                     37:        "DOWN", DOWN,
                     38:        "DUP", DUP,
                     39:        "DUPLICATE", DUPLICATE,
                     40:        "EDIT", EDIT,
                     41:        "HELP", HELP,
                     42:        "LEFT", LEFT,
                     43:        "LIST", LIST,
                     44:        "POSITION", POSITION,
                     45:        "READ", READ,
                     46:        "REDRAW", REDRAW,
                     47:        "REFRESH", REFRESH,
                     48:        "REP", REP,
                     49:        "REPLICATE", REPLICATE,
                     50:        "RIGHT", RIGHT,
                     51:        "ROW", ROW,
                     52:        "SCALE", SCALE,
                     53:        "SHIFT", SHIFT,
                     54:        "SLIDE", SLIDE,
                     55:        "SHELL", SHELL,
                     56:        "SH", SH,
                     57:        "THRU", THRU,
                     58:        "UP", UP,
                     59:        "VER", VER,
                     60:        "WIDTH", WIDTH,
                     61:        "WRITE", WRITE,
                     62:        "ZERO", ZERO,
                     63:        "QUIT", QUIT,
                     64:        0, 0 };
                     65: 
                     66: /*
                     67:  *     Init a hash table
                     68:  */
                     69: void hashinit()
                     70: {
                     71:        int     i;
                     72:        int     size;
                     73:        struct hashentry        *tbl;
                     74:        size = 63; /* default hash table size */
                     75:        htbl.size = size;
                     76:        tbl = htbl.table = multnode( hashentry, size );
                     77:        for ( i=0; i<size; i++ ) (tbl++)->symbol = 0;
                     78:        /*
                     79:         *      enter all the keywords
                     80:         */
                     81:        for( i=0; reswd[i].name!=0; i++ )
                     82:                hashenter( reswd[i].name, reswd[i].value );
                     83: }
                     84: 
                     85: /*
                     86:  *     Search a hash table
                     87:  */
                     88: hashsearch( symbol )
                     89: char   *symbol;
                     90: {
                     91:        int     key, mkey;
                     92:        struct hashentry        *tbl, *start;
                     93:        key = makekey( symbol );
                     94:        mkey = key%(htbl.size - 1);
                     95:        start = tbl = htbl.table + mkey;
                     96:        do {
                     97:                if ( tbl->symbol == 0 ) return( 0 );
                     98:                if ( tbl->symbol != (char *)(-1) && tbl->key == key
                     99:                    && strcmp( symbol, tbl->symbol ) == 0 )
                    100:                        return(tbl->value);
                    101:                tbl++;
                    102:                if ( tbl >= (htbl.table + htbl.size ) )  tbl = htbl.table;
                    103:        } while ( tbl != start );
                    104:        return( 0 );
                    105: }
                    106: 
                    107: /*
                    108:  *     Enter into a hash table
                    109:  */
                    110: void hashenter( symbol, value )
                    111: char   *symbol;
                    112: int    value;
                    113: {
                    114:        int     key, mkey;
                    115:        float   a, b;
                    116:        struct hashentry        *tbl;
                    117:        a = htbl.size;
                    118:        b = htbl.entry;
                    119:        /*
                    120:         *      First try to clean up the table
                    121:         */
                    122:        if ( b/a > .65 )        hashclean( );
                    123:        /*
                    124:         *      Now expand
                    125:         */
                    126:        b = htbl.entry;
                    127:        if ( b/a > .65 )        hashexpand( );
                    128:        key = makekey( symbol );
                    129:        mkey = key%(htbl.size - 1);
                    130:        tbl = htbl.table;
                    131:        tbl += mkey;
                    132:        loop {
                    133:                if ( tbl->symbol == 0 || tbl->symbol == (char *)(-1)) {
                    134:                        tbl->key = key;
                    135:                        tbl->symbol = symbol;
                    136:                        (htbl.entry)++;
                    137:                        tbl->value = value;
                    138:                        return;
                    139:                }
                    140:                if ( tbl->key == key && strcmp( symbol, tbl->symbol ) == 0 ) {
                    141:                        tbl->value = value;
                    142:                        return;
                    143:                }
                    144:                tbl++;
                    145:                if ( tbl >= (htbl.table + htbl.size ) )  tbl = htbl.table;
                    146:        }
                    147: }
                    148: 
                    149: /*
                    150:  *     Make the key
                    151:  */
                    152: static makekey( symbol )
                    153: char   *symbol;
                    154: {
                    155:        int     key, i;
                    156:        key = 0;
                    157:        i = 8;
                    158:        while (*symbol != 0) {
                    159:                key += *symbol + ((*symbol)<<8) + ((*symbol)<<(i++));
                    160:                symbol++;
                    161:        }
                    162:        return( ((key<0)?(-key):(key)) );
                    163: }
                    164: 
                    165: /*
                    166:  *     Expand the Hash Table
                    167:  */
                    168: static hashexpand( )
                    169:  {
                    170:        int     i, mkey, size;
                    171:        struct hashentry        *tbl, *temp, *tbl2;
                    172:        size = htbl.size * 2 + 1;
                    173:        tbl = temp = multnode( hashentry, size );
                    174:        for ( i=0; i<size; i++ ) (temp++)->symbol = 0;
                    175:        tbl2 = htbl.table;
                    176:        for ( i=0; i<htbl.size; i++ ) {
                    177:                if ( tbl2->symbol == 0 || tbl2->symbol == (char *)(-1)) {
                    178:                        tbl2++;
                    179:                        continue;
                    180:                }
                    181:                mkey = (tbl2->key)%(size - 1);
                    182:                temp = tbl;
                    183:                temp += mkey;
                    184:                loop {
                    185:                        if ( temp->symbol == 0 ) {
                    186:                                temp->key = tbl2->key;
                    187:                                temp->symbol = tbl2->symbol;
                    188:                                temp->value = tbl2->value;
                    189:                                tbl2++;
                    190:                                break;
                    191:                        }
                    192:                        temp++;
                    193:                        if ( temp >= ( tbl+ size ) )  temp = tbl;
                    194:                }
                    195:        }
                    196:        free( (char *)htbl.table );
                    197:        htbl.size = size;
                    198:        htbl.table = tbl;
                    199: }
                    200: 
                    201: /*
                    202:  *     Clean up the Hash Table
                    203:  */
                    204: static hashclean( )
                    205: {
                    206:        int     i, mkey, size, entry;
                    207:        struct hashentry        *tbl, *temp, *tbl2;
                    208:        size = htbl.size;
                    209:        tbl = temp = multnode( hashentry, size );
                    210:        for ( i=0; i<size; i++ ) (temp++)->symbol = 0;
                    211:        entry = 0;
                    212:        tbl2 = htbl.table;
                    213:        for ( i=0; i<htbl.size; i++ ) {
                    214:                if ( tbl2->symbol == 0 || tbl2->symbol == (char *)(-1)) {
                    215:                        tbl2++;
                    216:                        continue;
                    217:                }
                    218:                mkey = (tbl2->key)%(size - 1);
                    219:                temp = tbl;
                    220:                temp += mkey;
                    221:                loop {
                    222:                        if ( temp->symbol == 0 ) {
                    223:                                temp->key = tbl2->key;
                    224:                                temp->symbol = tbl2->symbol;
                    225:                                temp->value = tbl2->value;
                    226:                                tbl2++;
                    227:                                entry++;
                    228:                                break;
                    229:                        }
                    230:                        temp++;
                    231:                        if ( temp >= ( tbl+ size ) )  temp = tbl;
                    232:                }
                    233:        }
                    234:        free( (char *)htbl.table );
                    235:        htbl.entry = entry;
                    236:        htbl.table = tbl;
                    237: }

unix.superglobalmegacorp.com

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