X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fhashmap.c;fp=src%2Fhashmap.c;h=a59b880dffb25bb587f56714cbc03fb75cd2a7ee;hp=5a993b6e4761a36ba410c1f9b1cbba7a5de95a58;hb=8fe914ec81d9f57bcc083036f528b00119ed2e3b;hpb=5632e3743db350a67478acc107d76cdf648a1f99 diff --git a/src/hashmap.c b/src/hashmap.c index 5a993b6e4..a59b880df 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -296,6 +296,33 @@ int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, return 0; } +int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value) { + struct hashmap_entry *e, *k; + unsigned old_hash, new_hash; + + if (!h) + return -ENOENT; + + old_hash = h->hash_func(old_key) % NBUCKETS; + if (!(e = hash_scan(h, old_hash, old_key))) + return -ENOENT; + + new_hash = h->hash_func(new_key) % NBUCKETS; + + if ((k = hash_scan(h, new_hash, new_key))) + if (e != k) + remove_entry(h, k); + + unlink_entry(h, e, old_hash); + + e->key = new_key; + e->value = value; + + link_entry(h, e, new_hash); + + return 0; +} + void* hashmap_remove_value(Hashmap *h, const void *key, void *value) { struct hashmap_entry *e; unsigned hash;