]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: add ascii_strcasecmp_nn() call
authorLennart Poettering <lennart@poettering.net>
Wed, 13 Jan 2016 18:45:05 +0000 (19:45 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Jan 2016 19:22:32 +0000 (20:22 +0100)
In contrast to ascii_strcasecmp_nn() it takes two character buffers with their individual length. It will then compare
the buffers up the smaller size of the two buffers, and finally the length themselves.

src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index b7b8c97bc029eddb3a2936eb54ac09a1c7b41bd8..1f95a9abba2b033feba4dce67b2e7fb53dc99335 100644 (file)
@@ -363,6 +363,21 @@ int ascii_strcasecmp_n(const char *a, const char *b, size_t n) {
         return 0;
 }
 
+int ascii_strcasecmp_nn(const char *a, size_t n, const char *b, size_t m) {
+        int r;
+
+        r = ascii_strcasecmp_n(a, b, MIN(n, m));
+        if (r != 0)
+                return r;
+
+        if (n < m)
+                return -1;
+        else if (n > m)
+                return 1;
+        else
+                return 0;
+}
+
 bool chars_intersect(const char *a, const char *b) {
         const char *p;
 
index 6374e11119ff80c8e15e19f4b5f332f0a23ce7b0..8ea18f45aa6d74bed0be1d8a6547bc3d0b8e7bf5 100644 (file)
@@ -135,6 +135,7 @@ char *ascii_strlower(char *s);
 char *ascii_strlower_n(char *s, size_t n);
 
 int ascii_strcasecmp_n(const char *a, const char *b, size_t n);
+int ascii_strcasecmp_nn(const char *a, size_t n, const char *b, size_t m);
 
 bool chars_intersect(const char *a, const char *b) _pure_;
 
index 4758108706325cac330e1969aed78e72afc67dbf..12889ce8730c75bc8da6e4a7604f5245e336434d 100644 (file)
@@ -82,8 +82,26 @@ static void test_ascii_strcasecmp_n(void) {
         assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxXxxxx", 9) > 0);
 }
 
+static void test_ascii_strcasecmp_nn(void) {
+        assert_se(ascii_strcasecmp_nn("", 0, "", 0) == 0);
+        assert_se(ascii_strcasecmp_nn("", 0, "", 1) < 0);
+        assert_se(ascii_strcasecmp_nn("", 1, "", 0) > 0);
+        assert_se(ascii_strcasecmp_nn("", 1, "", 1) == 0);
+
+        assert_se(ascii_strcasecmp_nn("aaaa", 4, "aaAa", 4) == 0);
+        assert_se(ascii_strcasecmp_nn("aaa", 3, "aaAa", 4) < 0);
+        assert_se(ascii_strcasecmp_nn("aaa", 4, "aaAa", 4) < 0);
+        assert_se(ascii_strcasecmp_nn("aaaa", 4, "aaA", 3) > 0);
+        assert_se(ascii_strcasecmp_nn("aaaa", 4, "AAA", 4) > 0);
+
+        assert_se(ascii_strcasecmp_nn("aaaa", 4, "bbbb", 4) < 0);
+        assert_se(ascii_strcasecmp_nn("aaAA", 4, "BBbb", 4) < 0);
+        assert_se(ascii_strcasecmp_nn("BBbb", 4, "aaaa", 4) > 0);
+}
+
 int main(int argc, char *argv[]) {
         test_string_erase();
         test_ascii_strcasecmp_n();
+        test_ascii_strcasecmp_nn();
         return 0;
 }