X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Ffilter.h;h=db8e4573f1755f9d9a64a0ee19037391603872c3;hb=929bb1ca2452a5bc7410896fd4e5eea44901a0b7;hp=f532d1a97f7c20d9cf5c31ce5a096bf8175a3f6d;hpb=9b993811fe1fd208afd954e86c0bfc81a78af04f;p=apps%2Fpfixtools.git diff --git a/postlicyd/filter.h b/postlicyd/filter.h index f532d1a..db8e457 100644 --- a/postlicyd/filter.h +++ b/postlicyd/filter.h @@ -39,27 +39,37 @@ #include "common.h" #include "filter_tokens.h" #include "query.h" +#include "array.h" typedef filter_token filter_type_t; typedef struct filter_hook_t { - const char *name; - const char *value; + char *name; + char *value; + + bool postfix; + int filter_id; } filter_hook_t; +ARRAY(filter_hook_t) typedef struct filter_params_t { - const char *name; - const char *value; + char *name; + char *value; } filter_params_t; +ARRAY(filter_params_t) typedef struct filter_t { char *name; filter_type_t type; - filter_hook_t *hooks; - filter_params_t *params; + A(filter_hook_t) hooks; void *data; + + A(filter_params_t) params; } filter_t; +ARRAY(filter_t) + +#define FILTER_INIT { NULL, FTK_UNKNOWN, ARRAY_INIT, NULL, ARRAY_INIT } typedef const char *filter_result_t; typedef filter_result_t (*filter_runner_t)(const filter_t *filter, @@ -71,8 +81,15 @@ __attribute__((nonnull(1,4))) void filter_register(const char *type, filter_constructor_t constructor, filter_destructor_t destructor, filter_runner_t runner); +__attribute__((nonnull(1))) +static inline void filter_init(filter_t *filter) +{ + const filter_t f = FILTER_INIT; + *filter = f; +} + __attribute__((nonnull(1,2))) -bool filter_set_name(filter_t *filter, const char *name, ssize_t len); +void filter_set_name(filter_t *filter, const char *name, ssize_t len); __attribute__((nonnull(1,2))) bool filter_set_type(filter_t *filter, const char *type, ssize_t len); @@ -88,6 +105,44 @@ bool filter_add_hook(filter_t *filter, const char *name, ssize_t name_len, __attribute__((nonnull(1))) bool filter_build(filter_t *filter); +__attribute__((nonnull(1,2))) +static inline int filter_find_with_name(A(filter_t) *array, const char *name) +{ + int start = 0; + int end = array->len; + + while (start < end) { + int mid = (start + end) / 2; + int cmp = strcmp(name, array_elt(*array, mid).name); + + if (cmp == 0) { + return mid; + } else if (cmp < 0) { + end = mid; + } else { + start = mid + 1; + } + } + return -1; +} + +__attribute__((nonnull(1,2))) +bool filter_update_references(filter_t *filter, A(filter_t) *array); + +__attribute__((nonnull(1))) +static inline void filter_hook_wipe(filter_hook_t *hook) +{ + p_delete(&hook->name); + p_delete(&hook->value); +} + +__attribute__((nonnull(1))) +static inline void filter_params_wipe(filter_params_t *param) +{ + p_delete(¶m->name); + p_delete(¶m->value); +} + __attribute__((nonnull(1))) void filter_wipe(filter_t *filter);