changeset 45:828d3b58f2cf

expr: Implement better debugging for refs
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 22 Aug 2019 10:49:49 +0200
parents 6183b0c133bf
children e753d447a3e6
files src/expr.c src/expr.h
diffstat 2 files changed, 22 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/expr.c	Wed Aug 21 22:43:55 2019 +0200
+++ b/src/expr.c	Thu Aug 22 10:49:49 2019 +0200
@@ -20,6 +20,19 @@
     return ref;
 }
 
+ystr_t yref_debug(yref_t* ref) {
+    if (ref->typ == YREF_ID) {
+        ystr_t s = ystr_new(NULL);
+        ystr_build(&s, "id:<%llu>", ref->ref.id);
+        return s;
+    } else if (ref->typ == YREF_SYM) {
+        ystr_t s = ystr_new(NULL);
+        ystr_build(&s, "id:<\"%s\">", ystr_str(&ref->ref.sym));
+        return s;
+    }
+    return ystr_new("id:INVALID");
+}
+
 void yref_destroy(yref_t* ref) {
     if (ref == NULL) return;
     if (ref->typ == YREF_SYM) ystr_destroy(&ref->ref.sym);
@@ -126,6 +139,7 @@
 }
 
 void yexpr_debug(yexpr_t* expr) {
+    ystr_t tmp;
     switch (expr->typ) {
         case YEXPR_UNDEF:
             fprintf(stderr, "<undef>");
@@ -140,14 +154,9 @@
             fprintf(stderr, "%s", yatom_name(expr->value.atom));
             break;
         case YEXPR_REF:
-            if (expr->value.ref.typ == YREF_ID) {
-                fprintf(stderr, "id<%llu>", expr->value.ref.ref.id);
-            } else if (expr->value.ref.typ == YREF_SYM) {
-                fprintf(stderr, "id<\"%s\">",
-                        ystr_str(&expr->value.ref.ref.sym));
-            } else {
-                fprintf(stderr, "id<UNINITIALIZED>");
-            }
+            tmp = yref_debug(&expr->value.ref);
+            fprintf(stderr, "%s", ystr_str(&tmp));
+            ystr_destroy(&tmp);
             break;
         case YEXPR_LIST:
             fprintf(stderr, "(");
--- a/src/expr.h	Wed Aug 21 22:43:55 2019 +0200
+++ b/src/expr.h	Thu Aug 22 10:49:49 2019 +0200
@@ -52,6 +52,11 @@
 yref_t yref_new_c(const char* sym);
 
 /**
+ * Create a debug description of ref.
+ */
+ystr_t yref_debug(yref_t* ref);
+
+/**
  * @brief Deallocate memory used by the reference itself.
  */
 void yref_destroy(yref_t* ref);