roza/lib/err.c

86 lines
1.6 KiB
C
Raw Permalink Normal View History

2023-12-09 17:24:41 +00:00
#include "err.h"
2023-12-11 17:01:22 +00:00
RZ_ENUM_C(ErrType, ERR_TYPES);
2023-12-09 17:24:41 +00:00
void err_init(err_t* err)
{
assert(err);
err->size = 0;
err->total = 0;
err->quiet = 0;
2023-12-09 17:24:41 +00:00
}
void err_free(err_t* err)
{
assert(err);
for (size_t i=0; i<err->size; i++)
{
free(err->errors[i]->what);
free(err->errors[i]);
}
err->size = 0;
}
2023-12-11 17:01:22 +00:00
void err_of_type(err_t* err, char* what, int line, ErrType type)
2023-12-09 17:24:41 +00:00
{
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;
2023-12-11 17:01:22 +00:00
err->errors[err->size]->type = type;
2023-12-09 17:24:41 +00:00
err->size++;
err->total++;
2023-12-09 17:24:41 +00:00
}
2023-12-11 17:01:22 +00:00
void err_fatal(err_t* err, char* what, int line)
{
err_of_type(err, what, line, ERR_FATAL);
}
int err_dump(err_t* err)
2023-12-09 17:24:41 +00:00
{
assert(err);
2023-12-11 17:01:22 +00:00
int is_fatal = 0;
2023-12-09 17:24:41 +00:00
for (size_t i=0; i<err->size; i++)
{
2023-12-11 17:01:22 +00:00
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);
}
2023-12-11 17:01:22 +00:00
}
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);
}
2023-12-11 17:01:22 +00:00
is_fatal = 1;
}
2023-12-09 17:24:41 +00:00
}
int total = err->total;
int quiet = err->quiet;
2023-12-09 17:24:41 +00:00
err_free(err);
2023-12-11 17:01:22 +00:00
err_init(err);
2023-12-09 17:24:41 +00:00
err->total = total;
err->quiet = quiet;
2023-12-11 17:01:22 +00:00
return is_fatal;
2023-12-09 17:24:41 +00:00
}