moka/lib/status.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;
}