aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavier.delcampo@orain.io>2020-10-06 09:20:57 +0200
committerXavier Del Campo Romero <xavier.delcampo@orain.io>2020-10-06 09:20:57 +0200
commit8bd1123857aef03c9aefb0658e3a8a562984a52e (patch)
treebb7055daa7f1123d45c30890c10bb4bfc130ab81
parente0eaf50fdc4a334a59cfa6447d68e7ba9aed6f45 (diff)
downloaddynstr-8bd1123857aef03c9aefb0658e3a8a562984a52e.tar.gz
Add dynstr_vappend
-rw-r--r--dynstr.c41
-rw-r--r--include/dynstr.h14
2 files changed, 35 insertions, 20 deletions
diff --git a/dynstr.c b/dynstr.c
index 2455031..e9ef185 100644
--- a/dynstr.c
+++ b/dynstr.c
@@ -30,33 +30,34 @@ void dynstr_init(struct dynstr *const d)
memset(d, 0, sizeof *d);
}
-enum dynstr_err dynstr_append(struct dynstr *const d, const char *const format, ...)
+enum dynstr_err dynstr_vappend(struct dynstr *const d, const char *const format, va_list ap)
{
- va_list ap;
+ enum dynstr_err err = DYNSTR_OK;
+ const size_t src_len = vsnprintf(NULL, 0, format, ap);
+ const size_t new_len = d->len + src_len + 1;
- va_start(ap, format);
+ d->str = realloc(d->str, new_len * sizeof *d->str);
+ if (d->str)
{
- const size_t src_len = vsnprintf(NULL, 0, format, ap);
- const size_t new_len = d->len + src_len + 1;
- va_end(ap);
+ vsprintf(d->str + d->len, format, ap);
+ d->len += src_len;
+ }
+ else
+ {
+ err = DYNSTR_ERR_ALLOC;
+ }
- d->str = realloc(d->str, new_len * sizeof *d->str);
+ va_end(ap);
+ return err;
+}
- if (d->str)
- {
- va_start(ap, format);
- vsprintf(d->str + d->len, format, ap);
- va_end(ap);
- d->len += src_len;
- }
- else
- {
- return DYNSTR_ERR_ALLOC;
- }
- }
+enum dynstr_err dynstr_append(struct dynstr *const d, const char *const format, ...)
+{
+ va_list ap;
- return DYNSTR_OK;
+ va_start(ap, format);
+ return dynstr_vappend(d, format, ap);
}
enum dynstr_err dynstr_prepend(struct dynstr *const d, const char *const format, ...)
diff --git a/include/dynstr.h b/include/dynstr.h
index 925423a..2c36865 100644
--- a/include/dynstr.h
+++ b/include/dynstr.h
@@ -21,6 +21,7 @@
#error C99 support is mandatory for dynstr
#endif /* __STDC_VERSION < 199901L */
+#include <stdarg.h>
#include <stddef.h>
#include <stdbool.h>
@@ -110,6 +111,19 @@ enum dynstr_err dynstr_append(struct dynstr *d, const char *format, ...);
/**
* This function takes a string literal in printf format and a variable
+ * argument list, calculates its size and concatenates it into the
+ * dynamic string.
+ * @param d Dynamic string where new string will be appended.
+ * @param format String literal in printf format.
+ * @param ap Variable argument list.
+ * @return Returns one of the following error codes:
+ * # DYNSTR_OK if successful.
+ * # DYNSTR_ERR_ALLOC if no more memory is available.
+ */
+enum dynstr_err dynstr_vappend(struct dynstr *d, const char *format, va_list ap);
+
+/**
+ * This function takes a string literal in printf format and a variable
* number of arguments, calculates its size and prepends it into the
* beginning of the dynamic string.
* @param d Dynamic string where new string will be prepended.