]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
strbuf: Add strbuf_pushmem()
authorLucas De Marchi <lucas.de.marchi@gmail.com>
Tue, 12 Nov 2024 19:45:33 +0000 (13:45 -0600)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Sun, 17 Nov 2024 21:35:13 +0000 (15:35 -0600)
Wrapper for memcpy(). It's similar to strbuf_pushchars(), but push any
char, including the NUL byte, relying on the size passed as argument.

Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://github.com/kmod-project/kmod/pull/239
shared/strbuf.c
shared/strbuf.h
testsuite/test-strbuf.c

index 69d20db6ec925d3432da2ba806e3426257f77d58..6a4c8d93c0558e3920c49106251b997bb810c830 100644 (file)
@@ -95,22 +95,18 @@ bool strbuf_pushchar(struct strbuf *buf, char ch)
        return true;
 }
 
-size_t strbuf_pushchars(struct strbuf *buf, const char *str)
+size_t strbuf_pushmem(struct strbuf *buf, const char *src, size_t sz)
 {
-       size_t len;
-
-       assert(str != NULL);
+       assert(src != NULL);
        assert(buf != NULL);
 
-       len = strlen(str);
-
-       if (!strbuf_reserve_extra(buf, len))
+       if (!strbuf_reserve_extra(buf, sz))
                return 0;
 
-       memcpy(buf->bytes + buf->used, str, len);
-       buf->used += len;
+       memcpy(buf->bytes + buf->used, src, sz);
+       buf->used += sz;
 
-       return len;
+       return sz;
 }
 
 void strbuf_popchar(struct strbuf *buf)
index d916d0af42e5055903d36f519c192d9c7c4f0318..538f199e9534c9edeccafc4bcd2c323d2f6a3304 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <stdbool.h>
 #include <stddef.h>
+#include <string.h>
 #include <alloca.h>
 
 #include "macro.h"
@@ -67,8 +68,13 @@ const char *strbuf_str(struct strbuf *buf);
  * don't cause re-allocations
  */
 bool strbuf_reserve_extra(struct strbuf *buf, size_t n);
+
 bool strbuf_pushchar(struct strbuf *buf, char ch);
-size_t strbuf_pushchars(struct strbuf *buf, const char *str);
+size_t strbuf_pushmem(struct strbuf *buf, const char *src, size_t sz);
+static inline size_t strbuf_pushchars(struct strbuf *buf, const char *str)
+{
+       return strbuf_pushmem(buf, str, strlen(str));
+}
 
 /*
  * Remove the last char from buf.
index 45c9eec7ebdd23494b4bcc62892870e691003081..a9da0ec4f9065ebbc15af18dccfe364d50ea944d 100644 (file)
@@ -185,4 +185,22 @@ static int test_strbuf_reserve_extra(const struct test *t)
 }
 DEFINE_TEST(test_strbuf_reserve_extra, .description = "test strbuf_reserve_extra");
 
+static int test_strbuf_pushmem(const struct test *t)
+{
+       _cleanup_strbuf_ struct strbuf buf;
+       size_t size;
+
+       strbuf_init(&buf);
+       strbuf_reserve_extra(&buf, strlen(TEXT) + 1);
+       size = buf.size;
+       strbuf_pushmem(&buf, TEXT, strlen(TEXT) + 1);
+
+       assert_return(size == buf.size, EXIT_FAILURE);
+       assert_return(streq(TEXT, strbuf_str(&buf)), EXIT_FAILURE);
+       assert_return(size == buf.size, EXIT_FAILURE);
+
+       return 0;
+}
+DEFINE_TEST(test_strbuf_pushmem, .description = "test strbuf_reserve");
+
 TESTSUITE_MAIN();