return ret;
}
-
-tree_t* tree_walk(tree_t* tree, tree_walker_t* walker)
+void tree_walk(tree_t* tree, tree_walker_t* walker)
{
size_t idx;
- tree_t* new_node;
- new_node = walker->fn(walker->env, tree, PRE_NODE);
+ walker->fn(walker->env, tree, PRE_NODE);
if (tree->tag == TREE) {
walker->fn(walker->env, tree, PRE_CHILDREN);
for (idx = 0; idx < vec_size(tree->ptr.vec); idx++) {
- tree_t* child = vec_at(tree->ptr.vec, idx);
+ tree_t* child = (tree_t*)vec_at(tree->ptr.vec, idx);
walker->fn(walker->env, tree, PRE_CHILD);
- tree_t* new_child = tree_walk( child, walker );
+ tree_walk( child, walker );
walker->fn(walker->env, tree, POST_CHILD);
- if ((NULL != new_node) && (new_node->tag == TREE) && (NULL != new_child)) {
- vec_push_back(new_node->ptr.vec, new_child);
- }
}
walker->fn(walker->env, tree, POST_CHILDREN);
}
- return new_node;
+ walker->fn(walker->env, tree, POST_NODE);
}
tree_walker_t* tree_walker(void* env, tree_walk_fn_t fn)
#include "vec.h"
#include "lexer.h"
-typedef enum { ATOM, TREE } tree_tag_t;
+typedef enum {
+ ATOM,
+ TREE
+} tree_tag_t;
typedef struct {
tree_tag_t tag;
void* tree_get_val(tree_t* p_tree);
void* tree_get_child_val(tree_t* p_tree, size_t idx);
bool tree_is_formtype(tree_t* p_tree, const char* val);
-tree_t* tree_walk(tree_t* tree, tree_walker_t* walker);
+void tree_walk(tree_t* tree, tree_walker_t* walker);
tree_walker_t* tree_walker(void* env, tree_walk_fn_t fn);
#endif /* TREE_H */