Revamp error handling to handle variable arguments
authorJonathan Dieter <jdieter@gmail.com>
Tue, 24 Jul 2018 11:43:11 +0000 (12:43 +0100)
committerJonathan Dieter <jdieter@gmail.com>
Tue, 24 Jul 2018 11:43:11 +0000 (12:43 +0100)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/error.c
src/lib/zck.c
src/lib/zck_private.h

index b3207362879680864aa1d398d53b73fa03cdc8fa..baa4fc5db97f011ad8980e5e8a94df5cfc746917 100644 (file)
 #include <stdio.h>
 #include <assert.h>
 #include <string.h>
+#include <stdarg.h>
 #include <zck.h>
 
 #include "zck_private.h"
 
-void set_fatal_error(zckCtx *zck, const char *msg) {
-    assert(zck != NULL && zck->msg == NULL && msg != NULL);
+char *snprintf_error = "String conversion error";
 
-    zck->fatal_msg = zmalloc(strlen(msg)+1);
-    strncpy(zck->fatal_msg, msg, strlen(msg));
-}
-
-void set_error(zckCtx *zck, const char *msg) {
-    assert(zck != NULL && zck->msg == NULL && msg != NULL);
+void set_error_wf(zckCtx *zck, int fatal, const char *format, ...) {
+    va_list args;
+    int size = 0;
+    assert(zck != NULL && zck->msg == NULL && format != NULL);
+    zck->error_state = 1 + (fatal > 0 ? 1 : 0);
 
-    zck->msg = zmalloc(strlen(msg)+1);
-    strncpy(zck->msg, msg, strlen(msg));
+    va_start(args, format);
+    size = vsnprintf(NULL, 0, format, args);
+    if(size < 0)
+        return;
+    zck->msg = zmalloc(size+1);
+    vsnprintf(zck->msg, size+1, format, args);
+    va_end(args);
 }
 
 char PUBLIC *zck_get_error(zckCtx *zck) {
     assert(zck != NULL);
 
-    if(zck->fatal_msg)
-        return zck->fatal_msg;
     return zck->msg;
 }
 
 int PUBLIC zck_clear_error(zckCtx *zck) {
     assert(zck != NULL);
 
-    if(zck->fatal_msg)
+    if(zck->error_state > 1)
         return False;
 
     free(zck->msg);
     zck->msg = NULL;
+    zck->error_state = 0;
     return True;
 }
index 2fab7f2ad27420972c150c7890e41cf9b8eff654..3e9b1ed3d4f1cdb0ee0113b984ccd2616a9dc741 100644 (file)
@@ -92,10 +92,7 @@ static void zck_clear(zckCtx *zck) {
         free(zck->msg);
         zck->msg = NULL;
     }
-    if(zck->fatal_msg) {
-        free(zck->fatal_msg);
-        zck->fatal_msg = NULL;
-    }
+    zck->error_state = 0;
     zck->fd = -1;
 }
 
index cf1ac5aedf6a777fd98b6a817567e5f93bfc519e..cf15bf2192bc2e3d62599676e119fe6c81bb1e7e 100644 (file)
 
 #define zck_log(...) zck_log_wf(__func__, __VA_ARGS__)
 
+#define set_error(zck, ...) set_error_wf(zck, 0, __VA_ARGS__); \
+                            zck_log(__VA_ARGS__)
+#define set_fatal_error(zck, ...) set_error_wf(zck, 1, __VA_ARGS__); \
+                                  zck_log(__VA_ARGS__)
 struct zckComp;
 
 typedef int (*finit)(struct zckComp *comp);
@@ -216,7 +220,7 @@ typedef struct zckCtx {
     int manual_chunk;
 
     char *msg;
-    char *fatal_msg;
+    int error_state;
 } zckCtx;
 
 int get_tmp_fd()
@@ -341,7 +345,6 @@ int compint_to_size(size_t *val, const char *compint, size_t *length,
 void zck_log_wf(const char *function, zck_log_type lt, const char *format, ...);
 
 /* error.c */
-void set_fatal_error(zckCtx *zck, const char *msg);
-void set_error(zckCtx *zck, const char *msg);
+void set_error_wf(zckCtx *zck, int fatal, const char *format, ...);
 
 #endif