summaryrefslogtreecommitdiffstats
path: root/tree.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-05-10 07:40:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-05-10 07:40:13 -0700
commitd29381d5d2d9af69e954cfd9d3fd8d533003a7e2 (patch)
treec2c8b9a00e27651d05b4f87e5b96d20bdfbb21d9 /tree.c
parent326d267efb40ae2f8c750fede3343f68e732e1d3 (diff)
downloadtxr-d29381d5d2d9af69e954cfd9d3fd8d533003a7e2.tar.gz
txr-d29381d5d2d9af69e954cfd9d3fd8d533003a7e2.tar.bz2
txr-d29381d5d2d9af69e954cfd9d3fd8d533003a7e2.zip
tree: copy-tree-iter function.
* lib.c (copy): Handle tree_iter_s via copy_tree_iter. * tree.c (copy_tree_iter): New function. (tree_init): copy-tree-iter intrinsic registered. * tree.h (copy_tree_iter): Declared. * tests/010/tree.tl: New test case. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'tree.c')
-rw-r--r--tree.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/tree.c b/tree.c
index 1f9bd9ff..e8b42523 100644
--- a/tree.c
+++ b/tree.c
@@ -29,6 +29,7 @@
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
+#include <string.h>
#include <limits.h>
#include <signal.h>
#include "config.h"
@@ -811,6 +812,26 @@ val tree_begin_at(val tree, val lowkey)
return iter;
}
+val copy_tree_iter(val iter)
+{
+ val self = lit("copy-tree-iter");
+ struct tree_diter *tdis = coerce(struct tree_diter *,
+ cobj_handle(self, iter, tree_iter_s));
+ struct tree_diter *tdid = coerce(struct tree_diter *,
+ chk_calloc(1, sizeof *tdid));
+ val iter_copy = cobj(coerce(mem_t *, tdid), tree_iter_s, &tree_iter_ops);
+ int depth = tdis->ti.depth;
+
+ tdid->ti.self = iter_copy;
+ tdid->ti.depth = depth;
+ tdid->ti.state = tdis->ti.state;
+ tdid->lastnode = tdis->lastnode;
+
+ memcpy(tdid->ti.path, tdis->ti.path, sizeof tdid->ti.path[0] * depth);
+
+ return iter_copy;
+}
+
val tree_reset(val iter, val tree)
{
val self = lit("tree-reset");
@@ -908,6 +929,7 @@ void tree_init(void)
reg_fun(intern(lit("tree-root"), user_package), func_n1(tree_root));
reg_fun(intern(lit("tree-begin"), user_package), func_n1(tree_begin));
reg_fun(intern(lit("tree-begin-at"), user_package), func_n2(tree_begin_at));
+ reg_fun(intern(lit("copy-tree-iter"), user_package), func_n1(copy_tree_iter));
reg_fun(intern(lit("tree-reset"), user_package), func_n2(tree_reset));
reg_fun(intern(lit("tree-reset-at"), user_package), func_n3(tree_reset_at));
reg_fun(intern(lit("tree-next"), user_package), func_n1(tree_next));