From 32c1fbd2cf779a65e807d0d82412ffffa2401962 Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Fri, 15 Nov 2019 18:01:45 +0300 Subject: [magi] --- src/error.c | 78 ++++++++++++++++++++++++++++--------------------------------- 1 file changed, 36 insertions(+), 42 deletions(-) (limited to 'src/error.c') diff --git a/src/error.c b/src/error.c index 106ca8c..01fae36 100644 --- a/src/error.c +++ b/src/error.c @@ -1,55 +1,49 @@ #include "error.h" +#include "utils.h" #include -enum control { get, set }; - -static struct magi_error * errorctl( - enum control command, struct magi_error_message * err) -{ - static struct magi_error * error = 0; - if (command == set) { - error = err; - } - return error; -} - - -struct magi_error * magi_error_get() +void magi_error_add(struct magi_error ** error, char * format, ...) { - return errorctl(get, 0); -} - -void magi_error_set(char * format, ...) -{ - for (;;) { - Create(len); - /* Try to print in the allocated space. */ - va_list ap; - va_start(ap, format); - int n = vsnprintf(p->buf, len, format, ap); - va_end(ap); - /* If that worked, we're done */ - if (n > -1 && n < len) - break; - /* Else try again with more space. */ - if (n > -1) /* glibc 2.1 */ - len = n + 1; /* precisely what is needed */ - else /* glibc 2.0 */ - len *= 2; /* twice the old size */ + if (error && format) { + struct magi_error * head = malloc(sizeof(*head)); + if (head) { + int size; + va_list args; + + va_start(args, format); + size = vsnprintf(0, 0, format, args); + va_end(args); + + if (size >= 0) { + head->message = malloc(++size); + if (head->message) { + va_start(args, format); + size = vsnprintf(head->message, size, format, args); + va_end(args); + if (size >= 0) { + head->prev = *error; + *error = head; + return; + } else { + free(head->message); + } + } + } + + free(head); + } } - errorctl(); } -void magi_error_rid() +void magi_error_destroy(struct magi_error * error) { - struct magi_error * error = errorctl(get, 0); if (error) { - if (error->message) { - free(error->message); - } - free(error); - errorctl(set, 0); + magi_error_destroy(error->prev); + free(error->prev); + free(error->message); + error->prev = 0; + error->message = 0; } } -- cgit v1.2.3