summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ktrans/hash.c
diff options
context:
space:
mode:
authorJacob Moody <moody@posixcafe.org>2022-07-17 17:51:11 +0000
committerJacob Moody <moody@posixcafe.org>2022-07-17 17:51:11 +0000
commit0ec0154bc9da3c0b48f2f2cae08347129a8ec3d4 (patch)
treede865c2f18c3042f8f77bffc20e81d9dbfc67f9f /sys/src/cmd/ktrans/hash.c
parent23620b2e70e9de0ce31c6f4f21926a044c5deabc (diff)
ktrans: don't leak on conflicting jisho lines
Tidy up the hash interface to make cleanup a bit more explicit vs non cleanup.
Diffstat (limited to 'sys/src/cmd/ktrans/hash.c')
-rw-r--r--sys/src/cmd/ktrans/hash.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/src/cmd/ktrans/hash.c b/sys/src/cmd/ktrans/hash.c
index dcfa67cdd..b8b8c81f7 100644
--- a/sys/src/cmd/ktrans/hash.c
+++ b/sys/src/cmd/ktrans/hash.c
@@ -47,7 +47,7 @@ hmapalloc(int nbuckets, int size)
}
int
-hmapset(Hmap **store, char *key, void *new, void *old)
+hmaprepl(Hmap **store, char *key, void *new, void *old, int freekeys)
{
Hnode *n;
uchar *v;
@@ -66,6 +66,8 @@ hmapset(Hmap **store, char *key, void *new, void *old)
if(n->filled == 0)
goto replace;
if(strcmp(n->key, key) == 0){
+ if(freekeys)
+ free(n->key);
oldv = v + Tagsize;
goto replace;
}
@@ -105,6 +107,18 @@ replace:
return 0;
}
+int
+hmapupd(Hmap **h, char *key, void *new)
+{
+ char *prev;
+
+ prev = hmapkey(*h, key);
+ if(prev == nil)
+ prev = key;
+
+ return hmaprepl(h, prev, new, nil, 0);
+}
+
void*
_hmapget(Hmap *h, char *key)
{
@@ -184,7 +198,7 @@ hmaprehash(Hmap *old, int buckets)
for(i=0 ; i < old->len; i++){
v = old->nodes + i*old->nsz;
n = (Hnode*)v;
- hmapset(&new, n->key, v + Tagsize, nil);
+ hmaprepl(&new, n->key, v + Tagsize, nil, 0);
}
free(old);
return new;