Expose parse tree free procedures
This commit is contained in:
24
lib/parse.c
24
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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user