Files

118 lines
2.3 KiB
C
Raw Permalink Normal View History

#include "ctx.h"
#include "diag.h"
#include "write.h"
#include <ivy/diag.h>
#include <stdlib.h>
#include <string.h>
enum ivy_status ivy_diag_ctx_create(struct ivy_diag_ctx **out)
{
struct ivy_diag_ctx *ctx = malloc(sizeof *ctx);
if (!ctx) {
return IVY_ERR_NO_MEMORY;
}
memset(ctx, 0x0, sizeof *ctx);
*out = ctx;
return IVY_OK;
}
void ivy_diag_ctx_destroy(struct ivy_diag_ctx *ctx)
{
}
enum ivy_status ivy_diag_ctx_set_line_source(
struct ivy_diag_ctx *ctx, struct ivy_line_source *src)
{
ctx->ctx_line_source = src;
return IVY_OK;
}
enum ivy_status ivy_diag_ctx_set_class_definitions(
struct ivy_diag_ctx *ctx, const struct ivy_diag_class *classes,
size_t nr_classes)
{
ctx->ctx_classes = classes;
ctx->ctx_nr_classes = nr_classes;
return IVY_OK;
}
enum ivy_status ivy_diag_ctx_set_msg_definitions(
struct ivy_diag_ctx *ctx, const struct ivy_diag_msg *msgs, size_t nr_msgs)
{
ctx->ctx_msg = msgs;
ctx->ctx_nr_msg = nr_msgs;
return IVY_OK;
}
void ivy_diag_ctx_write(
struct ivy_diag_ctx *ctx, enum ivy_diag_format format,
struct ivy_diag_stream *stream)
{
2025-11-06 10:38:58 +00:00
b_queue_entry *entry = b_queue_first(&ctx->ctx_diags);
while (entry) {
struct ivy_diag *diag
2025-11-06 10:38:58 +00:00
= b_unbox(struct ivy_diag, entry, diag_entry);
diag_write(ctx, diag, format, stream);
2025-11-06 10:38:58 +00:00
entry = b_queue_next(entry);
}
}
struct ivy_diag *ivy_diag_ctx_create_diag(
struct ivy_diag_ctx *ctx, unsigned long diag_class)
{
struct ivy_diag *out = malloc(sizeof *out);
if (!out) {
return NULL;
}
memset(out, 0x0, sizeof *out);
out->diag_class = diag_class;
out->diag_parent = ctx;
b_queue_push_back(&ctx->ctx_diags, &out->diag_entry);
return out;
}
const struct ivy_diag_class *diag_ctx_get_class(
struct ivy_diag_ctx *ctx, unsigned long class_id)
{
if (!ctx->ctx_classes) {
return NULL;
}
if (class_id >= ctx->ctx_nr_classes) {
return NULL;
}
const struct ivy_diag_class *out = &ctx->ctx_classes[class_id];
if (out->c_type == IVY_DIAG_NONE || !out->c_title) {
return NULL;
}
return out;
}
const struct ivy_diag_msg *diag_ctx_get_msg(
struct ivy_diag_ctx *ctx, unsigned long msg_id)
{
if (!ctx->ctx_msg) {
return NULL;
}
if (msg_id >= ctx->ctx_nr_msg) {
return NULL;
}
const struct ivy_diag_msg *out = &ctx->ctx_msg[msg_id];
if (!out->msg_content) {
return NULL;
}
return out;
}