Skip to content

Commit a131c54

Browse files
committed
MINOR: pattern: add pat_ref_gen_find_elt() function
pat_ref_gen_find_elt(ref, gen_id, key) tries to find <elt> element belonging to <gen_id> and matching <key> in <ref> reference. The goal is to be able to target a single subset from <ref>
1 parent c9d6af3 commit a131c54

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

include/haproxy/pattern.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ struct pat_ref *pat_ref_lookupid(int unique_id);
184184
struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
185185
struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
186186
struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
187+
struct pat_ref_elt *pat_ref_gen_find_elt(struct pat_ref *ref, unsigned int gen_id, const char *key);
187188
struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line);
188189
struct pat_ref_elt *pat_ref_load(struct pat_ref *ref, unsigned int gen, const char *pattern, const char *sample, int line, char **err);
189190
int pat_ref_push(struct pat_ref_elt *elt, struct pattern_expr *expr, int patflags, char **err);

src/pattern.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1636,6 +1636,28 @@ int pat_ref_delete(struct pat_ref *ref, const char *key)
16361636
return found;
16371637
}
16381638

1639+
/*
1640+
* find and return an element <elt> belonging to <gen_id> and matching <key> in a
1641+
* reference <ref> return NULL if not found
1642+
*/
1643+
struct pat_ref_elt *pat_ref_gen_find_elt(struct pat_ref *ref, unsigned int gen_id, const char *key)
1644+
{
1645+
struct ebmb_node *node;
1646+
struct pat_ref_elt *elt;
1647+
1648+
node = ebst_lookup(&ref->ebmb_root, key);
1649+
while (node) {
1650+
elt = ebmb_entry(node, struct pat_ref_elt, node);
1651+
if (elt->gen_id == gen_id)
1652+
break;
1653+
node = ebmb_next_dup(node);
1654+
}
1655+
if (node)
1656+
return ebmb_entry(node, struct pat_ref_elt, node);
1657+
1658+
return NULL;
1659+
}
1660+
16391661
/*
16401662
* find and return an element <elt> matching <key> in a reference <ref>
16411663
* return NULL if not found

0 commit comments

Comments
 (0)