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
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)
#include <stdbool.h>
#include <stddef.h>
+#include <string.h>
#include <alloca.h>
#include "macro.h"
* 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.
}
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();