#include #include #include "b_string.h" #include "b_error.h" b_error *b_error_new() { b_error *err; if ((err = malloc(sizeof(*err))) == NULL) { goto error_malloc; } err->type = B_ERROR_OK; err->status = 0; err->_errno = 0; err->path = NULL; err->message = NULL; err->callback = NULL; return err; error_malloc: return NULL; } void b_error_set_callback(b_error *err, b_error_callback callback) { if (err == NULL) return; err->callback = callback; } void b_error_set(b_error *err, enum b_error_type type, int _errno, char *message, b_string *path) { if (err == NULL) return; err->type = type; err->_errno = _errno; if ( type == B_ERROR_FATAL ) { err->status = -1; } b_string_free(err->message); b_string_free(err->path); if ((err->message = b_string_new(message)) == NULL) { goto error_string_dup_message; } if ((err->path = b_string_dup(path)) == NULL) { goto error_string_dup_path; } if (err->callback) { err->callback(err); } return; error_string_dup_path: b_string_free(err->message); err->message = NULL; error_string_dup_message: return; } void b_error_clear(b_error *err) { if (err == NULL) return; err->type = B_ERROR_OK; err->_errno = 0; b_string_free(err->message); err->message = NULL; b_string_free(err->path); err->path = NULL; } int b_error_warn(b_error *err) { if (err == NULL) return 0; return err->type == B_ERROR_WARN; } int b_error_fatal(b_error *err) { if (err == NULL) return 0; return err->type == B_ERROR_FATAL; } int b_error_status(b_error *err) { if (err == NULL) return -1; return err->status; } int b_error_errno(b_error *err) { if (err == NULL) return -1; return err->_errno; } b_string *b_error_message(b_error *err) { if (err == NULL) return NULL; return err->message; } b_string *b_error_path(b_error *err) { if (err == NULL) return NULL; return err->path; } void b_error_reset(b_error *err) { if (err == NULL) return; b_string_free(err->message); err->message = NULL; b_string_free(err->path); err->path = NULL; err->status = 0; err->_errno = 0; } void b_error_destroy(b_error *err) { if (err == NULL) return; b_string_free(err->message); err->message = NULL; b_string_free(err->path); err->path = NULL; err->status = 0; err->_errno = 0; err->callback = NULL; free(err); }