From 4dbce717873000cff7b56f89266d1d2fe53f9284 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 6 Dec 2020 20:10:48 +0900 Subject: set: introduce set_strjoin() --- src/basic/hashmap.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/basic/hashmap.c') diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index dd1b18c878..e38e580530 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -1976,3 +1976,38 @@ IteratedCache* iterated_cache_free(IteratedCache *cache) { return mfree(cache); } + +int set_strjoin(Set *s, const char *separator, char **ret) { + size_t separator_len, allocated = 0, len = 0; + _cleanup_free_ char *str = NULL; + const char *value; + bool first = true; + + assert(ret); + + separator_len = strlen_ptr(separator); + + SET_FOREACH(value, s) { + size_t l = strlen_ptr(value); + + if (l == 0) + continue; + + if (!GREEDY_REALLOC(str, allocated, len + l + (first ? 0 : separator_len) + 1)) + return -ENOMEM; + + if (separator_len > 0 && !first) { + memcpy(str + len, separator, separator_len); + len += separator_len; + } + + memcpy(str + len, value, l); + len += l; + first = false; + } + if (str) + str[len] = '\0'; + + *ret = TAKE_PTR(str); + return 0; +} -- cgit v1.2.1