aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-hash.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2020-06-02 21:31:45 +0100
committerNick Alcock <nick.alcock@oracle.com>2020-07-22 17:57:41 +0100
commit809f6eb3321edb91fcc96b1f8353dbfe2f762fa7 (patch)
tree0dfd5c1aac3b5580c483d03984ce49bbb01282f2 /libctf/ctf-hash.c
parent469e75b621f6ee0b235d5dbe7566483d356d178d (diff)
downloadgdb-809f6eb3321edb91fcc96b1f8353dbfe2f762fa7.zip
gdb-809f6eb3321edb91fcc96b1f8353dbfe2f762fa7.tar.gz
gdb-809f6eb3321edb91fcc96b1f8353dbfe2f762fa7.tar.bz2
libctf: add new dynhash functions
Future commits will use these. ctf_dynhash_elements: count elements in a dynhash ctf_dynhash_lookup_kv: look up and return pointers to the original key and value in a dynhash (the only way of getting a reference to the original key) ctf_dynhash_iter_find: iterate until an item is found, then return its key ctf_dynhash_cinsert: insert a const key / value into a dynhash (a thim wrapper in a new header dedicated to inline functions). As with the rest of ctf_dynhash, this is not public API. No impact on existing callers is expected. libctf/ * ctf-inlines.h: New file. * ctf-impl.h: Include it. (ctf_hash_iter_find_f): New typedef. (ctf_dynhash_elements): New. (ctf_dynhash_lookup_kv): New. (ctf_dynhash_iter_find): New. * ctf-hash.c (ctf_dynhash_lookup_kv): New. (ctf_traverse_find_cb_arg_t): New. (ctf_hashtab_traverse_find): New. (ctf_dynhash_iter_find): New. (ctf_dynhash_elements): New.
Diffstat (limited to 'libctf/ctf-hash.c')
-rw-r--r--libctf/ctf-hash.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/libctf/ctf-hash.c b/libctf/ctf-hash.c
index 71c1f8e..4696fcb 100644
--- a/libctf/ctf-hash.c
+++ b/libctf/ctf-hash.c
@@ -218,6 +218,12 @@ ctf_dynhash_empty (ctf_dynhash_t *hp)
htab_empty (hp->htab);
}
+size_t
+ctf_dynhash_elements (ctf_dynhash_t *hp)
+{
+ return htab_elements (hp->htab);
+}
+
void *
ctf_dynhash_lookup (ctf_dynhash_t *hp, const void *key)
{
@@ -231,6 +237,26 @@ ctf_dynhash_lookup (ctf_dynhash_t *hp, const void *key)
return NULL;
}
+/* TRUE/FALSE return. */
+int
+ctf_dynhash_lookup_kv (ctf_dynhash_t *hp, const void *key,
+ const void **orig_key, void **value)
+{
+ ctf_helem_t **slot;
+
+ slot = ctf_hashtab_lookup (hp->htab, key, NO_INSERT);
+
+ if (slot)
+ {
+ if (orig_key)
+ *orig_key = (*slot)->key;
+ if (value)
+ *value = (*slot)->value;
+ return 1;
+ }
+ return 0;
+}
+
typedef struct ctf_traverse_cb_arg
{
ctf_hash_iter_f fun;
@@ -254,6 +280,35 @@ ctf_dynhash_iter (ctf_dynhash_t *hp, ctf_hash_iter_f fun, void *arg_)
htab_traverse (hp->htab, ctf_hashtab_traverse, &arg);
}
+typedef struct ctf_traverse_find_cb_arg
+{
+ ctf_hash_iter_find_f fun;
+ void *arg;
+ void *found_key;
+} ctf_traverse_find_cb_arg_t;
+
+static int
+ctf_hashtab_traverse_find (void **slot, void *arg_)
+{
+ ctf_helem_t *helem = *((ctf_helem_t **) slot);
+ ctf_traverse_find_cb_arg_t *arg = (ctf_traverse_find_cb_arg_t *) arg_;
+
+ if (arg->fun (helem->key, helem->value, arg->arg))
+ {
+ arg->found_key = helem->key;
+ return 0;
+ }
+ return 1;
+}
+
+void *
+ctf_dynhash_iter_find (ctf_dynhash_t *hp, ctf_hash_iter_find_f fun, void *arg_)
+{
+ ctf_traverse_find_cb_arg_t arg = { fun, arg_, NULL };
+ htab_traverse (hp->htab, ctf_hashtab_traverse_find, &arg);
+ return arg.found_key;
+}
+
typedef struct ctf_traverse_remove_cb_arg
{
struct htab *htab;