From 4dcdb73c4b76a3413730649ddf4039ec964466b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 29 Dec 2016 01:48:13 +0100 Subject: map: implement map_prefix_delete --- map.c | 13 +++++++++++++ map.h | 2 ++ 2 files changed, 15 insertions(+) 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. */ -- cgit v1.2.3