summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-10-07 20:16:49 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-10-07 20:16:49 -0700
commit6acdc55506c2da5de12e28e0b8fc405d211e09c5 (patch)
treec42811c9e3bf2b0a05603f3fe46758417ce80f47 /parser.c
parent3666309d5aa374b813f5f7be7cf186375950b7c5 (diff)
downloadtxr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.tar.gz
txr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.tar.bz2
txr-6acdc55506c2da5de12e28e0b8fc405d211e09c5.zip
tree: circular notation support.
* lib.c (populate_obj_hash): Handle tree object. * parser.c (circ_backpatch): Likewise.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/parser.c b/parser.c
index 7661d60c..03e99750 100644
--- a/parser.c
+++ b/parser.c
@@ -57,6 +57,7 @@
#include "sysif.h"
#include "cadr.h"
#include "struct.h"
+#include "tree.h"
#include "parser.h"
#include "regex.h"
#include "itypes.h"
@@ -400,7 +401,31 @@ tail:
else
circ_backpatch(p, &cs, sv);
}
+ } else if (treep(obj)) {
+ val iter = tree_begin(obj);
+ val node;
+ val nodes = nil;
+
+ while ((node = tree_next(iter))) {
+ val k = node->tn.key;
+ val rk = patch_ref(p, k);
+ if (rk)
+ set(mkloc(node->tn.key, node), rk);
+ else
+ circ_backpatch(p, &cs, k);
+ push(node, &nodes);
+ }
+
+ if (nodes) {
+ tree_clear(obj);
+
+ while (nodes) {
+ val node = pop(&nodes);
+ tree_insert_node(obj, node);
+ }
+ }
}
+
break;
case FUN:
if (obj->f.functype == FINTERP) {