aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-12-29 01:48:13 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-12-29 01:48:13 +0100
commit4dcdb73c4b76a3413730649ddf4039ec964466b9 (patch)
tree8b96f5e5f81a88177ff6b8b9439023a21fe80a4f
parent8eeb6f5836ee772e3cdc8967d20444d84261373e (diff)
downloadvis-4dcdb73c4b76a3413730649ddf4039ec964466b9.tar.gz
vis-4dcdb73c4b76a3413730649ddf4039ec964466b9.tar.xz
map: implement map_prefix_delete
-rw-r--r--map.c13
-rw-r--r--map.h2
2 files changed, 15 insertions, 0 deletions
diff --git a/map.c b/map.c
index f6e5c64..7994f34 100644
--- a/map.c
+++ b/map.c
@@ -288,6 +288,19 @@ const Map *map_prefix(const Map *map, const char *prefix)
return top;
}
+bool map_prefix_delete(Map *map, const char *prefix)
+{
+ bool ret = false;
+ do {
+ const char *conflict = NULL;
+ const Map *conflicts = map_prefix(map, prefix);
+ if (!map_first(conflicts, &conflict))
+ break;
+ ret = map_delete(map, conflict);
+ } while (ret);
+ return ret;
+}
+
static void clear(Map n)
{
if (!n.v) {
diff --git a/map.h b/map.h
index ca7bd44..3035ff4 100644
--- a/map.h
+++ b/map.h
@@ -31,6 +31,8 @@ void map_iterate(const Map*, bool (*handle)(const char *key, void *value, void *
/* Return a submap matching a prefix. This returns a pointer into the
* original map, so don't alter the map while using the return value. */
const Map *map_prefix(const Map*, const char *prefix);
+/* Delete all entries of the prefix map */
+bool map_prefix_delete(Map*, const char *prefix);
/* Test whether the map is empty i.e. contains no elements */
bool map_empty(const Map*);
/* Remove every member from the map. The map will be empty after this. */