#include "err.h" RZ_ENUM_C(ErrType, ERR_TYPES); void err_init(err_t* err) { assert(err); err->size = 0; err->total = 0; err->quiet = 0; } void err_free(err_t* err) { assert(err); for (size_t i=0; isize; i++) { free(err->errors[i]->what); free(err->errors[i]); } err->size = 0; } void err_of_type(err_t* err, char* what, int line, ErrType type) { assert(err); assert(err->size + 1 < RZ_ERROR_STACK_SIZE); err->errors[err->size] = malloc(sizeof(err_msg_t)); err->errors[err->size]->what = strdup(what); err->errors[err->size]->line = line; err->errors[err->size]->type = type; err->size++; err->total++; } void err_fatal(err_t* err, char* what, int line) { err_of_type(err, what, line, ERR_FATAL); } int err_dump(err_t* err) { assert(err); int is_fatal = 0; for (size_t i=0; isize; i++) { if (err->errors[i]->type == ERR_WARNING) { if (!err->quiet) { fprintf(stderr, "\33[33mWARNING\33[0m[:%d] %s\n", err->errors[i]->line, err->errors[i]->what); } } else if (err->errors[i]->type == ERR_FATAL) { if (!err->quiet) { fprintf(stderr, "\33[31mERROR\33[0m[:%d] %s\n", err->errors[i]->line, err->errors[i]->what); } is_fatal = 1; } } int total = err->total; int quiet = err->quiet; err_free(err); err_init(err); err->total = total; err->quiet = quiet; return is_fatal; }