diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/string-util.h | 22 | ||||
-rw-r--r-- | src/import/curl-util.c | 2 | ||||
-rw-r--r-- | src/test/test-string-util.c | 24 |
3 files changed, 47 insertions, 1 deletions
diff --git a/src/basic/string-util.h b/src/basic/string-util.h index c0cc4e78d7..fcd12f3a30 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -228,3 +228,25 @@ static inline void *memory_startswith(const void *p, size_t sz, const char *toke return (uint8_t*) p + n; } + +/* Like startswith_no_case(), but operates on arbitrary memory blocks. + * It works only for ASCII strings. + */ +static inline void *memory_startswith_no_case(const void *p, size_t sz, const char *token) { + size_t n, i; + + assert(token); + + n = strlen(token); + if (sz < n) + return NULL; + + assert(p); + + for (i = 0; i < n; i++) { + if (ascii_tolower(((char *)p)[i]) != ascii_tolower(token[i])) + return NULL; + } + + return (uint8_t*) p + n; +} diff --git a/src/import/curl-util.c b/src/import/curl-util.c index b85462176d..848bbd0669 100644 --- a/src/import/curl-util.c +++ b/src/import/curl-util.c @@ -363,7 +363,7 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char const char *p; char *s; - p = memory_startswith(contents, sz, field); + p = memory_startswith_no_case(contents, sz, field); if (!p) return 0; diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index 3e72ce2c0a..a9f261839c 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -496,6 +496,29 @@ static void test_memory_startswith(void) { assert_se(!memory_startswith("xxx", 4, "xxxx")); } +static void test_memory_startswith_no_case(void) { + assert_se(streq(memory_startswith_no_case("", 0, ""), "")); + assert_se(streq(memory_startswith_no_case("", 1, ""), "")); + assert_se(streq(memory_startswith_no_case("x", 2, ""), "x")); + assert_se(streq(memory_startswith_no_case("X", 2, ""), "X")); + assert_se(!memory_startswith_no_case("", 1, "X")); + assert_se(!memory_startswith_no_case("", 1, "xxxxXXXX")); + assert_se(streq(memory_startswith_no_case("xxx", 4, "X"), "xx")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "x"), "XX")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "X"), "XX")); + assert_se(streq(memory_startswith_no_case("xxx", 4, "XX"), "x")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "xx"), "X")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "XX"), "X")); + assert_se(streq(memory_startswith_no_case("xxx", 4, "XXX"), "")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "xxx"), "")); + assert_se(streq(memory_startswith_no_case("XXX", 4, "XXX"), "")); + + assert_se(memory_startswith_no_case((char[2]){'x', 'x'}, 2, "xx")); + assert_se(memory_startswith_no_case((char[2]){'x', 'X'}, 2, "xX")); + assert_se(memory_startswith_no_case((char[2]){'X', 'x'}, 2, "Xx")); + assert_se(memory_startswith_no_case((char[2]){'X', 'X'}, 2, "XX")); +} + int main(int argc, char *argv[]) { test_string_erase(); test_ascii_strcasecmp_n(); @@ -525,6 +548,7 @@ int main(int argc, char *argv[]) { test_first_word(); test_strlen_ptr(); test_memory_startswith(); + test_memory_startswith_no_case(); return 0; } |