aboutsummaryrefslogtreecommitdiff
path: root/src/error.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2019-11-15 18:01:45 +0300
committerAleksey Veresov <aleksey@veresov.pro>2019-11-15 18:01:45 +0300
commit32c1fbd2cf779a65e807d0d82412ffffa2401962 (patch)
treebb0020c18a72c4622e68258d8911956ecaca3765 /src/error.c
parente6d5f9552e66ee2db3056e810b58b2bf82551356 (diff)
downloadmagi-32c1fbd2cf779a65e807d0d82412ffffa2401962.tar
magi-32c1fbd2cf779a65e807d0d82412ffffa2401962.tar.xz
magi-32c1fbd2cf779a65e807d0d82412ffffa2401962.zip
[magi]
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c78
1 files changed, 36 insertions, 42 deletions
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 <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()
+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;
}
}