Skip to content
Snippets Groups Projects
Commit 91438bbe authored by Stephan Bosch's avatar Stephan Bosch
Browse files

Defined variable argument for the variables extension.

parent 97987192
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "sieve-common.h" #include "sieve-common.h"
#include "sieve-code.h" #include "sieve-code.h"
#include "sieve-ast.h"
#include "sieve-commands.h" #include "sieve-commands.h"
#include "sieve-validator.h" #include "sieve-validator.h"
#include "sieve-generator.h" #include "sieve-generator.h"
...@@ -62,7 +63,9 @@ const struct sieve_operation cmd_set_operation = { ...@@ -62,7 +63,9 @@ const struct sieve_operation cmd_set_operation = {
*/ */
static bool tag_modifier_is_instance_of static bool tag_modifier_is_instance_of
(struct sieve_validator *validator, struct sieve_ast_argument *arg) (struct sieve_validator *validator,
struct sieve_command_context *cmdctx ATTR_UNUSED,
struct sieve_ast_argument *arg)
{ {
return ext_variables_set_modifier_find return ext_variables_set_modifier_find
(validator, sieve_ast_argument_tag(arg)) != NULL; (validator, sieve_ast_argument_tag(arg)) != NULL;
...@@ -149,13 +152,13 @@ static bool cmd_set_validate(struct sieve_validator *validator, ...@@ -149,13 +152,13 @@ static bool cmd_set_validate(struct sieve_validator *validator,
struct sieve_command_context *cmd) struct sieve_command_context *cmd)
{ {
struct sieve_ast_argument *arg = cmd->first_positional; struct sieve_ast_argument *arg = cmd->first_positional;
if ( !sieve_validate_positional_argument if ( !sieve_validate_positional_argument
(validator, cmd, arg, "name", 1, SAAT_STRING) ) { (validator, cmd, arg, "name", 1, SAAT_STRING) ) {
return FALSE; return FALSE;
} }
sieve_validator_argument_activate(validator, cmd, arg, TRUE); ext_variables_variable_argument_activate(validator, arg);
arg = sieve_ast_argument_next(arg); arg = sieve_ast_argument_next(arg);
if ( !sieve_validate_positional_argument if ( !sieve_validate_positional_argument
...@@ -196,7 +199,6 @@ static bool cmd_set_operation_dump ...@@ -196,7 +199,6 @@ static bool cmd_set_operation_dump
sieve_code_descend(denv); sieve_code_descend(denv);
return return
sieve_opr_string_dump(denv, address) &&
sieve_opr_string_dump(denv, address); sieve_opr_string_dump(denv, address);
} }
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#include "hash.h" #include "hash.h"
#include "sieve-common.h" #include "sieve-common.h"
#include "sieve-ast.h"
#include "sieve-commands.h"
#include "sieve-validator.h" #include "sieve-validator.h"
#include "ext-variables-common.h" #include "ext-variables-common.h"
...@@ -23,10 +25,51 @@ const struct ext_variables_set_modifier *default_set_modifiers[] = { ...@@ -23,10 +25,51 @@ const struct ext_variables_set_modifier *default_set_modifiers[] = {
const unsigned int default_set_modifiers_count = const unsigned int default_set_modifiers_count =
N_ELEMENTS(default_set_modifiers); N_ELEMENTS(default_set_modifiers);
/* Variable scope */
struct sieve_variable_scope {
pool_t pool;
const char *identifier;
unsigned int next_index;
struct hash_table *variables;
};
struct sieve_variable_scope *sieve_variable_scope_create(pool_t pool)
{
struct sieve_variable_scope *scope;
scope = p_new(pool, struct sieve_variable_scope, 1);
scope->pool = pool;
scope->variables = hash_create
(pool, pool, 0, str_hash, (hash_cmp_callback_t *)strcmp);
return scope;
}
struct sieve_variable *sieve_variable_scope_get_variable
(struct sieve_variable_scope *scope, const char *identifier)
{
struct sieve_variable *var =
(struct sieve_variable *) hash_lookup(scope->variables, identifier);
if ( var == NULL ) {
var = p_new(scope->pool, struct sieve_variable, 1);
var->identifier = identifier;
var->index = scope->next_index++;
hash_insert(scope->variables, (void *) identifier, (void *) var);
}
return var;
}
/* Validator context */ /* Validator context */
struct ext_variables_validator_context { struct ext_variables_validator_context {
struct hash_table *set_modifiers; struct hash_table *set_modifiers;
struct sieve_variable_scope *main_scope;
}; };
static struct ext_variables_validator_context * static struct ext_variables_validator_context *
...@@ -34,10 +77,12 @@ ext_variables_validator_context_create(struct sieve_validator *validator) ...@@ -34,10 +77,12 @@ ext_variables_validator_context_create(struct sieve_validator *validator)
{ {
pool_t pool = sieve_validator_pool(validator); pool_t pool = sieve_validator_pool(validator);
struct ext_variables_validator_context *ctx; struct ext_variables_validator_context *ctx;
struct sieve_ast *ast = sieve_validator_ast(validator);
ctx = p_new(pool, struct ext_variables_validator_context, 1); ctx = p_new(pool, struct ext_variables_validator_context, 1);
ctx->set_modifiers = hash_create ctx->set_modifiers = hash_create
(pool, pool, 0, str_hash, (hash_cmp_callback_t *)strcmp); (pool, pool, 0, str_hash, (hash_cmp_callback_t *)strcmp);
ctx->main_scope = sieve_variable_scope_create(sieve_ast_pool(ast));
sieve_validator_extension_set_context sieve_validator_extension_set_context
(validator, ext_variables_my_id, (void *) ctx); (validator, ext_variables_my_id, (void *) ctx);
...@@ -67,6 +112,45 @@ ext_variables_validator_context_get(struct sieve_validator *validator) ...@@ -67,6 +112,45 @@ ext_variables_validator_context_get(struct sieve_validator *validator)
sieve_validator_extension_get_context(validator, ext_variables_my_id); sieve_validator_extension_get_context(validator, ext_variables_my_id);
} }
struct sieve_variable *ext_variables_validator_get_variable
(struct sieve_validator *validator, const char *variable)
{
struct ext_variables_validator_context *ctx =
ext_variables_validator_context_get(validator);
return sieve_variable_scope_get_variable(ctx->main_scope, variable);
}
/* Variable arguments */
static bool arg_variable_generate
(struct sieve_generator *generator, struct sieve_ast_argument *arg,
struct sieve_command_context *context);
const struct sieve_argument variable_argument =
{ "@variable", NULL, NULL, NULL, arg_variable_generate };
void ext_variables_variable_argument_activate
(struct sieve_validator *validator, struct sieve_ast_argument *arg)
{
struct ext_variables_validator_context *ctx;
struct sieve_variable *var;
ctx = ext_variables_validator_context_get(validator);
var = sieve_variable_scope_get_variable(ctx->main_scope,
sieve_ast_argument_strc(arg));
arg->argument = &variable_argument;
arg->context = (void *) var;
}
static bool arg_variable_generate
(struct sieve_generator *generator, struct sieve_ast_argument *arg,
struct sieve_command_context *context)
{
return TRUE;
}
/* Set modifier registration */ /* Set modifier registration */
const struct ext_variables_set_modifier *ext_variables_set_modifier_find const struct ext_variables_set_modifier *ext_variables_set_modifier_find
...@@ -79,3 +163,6 @@ const struct ext_variables_set_modifier *ext_variables_set_modifier_find ...@@ -79,3 +163,6 @@ const struct ext_variables_set_modifier *ext_variables_set_modifier_find
hash_lookup(ctx->set_modifiers, identifier); hash_lookup(ctx->set_modifiers, identifier);
} }
/* Interpreter context */
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#include "sieve-common.h" #include "sieve-common.h"
#include "sieve-ext-variables.h"
extern int ext_variables_my_id; extern int ext_variables_my_id;
extern struct sieve_extension variables_extension; extern struct sieve_extension variables_extension;
...@@ -36,5 +38,13 @@ struct ext_variables_set_modifier { ...@@ -36,5 +38,13 @@ struct ext_variables_set_modifier {
const struct ext_variables_set_modifier *ext_variables_set_modifier_find const struct ext_variables_set_modifier *ext_variables_set_modifier_find
(struct sieve_validator *validator, const char *identifier); (struct sieve_validator *validator, const char *identifier);
/* Variables */
void ext_variables_variable_argument_activate
(struct sieve_validator *validator, struct sieve_ast_argument *arg);
struct sieve_variable *ext_variables_validator_get_variable
(struct sieve_validator *validator, const char *variable);
#endif /* __EXT_VARIABLES_COMMON_H */ #endif /* __EXT_VARIABLES_COMMON_H */
#ifndef __SIEVE_EXT_VARIABLES_H
#define __SIEVE_EXT_VARIABLES_H
/* Public interface for other extensions to use */
struct sieve_variable {
const char *identifier;
unsigned int index;
};
struct sieve_variable_scope;
struct sieve_variable_scope *sieve_variable_scope_create(pool_t pool);
struct sieve_variable *sieve_variable_scope_get_variable
(struct sieve_variable_scope *scope, const char *identifier);
#endif /* __SIEVE_EXT_VARIABLES_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.