From f36272b66fdb2b2a2a6153935d7d134ca5a76b9a Mon Sep 17 00:00:00 2001 From: Milo Turner Date: Fri, 7 Feb 2020 17:32:41 -0500 Subject: [PATCH] [ctxt] ax_ctxt basics --- src/ctxt.h | 23 +++++++++++++++++++++++ src/ctxt/ctxt.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ test/main.c | 22 +++++++--------------- 3 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 src/ctxt.h create mode 100644 src/ctxt/ctxt.c diff --git a/src/ctxt.h b/src/ctxt.h new file mode 100644 index 0000000..26d9800 --- /dev/null +++ b/src/ctxt.h @@ -0,0 +1,23 @@ +#pragma once + +#include "util/region.h" + +struct ax_ctxt { + struct rgn* self_rgn; + struct rgn err_rgn; + char* err; +}; + +void ax__ctxt_init(struct ax_ctxt* ax, struct rgn* self_rgn); +void ax__ctxt_cleanup(struct ax_ctxt* ax); + +static inline char* ax__make_error_buf(struct ax_ctxt* ax, size_t n) +{ + rgn_clear(&ax->err_rgn); + return (ax->err = ralloc_typed(&ax->err_rgn, char, n)); +} + +static inline void ax__set_error(struct ax_ctxt* ax, const char* text) +{ + strcpy(ax__make_error_buf(ax, strlen(text) + 1), text); +} diff --git a/src/ctxt/ctxt.c b/src/ctxt/ctxt.c new file mode 100644 index 0000000..ddf9879 --- /dev/null +++ b/src/ctxt/ctxt.c @@ -0,0 +1,45 @@ +#include "../ctxt.h" +#include "../ax.h" + +/* ----------------------------------------------------------------------------- + * API functions + * -------------------------------------------------------------------------- */ + +struct ax_ctxt* ax_new(void) +{ + // "bootstrap" a new region + struct rgn rgn0; + rgn_init(&rgn0, SMALL); + struct rgn* rgn = rmemdup_typed(&rgn0, struct rgn, &rgn0, 1); + // use it to make a new context + struct ax_ctxt* ax = ralloc_typed(rgn, struct ax_ctxt, 1); + ax__ctxt_init(ax, rgn); + return ax; +} + +void ax_free(struct ax_ctxt* ax) +{ + ax__ctxt_cleanup(ax); + rgn_cleanup(ax->self_rgn); +} + +const char* ax_get_error(struct ax_ctxt* ax) +{ + return ax->err; +} + +/* ----------------------------------------------------------------------------- + * Internal 'ax_ctxt' operations + * -------------------------------------------------------------------------- */ + +void ax__ctxt_init(struct ax_ctxt* ax, struct rgn* self_rgn) +{ + ax->self_rgn = self_rgn; + rgn_init(&ax->err_rgn, SMALL); + ax->err = ""; +} + +void ax__ctxt_cleanup(struct ax_ctxt* ax) +{ + rgn_cleanup(&ax->err_rgn); +} diff --git a/test/main.c b/test/main.c index bfd749b..53daea7 100644 --- a/test/main.c +++ b/test/main.c @@ -1,21 +1,13 @@ -#include "../src/region.h" #include +#include "../src/ax.h" +#include "../src/ctxt.h" + int main(void) { - struct rgn rgn[1]; - rgn_init(rgn, SMALL); - - for (int j = 0; j < 4; j++) { - for (int i = 0; i < 30; i++) { - char test[100]; - memset(test, 'A', 99); - test[99] = '\0'; - printf("%d; %p\n", j, rstrdup(rgn, test)); - } - rgn_clear(rgn); - } - - rgn_cleanup(rgn); + struct ax_ctxt* ax = ax_new(); + ax__set_error(ax, "hello world"); + printf("--> %s\n", ax_get_error(ax)); + ax_free(ax); return 0; }