From 913cc5882449b5016f4db07edbd8566dc877b389 Mon Sep 17 00:00:00 2001 From: petermlm Date: Tue, 31 May 2016 22:32:24 +0100 Subject: [PATCH] Made traversal free --- examples/tree_traversal.c | 21 ++++++++++++++++++++- mpc.c | 11 +++++++++++ mpc.h | 2 ++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/examples/tree_traversal.c b/examples/tree_traversal.c index 7553cdd..88a5537 100644 --- a/examples/tree_traversal.c +++ b/examples/tree_traversal.c @@ -8,7 +8,7 @@ int main(int argc, char *argv[]) { mpc_ast_t *ast, *tree, *child, *child_sub, *ast_next; mpc_ast_trav_t *trav; mpc_result_t r; - int index, lb; + int index, lb, i; mpca_lang(MPCA_LANG_PREDICTIVE, " node : '(' ',' /foo/ ',' ')' | ;" @@ -79,6 +79,8 @@ int main(int argc, char *argv[]) { ast_next = mpc_ast_traverse_next(&trav); } + mpc_ast_traverse_free(&trav); + printf("Post order tree traversal.\n"); trav = mpc_ast_traverse_start(ast, mpc_ast_trav_order_post); @@ -92,6 +94,23 @@ int main(int argc, char *argv[]) { ast_next = mpc_ast_traverse_next(&trav); } + mpc_ast_traverse_free(&trav); + + printf("Partial traversal.\n"); + + trav = mpc_ast_traverse_start(ast, mpc_ast_trav_order_post); + + ast_next = mpc_ast_traverse_next(&trav); + + for(i=0; i<2 && ast_next != NULL; i++) { + printf("Tag: %s; Contents: %s\n", + ast_next->tag, + ast_next->contents); + ast_next = mpc_ast_traverse_next(&trav); + } + + mpc_ast_traverse_free(&trav); + /* Clean up and return */ mpc_cleanup(3, Node, Leaf, Input); mpc_ast_delete(ast); diff --git a/mpc.c b/mpc.c index 29e78c4..cba873f 100644 --- a/mpc.c +++ b/mpc.c @@ -2933,6 +2933,17 @@ mpc_ast_t *mpc_ast_traverse_next(mpc_ast_trav_t **trav) { return ret; } +void mpc_ast_traverse_free(mpc_ast_trav_t **trav) { + mpc_ast_trav_t *n_trav; + + /* Go through parents until all are free */ + while(*trav != NULL) { + n_trav = (*trav)->parent; + free(*trav); + *trav = n_trav; + } +} + mpc_val_t *mpcf_fold_ast(int n, mpc_val_t **xs) { int i, j; diff --git a/mpc.h b/mpc.h index 1ac123a..5dec3af 100644 --- a/mpc.h +++ b/mpc.h @@ -298,6 +298,8 @@ mpc_ast_trav_t *mpc_ast_traverse_start(mpc_ast_t *ast, mpc_ast_t *mpc_ast_traverse_next(mpc_ast_trav_t **trav); +void mpc_ast_traverse_free(mpc_ast_trav_t **trav); + /* ** Warning: This function currently doesn't test for equality of the `state` member! */