summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2017-09-25 17:15:59 +0200
committerLennart Poettering <lennart@poettering.net>2017-09-26 16:17:22 +0200
commitca543871b743423c5de28927895fe6021e6665b1 (patch)
tree267e3f2947195f328a34f8bb26f6d24b63235285
parent0cde65e263643cf00a6b29c3178c9a73724da812 (diff)
downloadsystemd-ca543871b743423c5de28927895fe6021e6665b1.tar.gz
set: add new helper set_make() which is like set_new() + multiple set_put() in vararg
-rw-r--r--src/basic/meson.build1
-rw-r--r--src/basic/set.c61
-rw-r--r--src/basic/set.h2
-rw-r--r--src/test/test-set.c45
4 files changed, 109 insertions, 0 deletions
diff --git a/src/basic/meson.build b/src/basic/meson.build
index 994336fde2..1ddefb7fbb 100644
--- a/src/basic/meson.build
+++ b/src/basic/meson.build
@@ -145,6 +145,7 @@ basic_sources_plain = files('''
securebits.h
selinux-util.c
selinux-util.h
+ set.c
set.h
sigbus.c
sigbus.h
diff --git a/src/basic/set.c b/src/basic/set.c
new file mode 100644
index 0000000000..fd398b8212
--- /dev/null
+++ b/src/basic/set.c
@@ -0,0 +1,61 @@
+/***
+ This file is part of systemd.
+
+ Copyright 2017 Lennart Poettering
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "set.h"
+
+int set_make(Set **ret, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS, void *add, ...) {
+ _cleanup_set_free_ Set *s = NULL;
+ int r;
+
+ assert(ret);
+
+ s = set_new(hash_ops HASHMAP_DEBUG_PASS_ARGS);
+ if (!s)
+ return -ENOMEM;
+
+ if (add) {
+ va_list ap;
+
+ r = set_put(s, add);
+ if (r < 0)
+ return r;
+
+ va_start(ap, add);
+
+ for(;;) {
+ void *arg = va_arg(ap, void*);
+
+ if (!arg)
+ break;
+
+ r = set_put(s, arg);
+ if (r < 0) {
+ va_end(ap);
+ return r;
+ }
+ }
+
+ va_end(ap);
+ }
+
+ *ret = s;
+ s = NULL;
+
+ return 0;
+}
diff --git a/src/basic/set.h b/src/basic/set.h
index a5f8beb0c4..12d0fda1ca 100644
--- a/src/basic/set.h
+++ b/src/basic/set.h
@@ -136,3 +136,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free);
#define _cleanup_set_free_ _cleanup_(set_freep)
#define _cleanup_set_free_free_ _cleanup_(set_free_freep)
+
+int set_make(Set **ret, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS, void *add, ...);
diff --git a/src/test/test-set.c b/src/test/test-set.c
index 0ee5ddcc9f..3fab350cf6 100644
--- a/src/test/test-set.c
+++ b/src/test/test-set.c
@@ -55,9 +55,54 @@ static void test_set_put(void) {
assert_se(set_put(m, (void*) "22") == 0);
}
+static void test_set_make(void) {
+ _cleanup_set_free_ Set *s = NULL;
+
+ assert_se(set_make(&s, NULL, UINT_TO_PTR(4), UINT_TO_PTR(6), UINT_TO_PTR(8), NULL) == 0);
+ assert_se(set_size(s) == 3);
+ assert_se(!set_contains(s, UINT_TO_PTR(0)));
+ assert_se(!set_contains(s, UINT_TO_PTR(1)));
+ assert_se(!set_contains(s, UINT_TO_PTR(2)));
+ assert_se(!set_contains(s, UINT_TO_PTR(3)));
+ assert_se(set_contains(s, UINT_TO_PTR(4)));
+ assert_se(!set_contains(s, UINT_TO_PTR(5)));
+ assert_se(set_contains(s, UINT_TO_PTR(6)));
+ assert_se(!set_contains(s, UINT_TO_PTR(7)));
+ assert_se(set_contains(s, UINT_TO_PTR(8)));
+ assert_se(!set_contains(s, UINT_TO_PTR(9)));
+ s = set_free(s);
+
+ assert_se(set_make(&s, NULL, NULL) == 0);
+ assert_se(set_size(s) == 0);
+ assert_se(!set_contains(s, UINT_TO_PTR(0)));
+ assert_se(!set_contains(s, UINT_TO_PTR(4)));
+ assert_se(!set_contains(s, UINT_TO_PTR(6)));
+ assert_se(!set_contains(s, UINT_TO_PTR(8)));
+ s = set_free(s);
+
+ assert_se(set_make(&s, NULL, UINT_TO_PTR(3), NULL) == 0);
+ assert_se(set_size(s) == 1);
+ assert_se(!set_contains(s, UINT_TO_PTR(0)));
+ assert_se(!set_contains(s, UINT_TO_PTR(1)));
+ assert_se(!set_contains(s, UINT_TO_PTR(2)));
+ assert_se(set_contains(s, UINT_TO_PTR(3)));
+ assert_se(!set_contains(s, UINT_TO_PTR(4)));
+
+ assert_se(set_make(&s, NULL, UINT_TO_PTR(2), UINT_TO_PTR(5), NULL) == 0);
+ assert_se(set_size(s) == 2);
+ assert_se(!set_contains(s, UINT_TO_PTR(0)));
+ assert_se(!set_contains(s, UINT_TO_PTR(1)));
+ assert_se(set_contains(s, UINT_TO_PTR(2)));
+ assert_se(!set_contains(s, UINT_TO_PTR(3)));
+ assert_se(!set_contains(s, UINT_TO_PTR(4)));
+ assert_se(set_contains(s, UINT_TO_PTR(5)));
+ assert_se(!set_contains(s, UINT_TO_PTR(6)));
+}
+
int main(int argc, const char *argv[]) {
test_set_steal_first();
test_set_put();
+ test_set_make();
return 0;
}