diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-01-14 10:29:50 +0100 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-01-15 03:52:40 +0100 |
commit | 8b75798d12cc5a5577ae1ae2020c92ec66f683ee (patch) | |
tree | d41ee90071e52c239c5f9a093cbc3d43ff71ae9c /src | |
parent | Merge pull request #14571 from poettering/assorted-fixlets (diff) | |
download | systemd-8b75798d12cc5a5577ae1ae2020c92ec66f683ee.tar.xz systemd-8b75798d12cc5a5577ae1ae2020c92ec66f683ee.zip |
strv: introduce strv_compare()
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/strv.c | 23 | ||||
-rw-r--r-- | src/basic/strv.h | 5 | ||||
-rw-r--r-- | src/test/test-strv.c | 26 |
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(); |