]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: add new ascii_strcasecmp_n() call
authorLennart Poettering <lennart@poettering.net>
Wed, 13 Jan 2016 01:21:16 +0000 (02:21 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Jan 2016 19:21:56 +0000 (20:21 +0100)
src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index 849e457439ae76504483922e0bfca6e65cb1acfe..b7b8c97bc029eddb3a2936eb54ac09a1c7b41bd8 100644 (file)
@@ -348,6 +348,21 @@ char *ascii_strlower_n(char *t, size_t n) {
         return t;
 }
 
+int ascii_strcasecmp_n(const char *a, const char *b, size_t n) {
+
+        for (; n > 0; a++, b++, n--) {
+                int x, y;
+
+                x = (int) (uint8_t) ascii_tolower(*a);
+                y = (int) (uint8_t) ascii_tolower(*b);
+
+                if (x != y)
+                        return x - y;
+        }
+
+        return 0;
+}
+
 bool chars_intersect(const char *a, const char *b) {
         const char *p;
 
index 1ac6bcd6f8cbc07a699faa406e51a0e0c82a369a..6374e11119ff80c8e15e19f4b5f332f0a23ce7b0 100644 (file)
@@ -134,6 +134,8 @@ char ascii_tolower(char x);
 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);
+
 bool chars_intersect(const char *a, const char *b) _pure_;
 
 static inline bool _pure_ in_charset(const char *s, const char* charset) {
index 25444c794acbb636cfb72a509dd7b7288b84528f..4758108706325cac330e1969aed78e72afc67dbf 100644 (file)
@@ -55,7 +55,35 @@ static void test_string_erase(void) {
         assert_se(streq(string_erase(x), "xxxxxxxxx"));
 }
 
+static void test_ascii_strcasecmp_n(void) {
+
+        assert_se(ascii_strcasecmp_n("", "", 0) == 0);
+        assert_se(ascii_strcasecmp_n("", "", 1) == 0);
+        assert_se(ascii_strcasecmp_n("", "a", 1) < 0);
+        assert_se(ascii_strcasecmp_n("", "a", 2) < 0);
+        assert_se(ascii_strcasecmp_n("a", "", 1) > 0);
+        assert_se(ascii_strcasecmp_n("a", "", 2) > 0);
+        assert_se(ascii_strcasecmp_n("a", "a", 1) == 0);
+        assert_se(ascii_strcasecmp_n("a", "a", 2) == 0);
+        assert_se(ascii_strcasecmp_n("a", "b", 1) < 0);
+        assert_se(ascii_strcasecmp_n("a", "b", 2) < 0);
+        assert_se(ascii_strcasecmp_n("b", "a", 1) > 0);
+        assert_se(ascii_strcasecmp_n("b", "a", 2) > 0);
+        assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxYxxxx", 9) == 0);
+        assert_se(ascii_strcasecmp_n("xxxxxxxxx", "xxxxyxxxx", 9) < 0);
+        assert_se(ascii_strcasecmp_n("xxxxXxxxx", "xxxxyxxxx", 9) < 0);
+        assert_se(ascii_strcasecmp_n("xxxxxxxxx", "xxxxYxxxx", 9) < 0);
+        assert_se(ascii_strcasecmp_n("xxxxXxxxx", "xxxxYxxxx", 9) < 0);
+
+        assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxYxxxx", 9) == 0);
+        assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxxxxxx", 9) > 0);
+        assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxXxxxx", 9) > 0);
+        assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxxxxxx", 9) > 0);
+        assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxXxxxx", 9) > 0);
+}
+
 int main(int argc, char *argv[]) {
         test_string_erase();
+        test_ascii_strcasecmp_n();
         return 0;
 }