summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-01-14 10:29:50 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-01-15 03:52:40 +0100
commit8b75798d12cc5a5577ae1ae2020c92ec66f683ee (patch)
treed41ee90071e52c239c5f9a093cbc3d43ff71ae9c /src
parentMerge pull request #14571 from poettering/assorted-fixlets (diff)
downloadsystemd-8b75798d12cc5a5577ae1ae2020c92ec66f683ee.tar.xz
systemd-8b75798d12cc5a5577ae1ae2020c92ec66f683ee.zip
strv: introduce strv_compare()
Diffstat (limited to 'src')
-rw-r--r--src/basic/strv.c23
-rw-r--r--src/basic/strv.h5
-rw-r--r--src/test/test-strv.c26
3 files changed, 35 insertions, 19 deletions
diff --git a/src/basic/strv.c b/src/basic/strv.c
index 99bcfde089..5588cd7c41 100644
--- a/src/basic/strv.c
+++ b/src/basic/strv.c
@@ -730,19 +730,26 @@ char **strv_sort(char **l) {
return l;
}
-bool strv_equal(char * const *a, char * const *b) {
+int strv_compare(char * const *a, char * const *b) {
+ int r;
- if (strv_isempty(a))
- return strv_isempty(b);
+ if (strv_isempty(a)) {
+ if (strv_isempty(b))
+ return 0;
+ else
+ return -1;
+ }
if (strv_isempty(b))
- return false;
+ return 1;
- for ( ; *a || *b; ++a, ++b)
- if (!streq_ptr(*a, *b))
- return false;
+ for ( ; *a || *b; ++a, ++b) {
+ r = strcmp_ptr(*a, *b);
+ if (r != 0)
+ return r;
+ }
- return true;
+ return 0;
}
void strv_print(char * const *l) {
diff --git a/src/basic/strv.h b/src/basic/strv.h
index f335aeee32..f150456682 100644
--- a/src/basic/strv.h
+++ b/src/basic/strv.h
@@ -51,7 +51,10 @@ char **strv_remove(char **l, const char *s);
char **strv_uniq(char **l);
bool strv_is_uniq(char * const *l);
-bool strv_equal(char * const *a, char * const *b);
+int strv_compare(char * const *a, char * const *b);
+static inline bool strv_equal(char * const *a, char * const *b) {
+ return strv_compare(a, b) == 0;
+}
#define strv_contains(l, s) (!!strv_find((l), (s)))
diff --git a/src/test/test-strv.c b/src/test/test-strv.c
index f31ea6f8c6..55ea79d1fc 100644
--- a/src/test/test-strv.c
+++ b/src/test/test-strv.c
@@ -711,27 +711,33 @@ static void test_strv_push(void) {
assert_se(streq_ptr(a[3], NULL));
}
-static void test_strv_equal(void) {
+static void test_strv_compare(void) {
_cleanup_strv_free_ char **a = NULL;
_cleanup_strv_free_ char **b = NULL;
_cleanup_strv_free_ char **c = NULL;
+ _cleanup_strv_free_ char **d = NULL;
log_info("/* %s */", __func__);
a = strv_new("one", "two", "three");
assert_se(a);
b = strv_new("one", "two", "three");
- assert_se(a);
+ assert_se(b);
c = strv_new("one", "two", "three", "four");
- assert_se(a);
+ assert_se(c);
+ d = strv_new(NULL);
+ assert_se(d);
- assert_se(strv_equal(a, a));
- assert_se(strv_equal(a, b));
- assert_se(strv_equal(NULL, NULL));
+ assert_se(strv_compare(a, a) == 0);
+ assert_se(strv_compare(a, b) == 0);
+ assert_se(strv_compare(d, d) == 0);
+ assert_se(strv_compare(d, NULL) == 0);
+ assert_se(strv_compare(NULL, NULL) == 0);
- assert_se(!strv_equal(a, c));
- assert_se(!strv_equal(b, c));
- assert_se(!strv_equal(b, NULL));
+ assert_se(strv_compare(a, c) < 0);
+ assert_se(strv_compare(b, c) < 0);
+ assert_se(strv_compare(b, d) == 1);
+ assert_se(strv_compare(b, NULL) == 1);
}
static void test_strv_is_uniq(void) {
@@ -988,7 +994,7 @@ int main(int argc, char *argv[]) {
test_strv_insert();
test_strv_push_prepend();
test_strv_push();
- test_strv_equal();
+ test_strv_compare();
test_strv_is_uniq();
test_strv_reverse();
test_strv_shell_escape();