MINOR: pattern: make the delete and prune functions more generic
Now we have a single prune() function to act on an expression, and one
delete function for the lists and one for the trees. The presence of a
pointer in the lists is enough to warrant a free, and we rely on the
PAT_SF_REGFREE flag to decide whether to free using free() or regfree().
diff --git a/src/http_acl.c b/src/http_acl.c
index a81fb03..d4a0e46 100644
--- a/src/http_acl.c
+++ b/src/http_acl.c
@@ -121,8 +121,8 @@
* and match method are related to the corresponding fetch methods. This
* is very particular ACL declaration mode.
*/
- { "http_auth_group", NULL, PAT_MATCH_STR, NULL, pat_idx_list_str, pat_del_list_ptr, NULL, pat_match_auth },
- { "method", NULL, PAT_MATCH_STR, pat_parse_meth, pat_idx_list_str, pat_del_list_ptr, NULL, pat_match_meth },
+ { "http_auth_group", NULL, PAT_MATCH_STR, NULL, pat_idx_list_str, pat_del_list_gen, NULL, pat_match_auth },
+ { "method", NULL, PAT_MATCH_STR, pat_parse_meth, pat_idx_list_str, pat_del_list_gen, NULL, pat_match_meth },
{ "path", "path", PAT_MATCH_STR },
{ "path_beg", "path", PAT_MATCH_BEG },
diff --git a/src/pattern.c b/src/pattern.c
index 5c83a5c..faf23ef 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -80,37 +80,37 @@
};
void (*pat_delete_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pat_ref_elt *) = {
- [PAT_MATCH_FOUND] = pat_del_list_val,
- [PAT_MATCH_BOOL] = pat_del_list_val,
- [PAT_MATCH_INT] = pat_del_list_val,
+ [PAT_MATCH_FOUND] = pat_del_list_gen,
+ [PAT_MATCH_BOOL] = pat_del_list_gen,
+ [PAT_MATCH_INT] = pat_del_list_gen,
[PAT_MATCH_IP] = pat_del_tree_ip,
- [PAT_MATCH_BIN] = pat_del_list_ptr,
- [PAT_MATCH_LEN] = pat_del_list_val,
+ [PAT_MATCH_BIN] = pat_del_list_gen,
+ [PAT_MATCH_LEN] = pat_del_list_gen,
[PAT_MATCH_STR] = pat_del_tree_str,
[PAT_MATCH_BEG] = pat_del_tree_str,
- [PAT_MATCH_SUB] = pat_del_list_ptr,
- [PAT_MATCH_DIR] = pat_del_list_ptr,
- [PAT_MATCH_DOM] = pat_del_list_ptr,
- [PAT_MATCH_END] = pat_del_list_ptr,
- [PAT_MATCH_REG] = pat_del_list_reg,
- [PAT_MATCH_REGM] = pat_del_list_reg,
+ [PAT_MATCH_SUB] = pat_del_list_gen,
+ [PAT_MATCH_DIR] = pat_del_list_gen,
+ [PAT_MATCH_DOM] = pat_del_list_gen,
+ [PAT_MATCH_END] = pat_del_list_gen,
+ [PAT_MATCH_REG] = pat_del_list_gen,
+ [PAT_MATCH_REGM] = pat_del_list_gen,
};
void (*pat_prune_fcts[PAT_MATCH_NUM])(struct pattern_expr *) = {
- [PAT_MATCH_FOUND] = pat_prune_val,
- [PAT_MATCH_BOOL] = pat_prune_val,
- [PAT_MATCH_INT] = pat_prune_val,
- [PAT_MATCH_IP] = pat_prune_val,
- [PAT_MATCH_BIN] = pat_prune_ptr,
- [PAT_MATCH_LEN] = pat_prune_val,
- [PAT_MATCH_STR] = pat_prune_ptr,
- [PAT_MATCH_BEG] = pat_prune_ptr,
- [PAT_MATCH_SUB] = pat_prune_ptr,
- [PAT_MATCH_DIR] = pat_prune_ptr,
- [PAT_MATCH_DOM] = pat_prune_ptr,
- [PAT_MATCH_END] = pat_prune_ptr,
- [PAT_MATCH_REG] = pat_prune_reg,
- [PAT_MATCH_REGM] = pat_prune_reg,
+ [PAT_MATCH_FOUND] = pat_prune_gen,
+ [PAT_MATCH_BOOL] = pat_prune_gen,
+ [PAT_MATCH_INT] = pat_prune_gen,
+ [PAT_MATCH_IP] = pat_prune_gen,
+ [PAT_MATCH_BIN] = pat_prune_gen,
+ [PAT_MATCH_LEN] = pat_prune_gen,
+ [PAT_MATCH_STR] = pat_prune_gen,
+ [PAT_MATCH_BEG] = pat_prune_gen,
+ [PAT_MATCH_SUB] = pat_prune_gen,
+ [PAT_MATCH_DIR] = pat_prune_gen,
+ [PAT_MATCH_DOM] = pat_prune_gen,
+ [PAT_MATCH_END] = pat_prune_gen,
+ [PAT_MATCH_REG] = pat_prune_gen,
+ [PAT_MATCH_REGM] = pat_prune_gen,
};
struct pattern *(*pat_match_fcts[PAT_MATCH_NUM])(struct sample *, struct pattern_expr *, int) = {
@@ -1088,12 +1088,16 @@
}
}
-void pat_prune_val(struct pattern_expr *expr)
+void pat_prune_gen(struct pattern_expr *expr)
{
struct pattern_list *pat, *tmp;
list_for_each_entry_safe(pat, tmp, &expr->patterns, list) {
LIST_DEL(&pat->list);
+ if (pat->pat.sflags & PAT_SF_REGFREE)
+ regex_free(pat->pat.ptr.ptr);
+ else
+ free(pat->pat.ptr.ptr);
free(pat->pat.data);
free(pat);
}
@@ -1104,40 +1108,6 @@
expr->ref->revision = rdtsc();
}
-void pat_prune_ptr(struct pattern_expr *expr)
-{
- struct pattern_list *pat, *tmp;
-
- list_for_each_entry_safe(pat, tmp, &expr->patterns, list) {
- LIST_DEL(&pat->list);
- free(pat->pat.ptr.ptr);
- free(pat->pat.data);
- free(pat);
- }
-
- free_pattern_tree(&expr->pattern_tree);
- free_pattern_tree(&expr->pattern_tree_2);
- LIST_INIT(&expr->patterns);
- expr->ref->revision = rdtsc();
-}
-
-void pat_prune_reg(struct pattern_expr *expr)
-{
- struct pattern_list *pat, *tmp;
-
- list_for_each_entry_safe(pat, tmp, &expr->patterns, list) {
- LIST_DEL(&pat->list);
- regex_free(pat->pat.ptr.ptr);
- free(pat->pat.data);
- free(pat);
- }
-
- free_pattern_tree(&expr->pattern_tree);
- free_pattern_tree(&expr->pattern_tree_2);
- LIST_INIT(&expr->patterns);
- expr->ref->revision = rdtsc();
-}
-
/*
*
* The following functions are used for the pattern indexation
@@ -1418,7 +1388,7 @@
return 1;
}
-void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref)
+void pat_del_list_gen(struct pattern_expr *expr, struct pat_ref_elt *ref)
{
struct pattern_list *pat;
struct pattern_list *safe;
@@ -1430,6 +1400,10 @@
/* Delete and free entry. */
LIST_DEL(&pat->list);
+ if (pat->pat.sflags & PAT_SF_REGFREE)
+ regex_free(pat->pat.ptr.reg);
+ else
+ free(pat->pat.ptr.ptr);
free(pat->pat.data);
free(pat);
}
@@ -1459,7 +1433,7 @@
}
/* Browse each node of the list for IPv4 addresses. */
- pat_del_list_val(expr, ref);
+ pat_del_list_gen(expr, ref);
/* browse each node of the tree for IPv6 addresses. */
for (node = ebmb_first(&expr->pattern_tree_2), next_node = node ? ebmb_next(node) : NULL;
@@ -1480,25 +1454,6 @@
expr->ref->revision = rdtsc();
}
-void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref)
-{
- struct pattern_list *pat;
- struct pattern_list *safe;
-
- list_for_each_entry_safe(pat, safe, &expr->patterns, list) {
- /* Check equality. */
- if (pat->pat.ref != ref)
- continue;
-
- /* Delete and free entry. */
- LIST_DEL(&pat->list);
- free(pat->pat.ptr.ptr);
- free(pat->pat.data);
- free(pat);
- }
- expr->ref->revision = rdtsc();
-}
-
void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref)
{
struct ebmb_node *node, *next_node;
@@ -1506,7 +1461,7 @@
/* If the flag PAT_F_IGNORE_CASE is set, we cannot use trees */
if (expr->mflags & PAT_MF_IGNORE_CASE)
- return pat_del_list_ptr(expr, ref);
+ return pat_del_list_gen(expr, ref);
/* browse each node of the tree. */
for (node = ebmb_first(&expr->pattern_tree), next_node = node ? ebmb_next(node) : NULL;
@@ -1527,25 +1482,6 @@
expr->ref->revision = rdtsc();
}
-void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref)
-{
- struct pattern_list *pat;
- struct pattern_list *safe;
-
- list_for_each_entry_safe(pat, safe, &expr->patterns, list) {
- /* Check equality. */
- if (pat->pat.ref != ref)
- continue;
-
- /* Delete and free entry. */
- LIST_DEL(&pat->list);
- regex_free(pat->pat.ptr.ptr);
- free(pat->pat.data);
- free(pat);
- }
- expr->ref->revision = rdtsc();
-}
-
void pattern_init_expr(struct pattern_expr *expr)
{
LIST_INIT(&expr->patterns);