88 lines
1.7 KiB
C
88 lines
1.7 KiB
C
#include "status.h"
|
|
|
|
MK_ENUM_C(Status, STATUS_KIND);
|
|
|
|
void message_init(struct message* self,
|
|
Status kind,
|
|
char const* what,
|
|
int where)
|
|
{
|
|
assert(self);
|
|
assert(what);
|
|
|
|
self->kind = kind;
|
|
self->what = strdup(what);
|
|
self->where = where;
|
|
}
|
|
|
|
void message_free(struct message* self)
|
|
{
|
|
assert(self);
|
|
free(self->what);
|
|
}
|
|
|
|
void status_init(struct status* self)
|
|
{
|
|
assert(self);
|
|
vec_init(&self->messages);
|
|
}
|
|
|
|
void status_free(struct status* self)
|
|
{
|
|
assert(self);
|
|
vec_free_elements(&self->messages, (void*) message_free);
|
|
vec_free(&self->messages);
|
|
}
|
|
void status_push(struct status* self,
|
|
Status kind,
|
|
int where,
|
|
char const* format,
|
|
...)
|
|
{
|
|
char msg[MK_STRLEN];
|
|
va_list lst;
|
|
va_start(lst, format);
|
|
|
|
vsnprintf(msg, MK_STRLEN, format, lst);
|
|
|
|
struct message* message = malloc(sizeof(struct message));
|
|
message_init(message, kind, msg, where);
|
|
|
|
vec_push(&self->messages, message);
|
|
va_end(lst);
|
|
}
|
|
|
|
void status_dump(struct status* self)
|
|
{
|
|
assert(self);
|
|
|
|
for (size_t i=0; i<self->messages.size; i++)
|
|
{
|
|
struct message const* msg = self->messages.data[i];
|
|
|
|
printf("[%s:%d] %s\n",
|
|
StatusStr[msg->kind] + strlen("STATUS_"),
|
|
msg->where,
|
|
msg->what
|
|
);
|
|
}
|
|
}
|
|
|
|
bool status_is_ok(struct status* self)
|
|
{
|
|
assert(self);
|
|
|
|
for (size_t i=0; i<self->messages.size; i++)
|
|
{
|
|
struct message const* m = self->messages.data[i];
|
|
|
|
if (m->kind == STATUS_ERROR)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|