aboutsummaryrefslogtreecommitdiff
path: root/src/utils.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-03-25 13:07:21 +0800
committerMistivia <i@mistivia.com>2025-03-25 13:07:21 +0800
commitfb7664e087cb1afb64aae2128365f703beb30b57 (patch)
tree6d4e2a4cc695052e489ec9e3fd28538a79a08f4c /src/utils.c
parentdc87ff4b0c9f311be7fad652594e3766a4ddb0c6 (diff)
add result style error handling
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c32
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;
+}