From 68c0b9fb8c691a6d4b96aa2dcfe6627add6dc40b Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Tue, 12 Nov 2024 13:45:33 -0600 Subject: [PATCH] strbuf: Add strbuf_pushmem() 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 Reviewed-by: Emil Velikov Link: https://github.com/kmod-project/kmod/pull/239 --- shared/strbuf.c | 16 ++++++---------- shared/strbuf.h | 8 +++++++- testsuite/test-strbuf.c | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/shared/strbuf.c b/shared/strbuf.c index 69d20db6..6a4c8d93 100644 --- a/shared/strbuf.c +++ b/shared/strbuf.c @@ -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) diff --git a/shared/strbuf.h b/shared/strbuf.h index d916d0af..538f199e 100644 --- a/shared/strbuf.h +++ b/shared/strbuf.h @@ -2,6 +2,7 @@ #include #include +#include #include #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. diff --git a/testsuite/test-strbuf.c b/testsuite/test-strbuf.c index 45c9eec7..a9da0ec4 100644 --- a/testsuite/test-strbuf.c +++ b/testsuite/test-strbuf.c @@ -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(); -- 2.47.2