commit: be6b2ff67c3ee1516257336a48639c5cb1bc2792
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 8 13:57:37 2026 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Feb 8 13:57:37 2026 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=be6b2ff6
libq/set: implement missing hash_keys() and hash_values() functions
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/set.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
libq/set.h | 12 ++++--------
2 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/libq/set.c b/libq/set.c
index 3832bcf5..801f3adf 100644
--- a/libq/set.c
+++ b/libq/set.c
@@ -525,6 +525,50 @@ void *hash_delete_chk
return set_delete((set_t *)q, key, removed);
}
+array *hash_keys
+(
+ hash_t *h
+)
+{
+ array *ret;
+ set_elem_t *w;
+ size_t i;
+
+ if (h == NULL)
+ return NULL;
+
+ ret = array_new();
+ for (i = 0; i < _SET_HASH_SIZE; i++)
+ {
+ for (w = h->buckets[i]; w != NULL; w = w->next)
+ array_append(ret, w->name);
+ }
+
+ return ret;
+}
+
+array *hash_values
+(
+ hash_t *h
+)
+{
+ array *ret;
+ set_elem_t *w;
+ size_t i;
+
+ if (h == NULL)
+ return NULL;
+
+ ret = array_new();
+ for (i = 0; i < _SET_HASH_SIZE; i++)
+ {
+ for (w = h->buckets[i]; w != NULL; w = w->next)
+ array_append(ret, w->val);
+ }
+
+ return ret;
+}
+
size_t hash_size
(
hash_t *h
diff --git a/libq/set.h b/libq/set.h
index a2f0a8ef..6e09481a 100644
--- a/libq/set.h
+++ b/libq/set.h
@@ -20,9 +20,7 @@ set_t *set_add_from_string(set_t *s, const char *buf);
#define set_contains(S,K) (set_get_key(S,K) == NULL ? false : true)
const char *set_get_key(set_t *s, const char *key);
void *set_delete(set_t *s, const char *key, bool *removed);
-#if 0
#define set_keys(S) hash_keys((hash_t *)S)
-#endif
size_t set_size(set_t *s);
void set_clear(set_t *s);
void set_free(set_t *s);
@@ -34,10 +32,8 @@ hash_t *hash_add(hash_t *h, const char *key, void *val, void
**prevval);
void *hash_get(hash_t *h, const char *key);
#define hash_delete(S,K) hash_delete_chk(S,K,NULL)
void *hash_delete_chk(hash_t *h, const char *key, bool *removed);
-#if 0
-#define hash_keys(S) TODO
-#define hash_values(S) TODO
-#endif
+array *hash_keys(hash_t *h);
+array *hash_values(hash_t *h);
size_t hash_size(hash_t *h);
void hash_clear(hash_t *h);
void hash_free(hash_t *h);
@@ -52,8 +48,8 @@ typedef struct set_ set;
#define get_set(K,S) hash_get((hash_t *)S,K)
#define del_set(K,S,R) set_delete(S,K,R)
size_t list_set(set_t *q, char ***l);
-size_t array_set(set_t *q, array *ret); /* hash_keys() */
-size_t values_set(set_t *q, array *ret); /* hash_values() */
+size_t array_set(set_t *q, array *ret); /* use hash_keys() */
+size_t values_set(set_t *q, array *ret); /* use hash_values() */
#define cnt_set(S) set_size(S)
#define clear_set(S) set_clear(S)
#define free_set(S) set_free(S)