diff options
author | Jacob Moody <moody@posixcafe.org> | 2022-07-17 17:51:11 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2022-07-17 17:51:11 +0000 |
commit | 0ec0154bc9da3c0b48f2f2cae08347129a8ec3d4 (patch) | |
tree | de865c2f18c3042f8f77bffc20e81d9dbfc67f9f /sys/src/cmd/ktrans/hash.c | |
parent | 23620b2e70e9de0ce31c6f4f21926a044c5deabc (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.c | 18 |
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; |