strmap: allow const arguments to strset_iterate().
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 1 Dec 2011 06:11:51 +0000 (16:41 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 1 Dec 2011 06:11:51 +0000 (16:41 +1030)
ccan/strmap/strmap.c
ccan/strmap/strmap.h
ccan/strmap/test/run-iterate-const.c [new file with mode: 0644]

index 872ca544c6aab1fa3b9d813534b74486cf77ec70..7f21d1932e089c1961eb5da51cfe2cfb206eb738 100644 (file)
@@ -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)
index d6104942f4cea6c7cb218bfd386ced9f96ec3b1a..cf77e94959d9cfe1960601be395900f3f9f71353 100644 (file)
@@ -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 (file)
index 0000000..07c814a
--- /dev/null
@@ -0,0 +1,32 @@
+#include <ccan/strmap/strmap.h>
+#include <ccan/strmap/strmap.c>
+#include <ccan/tap/tap.h>
+
+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();
+}