diff options
author | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 15:06:13 +0300 |
---|---|---|
committer | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 15:06:13 +0300 |
commit | e6d5f9552e66ee2db3056e810b58b2bf82551356 (patch) | |
tree | 28aba181f716f5ab9df442531d8c72c3c8b4d197 /src/error.c | |
parent | ca08ed93e67a99868f01d21f0d2e34d6a6757c75 (diff) | |
download | magi-e6d5f9552e66ee2db3056e810b58b2bf82551356.tar magi-e6d5f9552e66ee2db3056e810b58b2bf82551356.tar.xz magi-e6d5f9552e66ee2db3056e810b58b2bf82551356.zip |
Merge remote-tracking branch 'croco/master' into test
Diffstat (limited to 'src/error.c')
-rw-r--r-- | src/error.c | 55 |
1 files changed, 55 insertions, 0 deletions
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 <stdarg.h> + + +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); + } +} |