#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; imessages.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; imessages.size; i++) { struct message const* m = self->messages.data[i]; if (m->kind == STATUS_ERROR) { return false; } } return true; }