From e6d5f9552e66ee2db3056e810b58b2bf82551356 Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Fri, 15 Nov 2019 15:06:13 +0300 Subject: Merge remote-tracking branch 'croco/master' into test --- src/error.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/error.c (limited to 'src/error.c') diff --git a/src/error.c b/src/error.c new file mode 100644 index 0000000..106ca8c --- /dev/null +++ b/src/error.c @@ -0,0 +1,55 @@ +#include "error.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() +{ + 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 */ + } + errorctl(); +} + +void magi_error_rid() +{ + struct magi_error * error = errorctl(get, 0); + if (error) { + if (error->message) { + free(error->message); + } + free(error); + errorctl(set, 0); + } +} -- cgit v1.2.3