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);