summaryrefslogtreecommitdiffstats
path: root/dhash/dhash.c
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2010-09-29 12:24:19 +0200
committerStephen Gallagher <sgallagh@redhat.com>2010-10-12 14:26:07 -0400
commit8a5a0c340cb259103abc77d37960710177a74f8c (patch)
treef4a8f0d7c093763b284bcda578e221001827a86c /dhash/dhash.c
parent841a1ab44968f13f0f7b6a2ace4e38d418142cbd (diff)
downloadding-libs-8a5a0c340cb259103abc77d37960710177a74f8c.tar.gz
ding-libs-8a5a0c340cb259103abc77d37960710177a74f8c.tar.xz
ding-libs-8a5a0c340cb259103abc77d37960710177a74f8c.zip
dhash: Allow hash_enter() to update entries
Diffstat (limited to 'dhash/dhash.c')
-rw-r--r--dhash/dhash.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/dhash/dhash.c b/dhash/dhash.c
index cb292b7..f92e463 100644
--- a/dhash/dhash.c
+++ b/dhash/dhash.c
@@ -898,34 +898,10 @@ int hash_enter(hash_table_t *table, hash_key_t *key, hash_value_t *value)
memcpy((void *)element->entry.key.str, key->str, len);
break;
}
- switch(element->entry.value.type = value->type) {
- case HASH_VALUE_UNDEF:
- element->entry.value.ul = 0;
- break;
- case HASH_VALUE_PTR:
- element->entry.value.ptr = value->ptr;
- break;
- case HASH_VALUE_INT:
- element->entry.value.i = value->i;
- break;
- case HASH_VALUE_UINT:
- element->entry.value.ui = value->ui;
- break;
- case HASH_VALUE_LONG:
- element->entry.value.l = value->l;
- break;
- case HASH_VALUE_ULONG:
- element->entry.value.ul = value->ul;
- break;
- case HASH_VALUE_FLOAT:
- element->entry.value.f = value->f;
- break;
- case HASH_VALUE_DOUBLE:
- element->entry.value.d = value->d;
- break;
- }
+
*chain = element; /* link into chain */
element->next = NULL;
+
/*
* Table over-full?
*/
@@ -934,7 +910,38 @@ int hash_enter(hash_table_t *table, hash_key_t *key, hash_value_t *value)
return error;
}
}
- } /* end not found */
+
+ } else {
+ hdelete_callback(table, HASH_ENTRY_DESTROY, &element->entry);
+ }
+
+ switch(element->entry.value.type = value->type) {
+ case HASH_VALUE_UNDEF:
+ element->entry.value.ul = 0;
+ break;
+ case HASH_VALUE_PTR:
+ element->entry.value.ptr = value->ptr;
+ break;
+ case HASH_VALUE_INT:
+ element->entry.value.i = value->i;
+ break;
+ case HASH_VALUE_UINT:
+ element->entry.value.ui = value->ui;
+ break;
+ case HASH_VALUE_LONG:
+ element->entry.value.l = value->l;
+ break;
+ case HASH_VALUE_ULONG:
+ element->entry.value.ul = value->ul;
+ break;
+ case HASH_VALUE_FLOAT:
+ element->entry.value.f = value->f;
+ break;
+ case HASH_VALUE_DOUBLE:
+ element->entry.value.d = value->d;
+ break;
+ }
+
return HASH_SUCCESS;
}