Add dynstr_vappend
This commit is contained in:
parent
e0eaf50fdc
commit
8bd1123857
45
dynstr.c
45
dynstr.c
|
@ -30,33 +30,34 @@ void dynstr_init(struct dynstr *const d)
|
||||||
memset(d, 0, sizeof *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, ...)
|
enum dynstr_err dynstr_append(struct dynstr *const d, const char *const format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
return dynstr_vappend(d, format, ap);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum dynstr_err dynstr_prepend(struct dynstr *const d, const char *const format, ...)
|
enum dynstr_err dynstr_prepend(struct dynstr *const d, const char *const format, ...)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#error C99 support is mandatory for dynstr
|
#error C99 support is mandatory for dynstr
|
||||||
#endif /* __STDC_VERSION < 199901L */
|
#endif /* __STDC_VERSION < 199901L */
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
@ -108,6 +109,19 @@ void dynstr_init(struct dynstr *d);
|
||||||
*/
|
*/
|
||||||
enum dynstr_err dynstr_append(struct dynstr *d, const char *format, ...);
|
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
|
* This function takes a string literal in printf format and a variable
|
||||||
* number of arguments, calculates its size and prepends it into the
|
* number of arguments, calculates its size and prepends it into the
|
||||||
|
|
Loading…
Reference in New Issue