diff --git a/lib/parse.c b/lib/parse.c index 36ec3cf..3925af9 100644 --- a/lib/parse.c +++ b/lib/parse.c @@ -219,22 +219,25 @@ int parse_expr(const char *input, int rem, parse_tree_t *out) return used; } -static void class_free(parse_class_t *c) +void parse_free_tree_children(const parse_tree_t *t) { - if (NULL != c->contents) - free(c->contents); + if (NULL != t->alternatives) { + for (int i = 0; i < t->count; ++i) + parse_free_sequence_children(&t->alternatives[i]); + free(t->alternatives); + } } -static void sequence_free(parse_sequence_t *s) +void parse_free_sequence_children(const parse_sequence_t *s) { if (NULL != s->contents) { for (int i = 0; i < s->len; ++i) { switch (s->contents[i].type) { case PARSE_TERM_CLASS: - class_free(&s->contents[i].class); + parse_free_class_children(&s->contents[i].class); break; case PARSE_TERM_SUBEXPR: - parse_tree_free_children(&s->contents[i].subexpr); + parse_free_tree_children(&s->contents[i].subexpr); break; case PARSE_TERM_WILDCARD: case PARSE_TERM_LITERAL: @@ -245,11 +248,8 @@ static void sequence_free(parse_sequence_t *s) } } -void parse_tree_free_children(parse_tree_t *t) +void parse_free_class_children(const parse_class_t *c) { - if (NULL != t->alternatives) { - for (int i = 0; i < t->count; ++i) - sequence_free(&t->alternatives[i]); - free(t->alternatives); - } + if (NULL != c->contents) + free(c->contents); } diff --git a/lib/parse.h b/lib/parse.h index 04c9bc3..31ba184 100644 --- a/lib/parse.h +++ b/lib/parse.h @@ -50,6 +50,9 @@ typedef struct _parse_term { } parse_term_t; int parse_expr(const char *input, int rem, parse_tree_t *out); -void parse_tree_free_children(parse_tree_t *t); + +void parse_free_tree_children(const parse_tree_t *t); +void parse_free_sequence_children(const parse_sequence_t *s); +void parse_free_class_children(const parse_class_t *c); #endif diff --git a/tests/parse_tests.c b/tests/parse_tests.c index c86ec56..528a9a1 100644 --- a/tests/parse_tests.c +++ b/tests/parse_tests.c @@ -14,7 +14,7 @@ static void a_has_1_alternative(void) const int result = PARSE_EXPR_STRING("a", &t); ASSERT_NE(-1, result); ASSERT_EQ(1, t.count); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_pipe_b_has_2_alternatives(void) @@ -23,7 +23,7 @@ static void a_pipe_b_has_2_alternatives(void) const int result = PARSE_EXPR_STRING("a|b", &t); ASSERT_NE(-1, result); ASSERT_EQ(2, t.count); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_pipe_b_pipe_c_has_3_alternatives(void) @@ -32,7 +32,7 @@ static void a_pipe_b_pipe_c_has_3_alternatives(void) const int result = PARSE_EXPR_STRING("a|b|c", &t); ASSERT_NE(-1, result); ASSERT_EQ(3, t.count); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_is_parsed_as_unquantified_literal(void) @@ -49,7 +49,7 @@ static void a_is_parsed_as_unquantified_literal(void) ASSERT_EQ(PARSE_TERM_LITERAL, t.alternatives[0].contents[0].type); ASSERT_EQ('a', t.alternatives[0].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void b_is_parsed_as_unquantified_literal(void) @@ -66,7 +66,7 @@ static void b_is_parsed_as_unquantified_literal(void) ASSERT_EQ(PARSE_TERM_LITERAL, t.alternatives[0].contents[0].type); ASSERT_EQ('b', t.alternatives[0].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void abc_is_parsed_as_sequence_of_unquantified_literals(void) @@ -91,7 +91,7 @@ static void abc_is_parsed_as_sequence_of_unquantified_literals(void) ASSERT_EQ(PARSE_TERM_LITERAL, t.alternatives[0].contents[2].type); ASSERT_EQ('c', t.alternatives[0].contents[2].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void dot_is_parsed_as_unquantified_wildcard_term(void) @@ -107,7 +107,7 @@ static void dot_is_parsed_as_unquantified_wildcard_term(void) PARSE_QUANTIFIER_NONE, t.alternatives[0].contents[0].quantifier); ASSERT_EQ(PARSE_TERM_WILDCARD, t.alternatives[0].contents[0].type); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void backslash_dot_is_parsed_as_unquantified_literal(void) @@ -124,7 +124,7 @@ static void backslash_dot_is_parsed_as_unquantified_literal(void) ASSERT_EQ(PARSE_TERM_LITERAL, t.alternatives[0].contents[0].type); ASSERT_EQ('.', t.alternatives[0].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void backslash_backslash_is_parsed_as_unquantified_literal(void) @@ -141,7 +141,7 @@ static void backslash_backslash_is_parsed_as_unquantified_literal(void) ASSERT_EQ(PARSE_TERM_LITERAL, t.alternatives[0].contents[0].type); ASSERT_EQ('\\', t.alternatives[0].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_pipe_b_in_parens_is_parsed_as_subexpr_term(void) @@ -174,7 +174,7 @@ static void a_pipe_b_in_parens_is_parsed_as_subexpr_term(void) ASSERT_EQ(PARSE_TERM_LITERAL, inner->alternatives[1].contents[0].type); ASSERT_EQ('b', inner->alternatives[1].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_in_parens_b_is_parsed_as_sequence_with_subexpr_term(void) @@ -202,7 +202,7 @@ static void a_in_parens_b_is_parsed_as_sequence_with_subexpr_term(void) ASSERT_EQ(PARSE_TERM_LITERAL, inner->alternatives[0].contents[0].type); ASSERT_EQ('a', inner->alternatives[0].contents[0].literal); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void dot_star_is_parsed_as_star_quantified_wildcard(void) @@ -218,7 +218,7 @@ static void dot_star_is_parsed_as_star_quantified_wildcard(void) PARSE_QUANTIFIER_STAR, t.alternatives[0].contents[0].quantifier); ASSERT_EQ(PARSE_TERM_WILDCARD, t.alternatives[0].contents[0].type); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void dot_plus_is_parsed_as_plus_quantified_wildcard(void) @@ -234,7 +234,7 @@ static void dot_plus_is_parsed_as_plus_quantified_wildcard(void) PARSE_QUANTIFIER_PLUS, t.alternatives[0].contents[0].quantifier); ASSERT_EQ(PARSE_TERM_WILDCARD, t.alternatives[0].contents[0].type); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void dot_question_mark_is_parsed_as_qmrk_quantified_wildcard(void) @@ -250,7 +250,7 @@ static void dot_question_mark_is_parsed_as_qmrk_quantified_wildcard(void) PARSE_QUANTIFIER_QMRK, t.alternatives[0].contents[0].quantifier); ASSERT_EQ(PARSE_TERM_WILDCARD, t.alternatives[0].contents[0].type); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void a_in_brackets_is_parsed_as_class_containing_only_a(void) @@ -270,7 +270,7 @@ static void a_in_brackets_is_parsed_as_class_containing_only_a(void) ASSERT_NOT_NULL(t.alternatives[0].contents[0].class.contents); ASSERT_EQ('a', t.alternatives[0].contents[0].class.contents[0]); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } static void caret_a_in_brackets_parses_as_negated_class(void) @@ -290,7 +290,7 @@ static void caret_a_in_brackets_parses_as_negated_class(void) ASSERT_NOT_NULL(t.alternatives[0].contents[0].class.contents); ASSERT_EQ('a', t.alternatives[0].contents[0].class.contents[0]); - parse_tree_free_children(&t); + parse_free_tree_children(&t); } int main(void)