diff options
author | marha <marha@users.sourceforge.net> | 2011-10-05 17:37:34 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-10-05 17:37:34 +0200 |
commit | f7025b4baa1ba35ee796785641f04eac5bedb0a6 (patch) | |
tree | 3df62b7b501a478e212397883657a8a8be4db7a3 /mesalib/src/mesa/program/hash_table.c | |
parent | 60adbfdea1ee754341d64454274e7aa83bae8971 (diff) | |
download | vcxsrv-f7025b4baa1ba35ee796785641f04eac5bedb0a6.tar.gz vcxsrv-f7025b4baa1ba35ee796785641f04eac5bedb0a6.tar.bz2 vcxsrv-f7025b4baa1ba35ee796785641f04eac5bedb0a6.zip |
mkfontscale pixman xserver xtrans libX11 libXdmcp libxcb libXmu mesa git update 5 oct 2011
Diffstat (limited to 'mesalib/src/mesa/program/hash_table.c')
-rw-r--r-- | mesalib/src/mesa/program/hash_table.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/mesalib/src/mesa/program/hash_table.c b/mesalib/src/mesa/program/hash_table.c index 877a9e2ff..dc8563a33 100644 --- a/mesalib/src/mesa/program/hash_table.c +++ b/mesalib/src/mesa/program/hash_table.c @@ -108,8 +108,8 @@ hash_table_clear(struct hash_table *ht) } -void * -hash_table_find(struct hash_table *ht, const void *key) +static struct hash_node * +get_node(struct hash_table *ht, const void *key) { const unsigned hash_value = (*ht->hash)(key); const unsigned bucket = hash_value % ht->num_buckets; @@ -119,13 +119,20 @@ hash_table_find(struct hash_table *ht, const void *key) struct hash_node *hn = (struct hash_node *) node; if ((*ht->compare)(hn->key, key) == 0) { - return hn->data; + return hn; } } return NULL; } +void * +hash_table_find(struct hash_table *ht, const void *key) +{ + struct hash_node *hn = get_node(ht, key); + + return (hn == NULL) ? NULL : hn->data; +} void hash_table_insert(struct hash_table *ht, void *data, const void *key) @@ -143,21 +150,39 @@ hash_table_insert(struct hash_table *ht, void *data, const void *key) } void -hash_table_remove(struct hash_table *ht, const void *key) +hash_table_replace(struct hash_table *ht, void *data, const void *key) { const unsigned hash_value = (*ht->hash)(key); const unsigned bucket = hash_value % ht->num_buckets; struct node *node; + struct hash_node *hn; foreach(node, & ht->buckets[bucket]) { - struct hash_node *hn = (struct hash_node *) node; + hn = (struct hash_node *) node; if ((*ht->compare)(hn->key, key) == 0) { - remove_from_list(node); - free(node); + hn->data = data; return; } } + + hn = calloc(1, sizeof(*hn)); + + hn->data = data; + hn->key = key; + + insert_at_head(& ht->buckets[bucket], & hn->link); +} + +void +hash_table_remove(struct hash_table *ht, const void *key) +{ + struct node *node = (struct node *) get_node(ht, key); + if (node != NULL) { + remove_from_list(node); + free(node); + return; + } } void |