Mercurial > lbo > hg > ylisp
changeset 71:462e9b547fed
expr: Enable debugging of exprs into strings
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 25 Aug 2019 16:57:47 +0200 |
parents | 1b2bd8c6cc25 |
children | af4431b0fac0 |
files | src/expr.c src/expr.h src/value.c |
diffstat | 3 files changed, 29 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/expr.c Sun Aug 25 16:46:00 2019 +0200 +++ b/src/expr.c Sun Aug 25 16:57:47 2019 +0200 @@ -118,40 +118,49 @@ } } -void yexpr_debug(yexpr_t* expr) { - ystr_t tmp; +ystr_t yexpr_debug_str(yexpr_t* expr) { + ystr_t tmp = ystr_new(NULL), tmp2; switch (expr->typ) { case YEXPR_UNDEF: - fprintf(stderr, "<undef>"); + ystr_build(&tmp, "<undef>"); break; case YEXPR_NUMBER: - fprintf(stderr, "%lld", expr->value.n); + ystr_build(&tmp, "%lld", expr->value.n); break; case YEXPR_STRING: - fprintf(stderr, "%s", ystr_str(&expr->value.str)); + ystr_append(&tmp, &expr->value.str); break; case YEXPR_ATOM: - fprintf(stderr, "%s", yatom_name(expr->value.atom)); + ystr_build(&tmp, "%s", yatom_name(expr->value.atom)); break; case YEXPR_REF: - tmp = yref_debug(&expr->value.ref); - fprintf(stderr, "%s", ystr_str(&tmp)); - ystr_destroy(&tmp); + tmp2 = yref_debug(&expr->value.ref); + ystr_append(&tmp, &tmp2); + ystr_destroy(&tmp2); break; case YEXPR_BUILTIN: - fprintf(stderr, "%s", ybuiltin_name(expr->value.builtin)); + ystr_build(&tmp, "%s", ybuiltin_name(expr->value.builtin)); break; case YEXPR_LIST: - fprintf(stderr, "("); + ystr_build(&tmp, "("); yexpr_t* var = YVEC_AT(&expr->value.list, 0, yexpr_t); for (int i = 0; i < expr->value.list.len; var = YVEC_AT(&expr->value.list, ++i, yexpr_t)) { - yexpr_debug(var); - fprintf(stderr, " "); + ystr_t sub = yexpr_debug_str(var); + ystr_append(&tmp, &sub); + ystr_build(&tmp, " "); + ystr_destroy(&sub); } - fprintf(stderr, ")"); + ystr_build(&tmp, ")"); break; default: assert(false /* Unhandled YEXPR_TYPE */); } + return tmp; } + +void yexpr_debug(yexpr_t* expr) { + ystr_t repr = yexpr_debug_str(expr); + fputs(ystr_str(&repr), stderr); + ystr_destroy(&repr); +}
--- a/src/expr.h Sun Aug 25 16:46:00 2019 +0200 +++ b/src/expr.h Sun Aug 25 16:57:47 2019 +0200 @@ -94,6 +94,11 @@ void yexpr_debug(yexpr_t* expr); /** + * Return a string representation of `expr`. The caller owns the returned string. + */ +ystr_t yexpr_debug_str(yexpr_t* expr); + +/** * @} */ #endif
--- a/src/value.c Sun Aug 25 16:46:00 2019 +0200 +++ b/src/value.c Sun Aug 25 16:57:47 2019 +0200 @@ -172,7 +172,7 @@ // Unnamed value. ref.ref.id = yvalue_counter++; size_t new_index = YVEC_PUSH(&yvalue_table, val); - assert(new_index == (yvalue_counter - YVALUE_COUNTER_OFFSET)); + assert(new_index == (yvalue_counter - YVALUE_COUNTER_OFFSET - 1)); return ref; } else { yvalue_t* valp = yvalue_get(ref);