summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2022-11-26 14:10:43 +0000
committerDaniel Silverstone <dsilvers@digital-scurf.org>2022-11-26 14:10:43 +0000
commit010c5f5b3c3db4c07c19e706c9a70c886b614497 (patch)
treec29d7bd97106e6dc1c160bf21b73dfe1a69d28ec
parent429245749eeb99196d82d140af6522f962fc4601 (diff)
downloadlibparserutils-010c5f5b3c3db4c07c19e706c9a70c886b614497.tar.gz
libparserutils-010c5f5b3c3db4c07c19e706c9a70c886b614497.tar.bz2
(buffer): Add parserutils_buffer_appendv()
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
-rw-r--r--include/parserutils/utils/buffer.h2
-rw-r--r--src/utils/buffer.c33
2 files changed, 35 insertions, 0 deletions
diff --git a/include/parserutils/utils/buffer.h b/include/parserutils/utils/buffer.h
index 5f8f696..5b8b793 100644
--- a/include/parserutils/utils/buffer.h
+++ b/include/parserutils/utils/buffer.h
@@ -30,6 +30,8 @@ parserutils_error parserutils_buffer_destroy(parserutils_buffer *buffer);
parserutils_error parserutils_buffer_append(parserutils_buffer *buffer,
const uint8_t *data, size_t len);
+parserutils_error parserutils_buffer_appendv(parserutils_buffer *buffer,
+ size_t count, ...);
parserutils_error parserutils_buffer_insert(parserutils_buffer *buffer,
size_t offset, const uint8_t *data, size_t len);
parserutils_error parserutils_buffer_discard(parserutils_buffer *buffer,
diff --git a/src/utils/buffer.c b/src/utils/buffer.c
index 5e0f58c..b568948 100644
--- a/src/utils/buffer.c
+++ b/src/utils/buffer.c
@@ -6,6 +6,7 @@
*/
#include <string.h>
+#include <stdarg.h>
#include <parserutils/utils/buffer.h>
@@ -131,6 +132,38 @@ parserutils_error parserutils_buffer_append(parserutils_buffer *buffer,
}
/**
+ * Append multiple data blocks to a memory buffer.
+ *
+ * Each data block must be passed as a pair of const uint8_t* and size_t
+ *
+ * \param buffer The buffer to append to
+ * \param count The number of data blocks to append
+ * \param ... The pairs of pointer and size
+ * \return PARSERUTILS_OK on success, appropriate error otherwise.
+*/
+parserutils_error parserutils_buffer_appendv(parserutils_buffer *buffer,
+ size_t count, ...)
+{
+ va_list ap;
+ parserutils_error error;
+ const uint8_t *data;
+ size_t len;
+
+ va_start(ap, count);
+ while (count > 0) {
+ data = va_arg(ap, const uint8_t *);
+ len = va_arg(ap, size_t);
+ error = parserutils_buffer_append(buffer, data, len);
+ if (error != PARSERUTILS_OK)
+ break;
+ count--;
+ }
+ va_end(ap);
+
+ return error;
+}
+
+/**
* Insert data into a memory buffer
*
* \param buffer The buffer to insert into