diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c index 557bc9c6f4cbce68e14dc58ede7b7b020fe88682..32e7eb54c49cba823a3a4ecb298e4e4aee257a69 100644 --- a/src/lib-sieve/sieve-address-parts.c +++ b/src/lib-sieve/sieve-address-parts.c @@ -152,63 +152,27 @@ void sieve_address_parts_link_tags } /* - * Binary context: - * - * FIXME: This code will be duplicated across all extensions that introduce - * a registry of some kind in the binary. + * Binary context */ -struct addrp_binary_context { - ARRAY_DEFINE(addrp_extensions, - const struct sieve_address_part_extension *); -}; - -static inline struct addrp_binary_context * - get_binary_context(struct sieve_binary *sbin) +static inline const struct sieve_address_part_extension * + sieve_address_part_extension_get(struct sieve_binary *sbin, int ext_id) { - return (struct addrp_binary_context *) - sieve_binary_extension_get_context(sbin, ext_my_id); -} - -static const struct sieve_address_part_extension * -sieve_address_part_extension_get - (struct sieve_binary *sbin, int ext_id) -{ - struct addrp_binary_context *ctx = get_binary_context(sbin); - - if ( (ctx != NULL) && (ext_id > 0) && - (ext_id < (int) array_count(&ctx->addrp_extensions)) ) { - const struct sieve_address_part_extension * const *ext; - - ext = array_idx(&ctx->addrp_extensions, (unsigned int) ext_id); - - return *ext; - } - - return NULL; + return (const struct sieve_address_part_extension *) + sieve_binary_registry_get_object(sbin, ext_my_id, ext_id); } void sieve_address_part_extension_set (struct sieve_binary *sbin, int ext_id, const struct sieve_address_part_extension *ext) { - struct addrp_binary_context *ctx = get_binary_context(sbin); - - array_idx_set(&ctx->addrp_extensions, (unsigned int) ext_id, &ext); + sieve_binary_registry_set_object + (sbin, ext_my_id, ext_id, (const void *) ext); } static bool addrp_binary_load(struct sieve_binary *sbin) { - pool_t pool = sieve_binary_pool(sbin); - - struct addrp_binary_context *ctx = - p_new(pool, struct addrp_binary_context, 1); - - /* Setup comparator registry */ - p_array_init(&ctx->addrp_extensions, pool, 4); - - sieve_binary_extension_set_context - (sbin, ext_my_id, ctx); + sieve_binary_registry_init(sbin, ext_my_id); return TRUE; } diff --git a/src/lib-sieve/sieve-binary.c b/src/lib-sieve/sieve-binary.c index bda76c6e98a163c925f0658772f736453517418e..782905cba545af35cd21d41d1d34693a89bd3e4a 100644 --- a/src/lib-sieve/sieve-binary.c +++ b/src/lib-sieve/sieve-binary.c @@ -367,3 +367,54 @@ bool sieve_binary_read_string return TRUE; } +/* Binary registry */ + +struct sieve_binary_registry { + ARRAY_DEFINE(objects, const void *); +}; + +static inline struct sieve_binary_registry * + get_binary_registry(struct sieve_binary *sbin, int ext_id) +{ + return (struct sieve_binary_registry *) + sieve_binary_extension_get_context(sbin, ext_id); +} + +const void *sieve_binary_registry_get_object + (struct sieve_binary *sbin, int ext_id, int id) +{ + struct sieve_binary_registry *reg = get_binary_registry(sbin, ext_id); + + if ( (reg != NULL) && (id > 0) && + (id < (int) array_count(®->objects)) ) { + const void * const *obj; + + obj = array_idx(®->objects, (unsigned int) id); + + return *obj; + } + + return NULL; +} + +void sieve_binary_registry_set_object + (struct sieve_binary *sbin, int ext_id, int id, const void *object) +{ + struct sieve_binary_registry *reg = get_binary_registry(sbin, ext_id); + + array_idx_set(®->objects, (unsigned int) id, &object); +} + +void sieve_binary_registry_init(struct sieve_binary *sbin, int ext_id) +{ + pool_t pool = sieve_binary_pool(sbin); + + struct sieve_binary_registry *reg = + p_new(pool, struct sieve_binary_registry, 1); + + /* Setup match-type registry */ + p_array_init(®->objects, pool, 4); + + sieve_binary_extension_set_context(sbin, ext_id, (void *) reg); +} + diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h index b9818b62a632d5fe260b6ca57fccc214654e5453..dc0bd9dd8a723b3357c6c7c73f12f73ab1f8b04d 100644 --- a/src/lib-sieve/sieve-binary.h +++ b/src/lib-sieve/sieve-binary.h @@ -78,4 +78,14 @@ bool sieve_binary_read_integer bool sieve_binary_read_string (struct sieve_binary *binary, sieve_size_t *address, string_t **str); +/* + * Default registry context (used at various occasions) + */ + +const void *sieve_binary_registry_get_object + (struct sieve_binary *sbin, int ext_id, int id); +void sieve_binary_registry_set_object + (struct sieve_binary *sbin, int ext_id, int id, const void *object); +void sieve_binary_registry_init(struct sieve_binary *sbin, int ext_id); + #endif diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c index 5eecf10bde3d4cdd2f3180408b920dc77e22c466..a85d3bdbabf1753410ef19ce06ec0d9ae8f2eeda 100644 --- a/src/lib-sieve/sieve-comparators.c +++ b/src/lib-sieve/sieve-comparators.c @@ -159,57 +159,27 @@ bool cmp_validator_load(struct sieve_validator *validator) } /* - * Interpreter context: + * Binary context */ -struct cmp_binary_context { - ARRAY_DEFINE(cmp_extensions, - const struct sieve_comparator_extension *); -}; - -static inline struct cmp_binary_context * - get_binary_context(struct sieve_binary *sbin) -{ - return (struct cmp_binary_context *) - sieve_binary_extension_get_context(sbin, ext_my_id); -} - -static const struct sieve_comparator_extension *sieve_comparator_extension_get - (struct sieve_binary *sbin, int ext_id) +static inline const struct sieve_comparator_extension * + sieve_comparator_extension_get(struct sieve_binary *sbin, int ext_id) { - struct cmp_binary_context *ctx = get_binary_context(sbin); - - if ( ext_id > 0 && ext_id < (int) array_count(&ctx->cmp_extensions) ) { - const struct sieve_comparator_extension * const *ext; - - ext = array_idx(&ctx->cmp_extensions, (unsigned int) ext_id); - - return *ext; - } - - return NULL; + return (const struct sieve_comparator_extension *) + sieve_binary_registry_get_object(sbin, ext_my_id, ext_id); } void sieve_comparator_extension_set (struct sieve_binary *sbin, int ext_id, const struct sieve_comparator_extension *ext) { - struct cmp_binary_context *ctx = get_binary_context(sbin); - - array_idx_set(&ctx->cmp_extensions, (unsigned int) ext_id, &ext); + sieve_binary_registry_set_object + (sbin, ext_my_id, ext_id, (const void *) ext); } static bool cmp_binary_load(struct sieve_binary *sbin) { - pool_t pool = sieve_binary_pool(sbin); - - struct cmp_binary_context *ctx = - p_new(pool, struct cmp_binary_context, 1); - - /* Setup comparator registry */ - p_array_init(&ctx->cmp_extensions, pool, 4); - - sieve_binary_extension_set_context(sbin, ext_my_id, ctx); + sieve_binary_registry_init(sbin, ext_my_id); return TRUE; } diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c index 563bc2d91387c93ca65544cfe768cd79b678d5ed..b36eadc061bc71bfdfe6c6c6be9c060a1b1a0dca 100644 --- a/src/lib-sieve/sieve-match-types.c +++ b/src/lib-sieve/sieve-match-types.c @@ -151,61 +151,27 @@ void sieve_match_types_link_tags } /* - * Interpreter context: - * - * FIXME: This code will be duplicated across all extensions that introduce - * a registry of some kind in the binary. + * Binary context */ -struct mtch_binary_context { - ARRAY_DEFINE(mtch_extensions, - const struct sieve_match_type_extension *); -}; - -static inline struct mtch_binary_context * - get_binary_context(struct sieve_binary *sbin) -{ - return (struct mtch_binary_context *) - sieve_binary_extension_get_context(sbin, ext_my_id); -} - -static const struct sieve_match_type_extension *sieve_match_type_extension_get +static inline const struct sieve_match_type_extension *sieve_match_type_extension_get (struct sieve_binary *sbin, int ext_id) -{ - struct mtch_binary_context *ctx = get_binary_context(sbin); - - if ( (ctx != NULL) && (ext_id > 0) && - (ext_id < (int) array_count(&ctx->mtch_extensions)) ) { - const struct sieve_match_type_extension * const *ext; - - ext = array_idx(&ctx->mtch_extensions, (unsigned int) ext_id); - - return *ext; - } - - return NULL; +{ + return (const struct sieve_match_type_extension *) + sieve_binary_registry_get_object(sbin, ext_my_id, ext_id); } void sieve_match_type_extension_set (struct sieve_binary *sbin, int ext_id, const struct sieve_match_type_extension *ext) { - struct mtch_binary_context *ctx = get_binary_context(sbin); - - array_idx_set(&ctx->mtch_extensions, (unsigned int) ext_id, &ext); + sieve_binary_registry_set_object + (sbin, ext_my_id, ext_id, (const void *) ext); } static bool mtch_binary_load(struct sieve_binary *sbin) { - pool_t pool = sieve_binary_pool(sbin); - - struct mtch_binary_context *ctx = - p_new(pool, struct mtch_binary_context, 1); - - /* Setup match-type registry */ - p_array_init(&ctx->mtch_extensions, pool, 4); - - sieve_binary_extension_set_context(sbin, ext_my_id, ctx); + sieve_binary_registry_init(sbin, ext_my_id); return TRUE; }