diff options
Diffstat (limited to 'src/utils.c')
| -rw-r--r-- | src/utils.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c index fdd8452..2a0e286 100644 --- a/src/utils.c +++ b/src/utils.c @@ -2,6 +2,7 @@ #include <stdio.h> #include <assert.h> +#include <stdarg.h> struct allocator { void** bufs; @@ -39,4 +40,35 @@ void * allocate(struct allocator * alct, size_t size) { return ptr; } +char* safe_sprintf(struct allocator *alct, const char* format, ...) { + va_list args; + va_list args_copy; + int length; + char* buffer; + va_start(args, format); + va_copy(args_copy, args); + + length = vsnprintf(NULL, 0, format, args); + + if (length < 0) { + va_end(args); + va_end(args_copy); + return NULL; + } + + buffer = (char*)allocate(alct, length + 1); + + if (buffer == NULL) { + va_end(args); + va_end(args_copy); + return NULL; + } + + vsprintf(buffer, format, args_copy); + + va_end(args); + va_end(args_copy); + + return buffer; +} |
