void yr_re_node_destroy( RE_NODE* node) { if (node->left != NULL) yr_re_node_destroy(node->left); if (node->right != NULL) yr_re_node_destroy(node->right); if (node->type == RE_NODE_CLASS) yr_free(node->class_vector); yr_free(node); }
int yr_re_split_at_chaining_point( RE* re, RE** result_re, RE** remainder_re, int32_t* min_gap, int32_t* max_gap) { RE_NODE* node = re->root_node; RE_NODE* child = re->root_node->left; RE_NODE* parent = NULL; int result; *result_re = re; *remainder_re = NULL; *min_gap = 0; *max_gap = 0; while (child != NULL && child->type == RE_NODE_CONCAT) { if (child->right != NULL && child->right->type == RE_NODE_RANGE && child->right->greedy == FALSE && child->right->left->type == RE_NODE_ANY && (child->right->start > STRING_CHAINING_THRESHOLD || child->right->end > STRING_CHAINING_THRESHOLD)) { result = yr_re_create(remainder_re); if (result != ERROR_SUCCESS) return result; (*remainder_re)->root_node = child->left; (*remainder_re)->flags = re->flags; child->left = NULL; if (parent != NULL) parent->left = node->right; else (*result_re)->root_node = node->right; node->right = NULL; *min_gap = child->right->start; *max_gap = child->right->end; yr_re_node_destroy(node); return ERROR_SUCCESS; } parent = node; node = child; child = child->left; } return ERROR_SUCCESS; }
void yr_re_destroy( RE* re) { if (re->root_node != NULL) yr_re_node_destroy(re->root_node); if (re->error_message != NULL) yr_free((char*) re->error_message); yr_free(re); }
void yr_re_destroy( RE* re) { if (re->root_node != NULL) yr_re_node_destroy(re->root_node); if (re->code_arena != NULL) yr_arena_destroy(re->code_arena); yr_free(re); }