diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-08 23:31:18 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-15 06:43:30 +0200 |
| commit | a697a21927bddb091ba1a6d88c4db01ef2f58092 (patch) | |
| tree | da55b583dba1b28e1c8c2ddc11b799ce6c3324d8 | |
| parent | 4ca1ddef1c928da98f6e7a59afda231cda75a036 (diff) | |
| download | sparse-dev-a697a21927bddb091ba1a6d88c4db01ef2f58092.tar.gz | |
utils: add xasprintf() & xvasprintf()
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | utils.c | 30 | ||||
| -rw-r--r-- | utils.h | 18 |
2 files changed, 48 insertions, 0 deletions
@@ -4,6 +4,8 @@ #include "utils.h" #include "allocate.h" #include <string.h> +#include <stdarg.h> +#include <stdio.h> void *xmemdup(const void *src, size_t len) @@ -15,3 +17,31 @@ char *xstrdup(const char *src) { return xmemdup(src, strlen(src) + 1); } + +char *xvasprintf(const char *fmt, va_list ap) +{ + va_list ap2; + char *str; + int n; + + va_copy(ap2, ap); + n = vsnprintf(NULL, 0, fmt, ap2) + 1; + va_end(ap2); + + str = __alloc_bytes(n); + vsnprintf(str, n, fmt, ap); + + return str; +} + +char *xasprintf(const char *fmt, ...) +{ + va_list ap; + char *str; + + va_start(ap, fmt); + str = xvasprintf(fmt, ap); + va_end(ap); + + return str; +} @@ -6,6 +6,7 @@ // ----------------------- #include <stddef.h> +#include <stdarg.h> /// // duplicate a memory buffer in a newly allocated buffer. @@ -22,4 +23,21 @@ void *xmemdup(const void *src, size_t len); // :func:`__alloc_bytes()`. char *xstrdup(const char *src); +/// +// printf to allocated string +// @fmt: the format followed by its arguments. +// @return: the allocated & formatted string. +// This function is similar to asprintf() but the resulting string +// is allocated with __alloc_bytes(). +char *xasprintf(const char *fmt, ...); + +/// +// vprintf to allocated string +// @fmt: the format +// @ap: the variadic arguments +// @return: the allocated & formatted string. +// This function is similar to asprintf() but the resulting string +// is allocated with __alloc_bytes(). +char *xvasprintf(const char *fmt, va_list ap); + #endif |
