From 140cd1699215bdb2a849459644823b88ab7d42cf Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 1 Dec 2011 16:41:51 +1030 Subject: [PATCH] strmap: allow const arguments to strset_iterate(). --- ccan/strmap/strmap.c | 8 ++++--- ccan/strmap/strmap.h | 4 ++-- ccan/strmap/test/run-iterate-const.c | 32 ++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 ccan/strmap/test/run-iterate-const.c diff --git a/ccan/strmap/strmap.c b/ccan/strmap/strmap.c index 872ca544..7f21d193 100644 --- a/ccan/strmap/strmap.c +++ b/ccan/strmap/strmap.c @@ -174,17 +174,19 @@ char *strmap_del_(struct strmap *map, const char *member, void **valuep) } static bool iterate(struct strmap n, - bool (*handle)(const char *, void *, void *), void *data) + bool (*handle)(const char *, void *, void *), + const void *data) { if (n.v) - return handle(n.u.s, n.v, data); + return handle(n.u.s, n.v, (void *)data); return iterate(n.u.n->child[0], handle, data) || iterate(n.u.n->child[1], handle, data); } void strmap_iterate_(const struct strmap *map, - bool (*handle)(const char *, void *, void *), void *data) + bool (*handle)(const char *, void *, void *), + const void *data) { /* Empty map? */ if (!map->u.n) diff --git a/ccan/strmap/strmap.h b/ccan/strmap/strmap.h index d6104942..cf77e949 100644 --- a/ccan/strmap/strmap.h +++ b/ccan/strmap/strmap.h @@ -189,8 +189,8 @@ void strmap_clear_(struct strmap *map); __typeof__(arg)), (handle)), \ (arg)) void strmap_iterate_(const struct strmap *map, - bool (*handle)(const char *, void *, void *), void *data); - + bool (*handle)(const char *, void *, void *), + const void *data); /** * strmap_prefix - return a submap matching a prefix diff --git a/ccan/strmap/test/run-iterate-const.c b/ccan/strmap/test/run-iterate-const.c new file mode 100644 index 00000000..07c814a3 --- /dev/null +++ b/ccan/strmap/test/run-iterate-const.c @@ -0,0 +1,32 @@ +#include +#include +#include + +static bool found = false; + +/* Make sure const args work. */ +static bool find_string(const char *str, char *member, const char *cmp) +{ + if (strcmp(member, cmp) == 0) + found = true; + return false; +} + +int main(void) +{ + struct strmap_charp { + STRMAP_MEMBERS(char *); + } map; + + plan_tests(3); + + strmap_init(&map); + ok1(strmap_add(&map, "hello", "hello")); + ok1(strmap_add(&map, "world", "world")); + strmap_iterate(&map, find_string, (const char *)"hello"); + ok1(found); + strmap_clear(&map); + + /* This exits depending on whether all tests passed */ + return exit_status(); +} -- 2.39.2