From 09f7df79bbe4a171b0bad73c7bcd5b6398f5b350 Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Sun, 5 Jun 2022 22:06:33 +0200 Subject: [PATCH] apfl_debug_print_val: Use format writer abstraction --- src/apfl.h | 11 ++++++++++- src/eval.c | 9 ++++++--- src/format.c | 2 +- src/format.h | 9 +-------- src/main.c | 4 ++-- src/value.c | 5 ++--- src/value.h | 2 +- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/apfl.h b/src/apfl.h index 7b74310..395a0e9 100644 --- a/src/apfl.h +++ b/src/apfl.h @@ -108,6 +108,15 @@ struct apfl_string apfl_string_builder_move_string(struct apfl_string_builder *) #define apfl_string_builder_append_cstr(builder, cstr) (apfl_string_builder_append((builder), apfl_string_view_from_cstr((cstr)))) +struct apfl_format_writer { + bool (*write)(void *, const char *buf, size_t len); + void *opaque; +}; + +struct apfl_format_writer apfl_format_file_writer(FILE *f); + +struct apfl_format_writer apfl_format_string_writer(struct apfl_string_builder *sb); + // Tokens enum apfl_token_type { @@ -627,7 +636,7 @@ enum apfl_result apfl_dict_set(apfl_ctx, apfl_stackidx dict, apfl_stackidx k, ap // Get a value from a container (list or dict) and push it on the stack. container and k will be dropped. enum apfl_result apfl_get_member(apfl_ctx, apfl_stackidx container, apfl_stackidx k); -bool apfl_debug_print_val(apfl_ctx, apfl_stackidx, FILE *); +bool apfl_debug_print_val(apfl_ctx, apfl_stackidx, struct apfl_format_writer); struct apfl_messages { const char *could_not_alloc_mem; diff --git a/src/eval.c b/src/eval.c index 8444088..ee353dd 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6,6 +6,7 @@ #include "bytecode.h" #include "compile.h" #include "context.h" +#include "format.h" #include "hashmap.h" #include "strings.h" #include "value.h" @@ -181,15 +182,17 @@ eval_expr(apfl_ctx ctx, struct apfl_expr expr) } bool -apfl_debug_print_val(apfl_ctx ctx, apfl_stackidx index, FILE *f) +apfl_debug_print_val(apfl_ctx ctx, apfl_stackidx index, struct apfl_format_writer w) { struct apfl_value value; if (!apfl_stack_pop(ctx, &value, index)) { - fprintf(f, "apfl_debug_print_val: Invalid stack index %d\n", index); + FMT_TRY(apfl_format_put_string(w, "apfl_debug_print_val: Invalid stack index ")); + FMT_TRY(apfl_format_put_int(w, (int)index)); + FMT_TRY(apfl_format_put_string(w, "\n")); return true; } - return apfl_value_print(value, f); + return apfl_value_print(value, w); } struct apfl_iterative_runner_data { diff --git a/src/format.c b/src/format.c index b5a2384..906fd62 100644 --- a/src/format.c +++ b/src/format.c @@ -8,7 +8,7 @@ #include "format.h" #define WRITE(w, buf, len) w.write(w.opaque, buf, len) -#define TRY(x) if (!(x)) return false; +#define TRY FMT_TRY static bool write_file(void *opaque, const char *buf, size_t len) diff --git a/src/format.h b/src/format.h index 30146ee..c6dd257 100644 --- a/src/format.h +++ b/src/format.h @@ -11,14 +11,7 @@ extern "C" { #include "apfl.h" -struct apfl_format_writer { - bool (*write)(void *, const char *buf, size_t len); - void *opaque; -}; - -struct apfl_format_writer apfl_format_file_writer(FILE *f); - -struct apfl_format_writer apfl_format_string_writer(struct apfl_string_builder *sb); +#define FMT_TRY(x) do { if (!(x)) return false; } while (0) bool apfl_format_put_string_view(struct apfl_format_writer, struct apfl_string_view); #define apfl_format_put_string(w, s) apfl_format_put_string_view((w), apfl_string_view_from(s)) diff --git a/src/main.c b/src/main.c index e7693bb..9a4a75f 100644 --- a/src/main.c +++ b/src/main.c @@ -159,10 +159,10 @@ repl_eval(void) while (apfl_iterative_runner_next(runner)) { switch (apfl_iterative_runner_get_result(runner)) { case APFL_RESULT_OK : - assert(apfl_debug_print_val(ctx, -1, stdout)); + assert(apfl_debug_print_val(ctx, -1, apfl_format_file_writer(stdout))); break; case APFL_RESULT_ERR: - assert(apfl_debug_print_val(ctx, -1, stderr)); + assert(apfl_debug_print_val(ctx, -1, apfl_format_file_writer(stderr))); fprintf(stderr, "Error occurred during evaluation.\n"); break; case APFL_RESULT_ERR_FATAL: diff --git a/src/value.c b/src/value.c index 2b67ff8..fbc47a4 100644 --- a/src/value.c +++ b/src/value.c @@ -9,7 +9,7 @@ #include "hashmap.h" #include "value.h" -#define TRY(x) do { if (!(x)) return false; } while (0) +#define TRY FMT_TRY size_t apfl_list_len(struct list_header *list) @@ -159,9 +159,8 @@ apfl_value_move(struct apfl_value *src) } bool -apfl_value_print(struct apfl_value value, FILE *out) +apfl_value_print(struct apfl_value value, struct apfl_format_writer w) { - struct apfl_format_writer w = apfl_format_file_writer(out); TRY(format(0, w, value, false)); TRY(apfl_format_put_string(w, "\n")); return true; diff --git a/src/value.h b/src/value.h index 789bc55..adaca1b 100644 --- a/src/value.h +++ b/src/value.h @@ -58,7 +58,7 @@ enum apfl_value_type apfl_value_type_to_abstract_type(enum value_type); bool apfl_value_eq(const struct apfl_value, const struct apfl_value); struct apfl_value apfl_value_move(struct apfl_value *src); -bool apfl_value_print(struct apfl_value, FILE *); +bool apfl_value_print(struct apfl_value, struct apfl_format_writer); apfl_hash apfl_value_hash(const struct apfl_value); enum get_item_result {