Add a pattern struct to encompass a pattern NFA and its size.

The size is necessary in free operations - unlike vectors and linked
lists, sparse sets in libds are not dynamically resizable.
This commit is contained in:
Danila Fedorin 2017-01-21 21:18:09 -08:00
parent fbba562eb7
commit 19ca43d8e4

View File

@ -149,23 +149,39 @@ struct pattern_chain_s {
struct pattern_node_s* tail; struct pattern_node_s* tail;
}; };
/**
* Represents a single compiled pattern.
*/
struct pattern_s {
/**
* The first NFA state of the pattern.
*/
struct pattern_node_s* head;
/**
* The number of NFA nodes in this pattern.
*/
int size;
};
typedef enum pattern_node_type_e pattern_node_type; typedef enum pattern_node_type_e pattern_node_type;
typedef struct pattern_node_s pattern_node; typedef struct pattern_node_s pattern_node;
typedef struct pattern_chain_s pattern_chain; typedef struct pattern_chain_s pattern_chain;
typedef struct pattern_s pattern;
/** /**
* Compiles a string representation of a pattern into a pattern NFA, * Compiles a string representation of a pattern into a pattern NFA,
* and stores the first node of the new NFA in root. * and stores the first node of the new NFA in root.
* @param root the node to store the resulting pattern into. * @param root the node to store the resulting pattern into.
* @param expression the pattern represented as a string. * @param expression the pattern represented as a string.
* @param id the id of the pattern.
* @return LIBLEX_SUCCESS if all goes well, otherwise some other liblex_result. * @return LIBLEX_SUCCESS if all goes well, otherwise some other liblex_result.
*/ */
liblex_result pattern_compile(pattern_node** root, char* expression); liblex_result pattern_compile(pattern* ptrn, char* expression, int id);
/** /**
* Frees a pattern NFA allocated by pattern_compile. * Frees a pattern NFA allocated by pattern_compile.
* @param root the root node to start freeing from. * @param root the root node to start freeing from.
* @return LIBLEX_SUCCESS if all goes well, otherwise some other liblex_result. * @return LIBLEX_SUCCESS if all goes well, otherwise some other liblex_result.
*/ */
liblex_result pattern_free(pattern_node* root); liblex_result pattern_free(pattern* ptrn);
#endif #endif