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_vappend(struct dynstr *const d, const char *const format, 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; + + d->str = realloc(d->str, new_len * sizeof *d->str); + + if (d->str) + { + vsprintf(d->str + d->len, format, ap); + d->len += src_len; + } + else + { + err = DYNSTR_ERR_ALLOC; + } + + va_end(ap); + return err; +} + enum dynstr_err dynstr_append(struct dynstr *const d, const char *const format, ...) { va_list ap; va_start(ap, format); - - { - const size_t src_len = vsnprintf(NULL, 0, format, ap); - const size_t new_len = d->len + src_len + 1; - va_end(ap); - - d->str = realloc(d->str, new_len * sizeof *d->str); - - 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; - } - } - - return DYNSTR_OK; + 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 #include #include @@ -108,6 +109,19 @@ void dynstr_init(struct dynstr *d); */ 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