struct ext_ihave_binary_context *ext_ihave_binary_init (const struct sieve_extension *this_ext, struct sieve_binary *sbin, struct sieve_ast *ast) { struct ext_ihave_ast_context *ast_ctx = ext_ihave_get_ast_context(this_ext, ast); struct ext_ihave_binary_context *binctx; const char *const *exts; unsigned int i, count; binctx = ext_ihave_binary_get_context(this_ext, sbin); exts = array_get(&ast_ctx->missing_extensions, &count); if ( count > 0 ) { pool_t pool = sieve_binary_pool(sbin); if ( binctx->block == NULL ) binctx->block = sieve_binary_extension_create_block(sbin, this_ext); for ( i = 0; i < count; i++ ) { const char *ext_name = p_strdup(pool, exts[i]); array_append(&binctx->missing_extensions, &ext_name, 1); } } return binctx; }
static struct ext_ihave_binary_context *ext_ihave_binary_create_context (const struct sieve_extension *this_ext, struct sieve_binary *sbin) { pool_t pool = sieve_binary_pool(sbin); struct ext_ihave_binary_context *ctx = p_new(pool, struct ext_ihave_binary_context, 1); ctx->binary = sbin; p_array_init(&ctx->missing_extensions, pool, 64); sieve_binary_extension_set(sbin, this_ext, &ihave_binary_ext, ctx); return ctx; }
static struct ext_include_binary_context *ext_include_binary_create_context (const struct sieve_extension *this_ext, struct sieve_binary *sbin) { pool_t pool = sieve_binary_pool(sbin); struct ext_include_binary_context *ctx = p_new(pool, struct ext_include_binary_context, 1); ctx->binary = sbin; hash_table_create(&ctx->included_scripts, pool, 0, sieve_script_hash, sieve_script_cmp); p_array_init(&ctx->include_index, pool, 128); sieve_binary_extension_set(sbin, this_ext, &include_binary_ext, ctx); return ctx; }
struct ext_include_script_info *ext_include_binary_script_include (struct ext_include_binary_context *binctx, enum ext_include_script_location location, enum ext_include_flags flags, struct sieve_script *script, struct sieve_binary_block *inc_block) { pool_t pool = sieve_binary_pool(binctx->binary); struct ext_include_script_info *incscript; incscript = p_new(pool, struct ext_include_script_info, 1); incscript->id = array_count(&binctx->include_index)+1; incscript->location = location; incscript->flags = flags; incscript->script = script; incscript->block = inc_block; /* Unreferenced on binary_free */ sieve_script_ref(script); hash_table_insert(binctx->included_scripts, script, incscript); array_append(&binctx->include_index, &incscript, 1); return incscript; }