/* * Copyright (c) Camden Dixie O'Brien * SPDX-License-Identifier: AGPL-3.0-only */ #ifndef PARSE_H #define PARSE_H #include typedef struct { bool negated; int count, capacity; char *contents; } parse_class_t; typedef enum { PARSE_QUANTIFIER_NONE, PARSE_QUANTIFIER_STAR, PARSE_QUANTIFIER_PLUS, PARSE_QUANTIFIER_QMARK, } parse_quantifier_t; typedef enum { PARSE_TERM_WILDCARD, PARSE_TERM_CLASS, PARSE_TERM_LITERAL, PARSE_TERM_SUBEXPR, PARSE_TERM_EMPTY, } parse_term_type_t; struct _parse_term; typedef struct { int count, capacity; struct _parse_term *contents; } parse_sequence_t; typedef struct { int count, capacity; parse_sequence_t *contents; } parse_tree_t; typedef struct _parse_term { parse_quantifier_t quantifier; parse_term_type_t type; union { parse_class_t class; char literal; parse_tree_t subexpr; }; } parse_term_t; int parse_expr(const char *input, int rem, parse_tree_t *out); 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