diff options
author | Maria Matejka <mq@ucw.cz> | 2022-07-13 14:14:37 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2022-07-13 14:14:37 +0200 |
commit | 68a2c9d4c91a36c90a768926495f7894324287c5 (patch) | |
tree | 996387a4741746aa1c5cad1d238b886cfe7620d6 /lib/a-path.c | |
parent | af0d5ec2797bab2a928fa8ce2caf81608a3f7443 (diff) | |
parent | 2e5bfeb73ac25e236a24b6c1a88d0f2221ca303f (diff) |
Merge commit '2e5bfeb73ac25e236a24b6c1a88d0f2221ca303f' into thread-next
Diffstat (limited to 'lib/a-path.c')
-rw-r--r-- | lib/a-path.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/lib/a-path.c b/lib/a-path.c index 0eca8475..a7a22e40 100644 --- a/lib/a-path.c +++ b/lib/a-path.c @@ -602,8 +602,10 @@ as_path_match_set(const struct adata *path, const struct f_tree *set) } const struct adata * -as_path_filter(struct linpool *pool, const struct adata *path, const struct f_tree *set, u32 key, int pos) +as_path_filter(struct linpool *pool, const struct adata *path, const struct f_val *set, int pos) { + ASSERT((set->type == T_SET) || (set->type == T_INT)); + if (!path) return NULL; @@ -629,13 +631,13 @@ as_path_filter(struct linpool *pool, const struct adata *path, const struct f_tr u32 as = get_as(p); int match; - if (set) + if (set->type == T_SET) { struct f_val v = { .type = T_INT, .val.i = as}; - match = !!find_tree(set, &v); + match = !!find_tree(set->val.t, &v); } - else - match = (as == key); + else /* T_INT */ + match = (as == set->val.i); if (match == pos) { @@ -667,6 +669,35 @@ as_path_filter(struct linpool *pool, const struct adata *path, const struct f_tr return res; } +int +as_path_walk(const struct adata *path, uint *pos, uint *val) +{ + if (!path) + return 0; + + const u8 *p = path->data; + const u8 *q = p + path->length; + uint n, x = *pos; + + while (p < q) + { + n = p[1]; + p += 2; + + if (x < n) + { + *val = get_as(p + x * BS); + *pos += 1; + return 1; + } + + p += n * BS; + x -= n; + } + + return 0; +} + struct pm_pos { |