]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: add new memory_startswith() helper
authorLennart Poettering <lennart@poettering.net>
Wed, 30 May 2018 11:07:37 +0000 (13:07 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 May 2018 11:07:40 +0000 (13:07 +0200)
We have code like this at various placer, let's make things shorter and
more readable with a helper for it.

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

index 5a10eeabfe90371f1fbd4a2ed13b32dfcb900dd3..aa007242663240f0f79d08e4455788bdbac8464d 100644 (file)
@@ -209,3 +209,21 @@ static inline size_t strlen_ptr(const char *s) {
 
         return strlen(s);
 }
+
+/* Like startswith(), but operates on arbitrary memory blocks */
+static inline void *memory_startswith(const void *p, size_t sz, const char *token) {
+        size_t n;
+
+        assert(token);
+
+        n = strlen(token);
+        if (sz < n)
+                return NULL;
+
+        assert(p);
+
+        if (memcmp(p, token, n) != 0)
+                return NULL;
+
+        return (uint8_t*) p + n;
+}
index 965e2c5028e70d010cd8334e7e283fe40393ce94..eac12ac7afde48911ab1bbcf64957facc24a47e4 100644 (file)
@@ -406,6 +406,18 @@ static void test_strlen_ptr(void) {
         assert_se(strlen_ptr(NULL) == 0);
 }
 
+static void test_memory_startswith(void) {
+        assert_se(streq(memory_startswith("", 0, ""), ""));
+        assert_se(streq(memory_startswith("", 1, ""), ""));
+        assert_se(streq(memory_startswith("x", 2, ""), "x"));
+        assert_se(!memory_startswith("", 1, "x"));
+        assert_se(!memory_startswith("", 1, "xxxxxxxx"));
+        assert_se(streq(memory_startswith("xxx", 4, "x"), "xx"));
+        assert_se(streq(memory_startswith("xxx", 4, "xx"), "x"));
+        assert_se(streq(memory_startswith("xxx", 4, "xxx"), ""));
+        assert_se(!memory_startswith("xxx", 4, "xxxx"));
+}
+
 int main(int argc, char *argv[]) {
         test_string_erase();
         test_ascii_strcasecmp_n();
@@ -433,6 +445,7 @@ int main(int argc, char *argv[]) {
         test_split_pair();
         test_first_word();
         test_strlen_ptr();
+        test_memory_startswith();
 
         return 0;
 }