Expose parse tree free procedures

This commit is contained in:
2024-10-26 14:59:26 +01:00
parent cdaea7a1ec
commit 2bcdfbcd61
3 changed files with 32 additions and 29 deletions

View File

@@ -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);
}

View File

@@ -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