From 85dbd20869d003f3429954a818d6bfb23e91684d Mon Sep 17 00:00:00 2001 From: Cas Cremers Date: Mon, 22 Oct 2018 03:24:47 +0200 Subject: [PATCH] Stateful version of term leaves iterator. --- src/TODO-trampolines.txt | 4 ++++ src/term.c | 31 +++++++++++++++++++++++++++++++ src/term.h | 3 +++ 3 files changed, 38 insertions(+) diff --git a/src/TODO-trampolines.txt b/src/TODO-trampolines.txt index f2a5966..d99e6cd 100644 --- a/src/TODO-trampolines.txt +++ b/src/TODO-trampolines.txt @@ -9,3 +9,7 @@ term_iterate_deVar term_iterate_state_deVar + +term_iterate_leaves + term_iterate_state_leaves + diff --git a/src/term.c b/src/term.c index e5984ec..96e8684 100644 --- a/src/term.c +++ b/src/term.c @@ -1179,6 +1179,37 @@ term_iterate_state_deVar (Term term, int (*leaf) (Term t, void (*st)), return true; } +//! Iterate over the leaves in a term, stateful +/** + * Note that this function iterates over real leaves; thus closed variables can occur as + * well. It is up to func to decide wether or not to recurse. + */ +int +term_iterate_state_leaves (const Term term, int (*func) (Term t, void (*st)), + void (*state)) +{ + if (term != NULL) + { + if (realTermLeaf (term)) + { + if (!func (term, state)) + return 0; + } + else + { + if (realTermTuple (term)) + return (term_iterate_state_leaves (TermOp1 (term), func, state) + && term_iterate_state_leaves (TermOp2 (term), func, + state)); + else + return (term_iterate_state_leaves (TermOp (term), func, state) + && term_iterate_state_leaves (TermKey (term), func, + state)); + } + } + return 1; +} + //! Iterate over the leaves in a term /** * Note that this function iterates over real leaves; thus closed variables can occur as diff --git a/src/term.h b/src/term.h index 6bdab1c..49935de 100644 --- a/src/term.h +++ b/src/term.h @@ -203,6 +203,9 @@ int term_iterate_state_deVar (Term term, int (*leaf) (Term t, void (*st)), int (*noder) (Term t, void (*st)), void (*state)); int term_iterate_leaves (const Term t, int (*func) (Term t)); +int term_iterate_state_leaves (const Term term, + int (*func) (Term t, void (*st)), + void (*state)); int term_iterate_open_leaves (const Term term, int (*func) (Term t)); void term_rolelocals_are_variables (); int term_encryption_level (const Term term);