/* finds the pattern holding <list> from list head <head> and deletes it.
* This is made for use for pattern removal within an expression.
*/
-static void pat_unlink_from_head(struct list *head, struct list *list)
+static void pat_unlink_from_head(void **head, void **list)
{
- struct list *next;
-
- next = head->n;
- while (next != head) {
- if (next == list) {
- LIST_DEL(list);
+ while (*head) {
+ if (*head == list) {
+ *head = *list;
return;
}
- next = next->n;
+ head = *head;
}
}
/* chain pattern in the expression */
LIST_ADDQ(&expr->patterns, &patl->list);
/* and from the reference */
- LIST_ADDQ(&pat->ref->list_head, &patl->from_ref);
+ patl->from_ref = pat->ref->list_head;
+ pat->ref->list_head = &patl->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* chain pattern in the expression */
LIST_ADDQ(&expr->patterns, &patl->list);
/* and from the reference */
- LIST_ADDQ(&pat->ref->list_head, &patl->from_ref);
+ patl->from_ref = pat->ref->list_head;
+ pat->ref->list_head = &patl->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* chain pattern in the expression */
LIST_ADDQ(&expr->patterns, &patl->list);
/* and from the reference */
- LIST_ADDQ(&pat->ref->list_head, &patl->from_ref);
+ patl->from_ref = pat->ref->list_head;
+ pat->ref->list_head = &patl->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* chain pattern in the expression */
LIST_ADDQ(&expr->patterns, &patl->list);
/* and from the reference */
- LIST_ADDQ(&pat->ref->list_head, &patl->from_ref);
+ patl->from_ref = pat->ref->list_head;
+ pat->ref->list_head = &patl->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* Insert the entry. */
ebmb_insert_prefix(&expr->pattern_tree, &node->node, 4);
- LIST_ADDQ(&pat->ref->tree_head, &node->from_ref);
+ node->from_ref = pat->ref->tree_head;
+ pat->ref->tree_head = &node->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* Insert the entry. */
ebmb_insert_prefix(&expr->pattern_tree_2, &node->node, 16);
- LIST_ADDQ(&pat->ref->tree_head, &node->from_ref);
+ node->from_ref = pat->ref->tree_head;
+ pat->ref->tree_head = &node->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* index the new node */
ebst_insert(&expr->pattern_tree, &node->node);
- LIST_ADDQ(&pat->ref->tree_head, &node->from_ref);
+ node->from_ref = pat->ref->tree_head;
+ pat->ref->tree_head = &node->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
/* index the new node */
ebmb_insert_prefix(&expr->pattern_tree, &node->node, len);
- LIST_ADDQ(&pat->ref->tree_head, &node->from_ref);
+ node->from_ref = pat->ref->tree_head;
+ pat->ref->tree_head = &node->from_ref;
expr->ref->revision = rdtsc();
/* that's ok */
*/
void pat_delete_gen(struct pat_ref *ref, struct pat_ref_elt *elt)
{
- struct pattern_tree *tree, *tree_bck;
- struct pattern_list *pat, *pat_bck;
+ struct pattern_tree *tree;
+ struct pattern_list *pat;
+ void **node;
/* delete all known tree nodes. They are all allocated inline */
- list_for_each_entry_safe(tree, tree_bck, &elt->tree_head, from_ref) {
+ for (node = elt->tree_head; node;) {
+ tree = container_of(node, struct pattern_tree, from_ref);
+ node = *node;
BUG_ON(tree->ref != elt);
ebmb_delete(&tree->node);
- LIST_DEL(&tree->from_ref);
free(tree->data);
free(tree);
}
/* delete all list nodes and free their pattern entries (str/reg) */
- list_for_each_entry_safe(pat, pat_bck, &elt->list_head, from_ref) {
- /* Check equality. */
+ for (node = elt->list_head; node;) {
+ pat = container_of(node, struct pattern_list, from_ref);
+ node = *node;
BUG_ON(pat->pat.ref != elt);
/* Delete and free entry. */
LIST_DEL(&pat->list);
- LIST_DEL(&pat->from_ref);
if (pat->pat.sflags & PAT_SF_REGFREE)
regex_free(pat->pat.ptr.reg);
else
/* update revision number to refresh the cache */
ref->revision = rdtsc();
+ elt->tree_head = NULL;
+ elt->list_head = NULL;
}
void pattern_init_expr(struct pattern_expr *expr)
}
LIST_INIT(&elt->back_refs);
- LIST_INIT(&elt->list_head);
- LIST_INIT(&elt->tree_head);
+ elt->list_head = NULL;
+ elt->tree_head = NULL;
LIST_ADDQ(&ref->head, &elt->list);
return elt;
fail: