29
29
static bool cmd_test_binary_generate
30
30
(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
32
const struct sieve_command_def cmd_test_binary = {
32
const struct sieve_command_def cmd_test_binary = {
35
35
1, 0, FALSE, FALSE,
36
cmd_test_binary_registered,
36
cmd_test_binary_registered,
38
cmd_test_binary_validate,
39
cmd_test_binary_generate,
38
cmd_test_binary_validate,
39
cmd_test_binary_generate,
47
47
static bool cmd_test_binary_operation_dump
48
48
(const struct sieve_dumptime_env *denv, sieve_size_t *address);
49
49
static int cmd_test_binary_operation_execute
50
50
(const struct sieve_runtime_env *renv, sieve_size_t *address);
52
52
/* test_binary_create operation */
54
const struct sieve_operation_def test_binary_load_operation = {
54
const struct sieve_operation_def test_binary_load_operation = {
55
55
"TEST_BINARY_LOAD",
57
57
TESTSUITE_OPERATION_TEST_BINARY_LOAD,
58
cmd_test_binary_operation_dump,
59
cmd_test_binary_operation_execute
58
cmd_test_binary_operation_dump,
59
cmd_test_binary_operation_execute
62
62
/* test_binary_delete operation */
64
const struct sieve_operation_def test_binary_save_operation = {
64
const struct sieve_operation_def test_binary_save_operation = {
65
65
"TEST_BINARY_SAVE",
67
67
TESTSUITE_OPERATION_TEST_BINARY_SAVE,
68
cmd_test_binary_operation_dump,
69
cmd_test_binary_operation_execute
68
cmd_test_binary_operation_dump,
69
cmd_test_binary_operation_execute
73
73
* Compiler context data
76
76
enum test_binary_operation {
89
89
const char *folder;
96
96
static bool cmd_test_binary_validate_tag
97
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
97
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
98
98
struct sieve_command *cmd);
100
static const struct sieve_argument_def test_binary_load_tag = {
100
static const struct sieve_argument_def test_binary_load_tag = {
103
103
cmd_test_binary_validate_tag,
104
104
NULL, NULL, NULL,
107
static const struct sieve_argument_def test_binary_save_tag = {
107
static const struct sieve_argument_def test_binary_save_tag = {
110
110
cmd_test_binary_validate_tag,
114
114
static bool cmd_test_binary_registered
115
(struct sieve_validator *valdtr, const struct sieve_extension *ext,
116
struct sieve_command_registration *cmd_reg)
115
(struct sieve_validator *valdtr, const struct sieve_extension *ext,
116
struct sieve_command_registration *cmd_reg)
118
118
/* Register our tags */
119
sieve_validator_register_tag(valdtr, cmd_reg, ext, &test_binary_load_tag, 0);
120
sieve_validator_register_tag(valdtr, cmd_reg, ext, &test_binary_save_tag, 0);
119
sieve_validator_register_tag(valdtr, cmd_reg, ext, &test_binary_load_tag, 0);
120
sieve_validator_register_tag(valdtr, cmd_reg, ext, &test_binary_save_tag, 0);
125
125
static bool cmd_test_binary_validate_tag
126
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
126
(struct sieve_validator *valdtr, struct sieve_ast_argument **arg,
127
127
struct sieve_command *cmd)
129
struct cmd_test_binary_context_data *ctx_data =
130
(struct cmd_test_binary_context_data *) cmd->data;
129
struct cmd_test_binary_context_data *ctx_data =
130
(struct cmd_test_binary_context_data *) cmd->data;
132
132
if ( ctx_data != NULL ) {
133
133
sieve_argument_validate_error
134
134
(valdtr, *arg, "exactly one of the ':load' or ':save' tags must be "
135
135
"specified for the test_binary command, but more were found");
140
140
(sieve_command_pool(cmd), struct cmd_test_binary_context_data, 1);
141
141
cmd->data = ctx_data;
143
if ( sieve_argument_is(*arg, test_binary_load_tag) )
143
if ( sieve_argument_is(*arg, test_binary_load_tag) )
144
144
ctx_data->binary_op = BINARY_OP_LOAD;
146
146
ctx_data->binary_op = BINARY_OP_SAVE;
158
158
static bool cmd_test_binary_validate
159
(struct sieve_validator *valdtr, struct sieve_command *cmd)
159
(struct sieve_validator *valdtr, struct sieve_command *cmd)
161
161
struct sieve_ast_argument *arg = cmd->first_positional;
163
163
if ( cmd->data == NULL ) {
164
sieve_command_validate_error(valdtr, cmd,
164
sieve_command_validate_error(valdtr, cmd,
165
165
"the test_binary command requires either the :load or the :save tag "
166
166
"to be specified");
170
170
if ( !sieve_validate_positional_argument
171
171
(valdtr, cmd, arg, "binary-name", 1, SAAT_STRING) ) {
175
175
return sieve_validator_argument_activate(valdtr, cmd, arg, FALSE);
182
182
static bool cmd_test_binary_generate
183
183
(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd)
185
185
struct cmd_test_binary_context_data *ctx_data =
186
(struct cmd_test_binary_context_data *) cmd->data;
186
(struct cmd_test_binary_context_data *) cmd->data;
188
188
i_assert( ctx_data->binary_op < BINARY_OP_LAST );
190
190
/* Emit operation */
191
sieve_operation_emit(cgenv->sbin, cmd->ext,
191
sieve_operation_emit(cgenv->sbin, cmd->ext,
192
192
test_binary_operations[ctx_data->binary_op]);
194
194
/* Generate arguments */
195
195
if ( !sieve_generate_arguments(cgenv, cmd, NULL) )
205
205
static bool cmd_test_binary_operation_dump
206
206
(const struct sieve_dumptime_env *denv, sieve_size_t *address)
208
208
const struct sieve_operation *op = &denv->oprtn;
210
210
sieve_code_dumpf(denv, "%s:", sieve_operation_mnemonic(op));
212
212
sieve_code_descend(denv);
214
214
return sieve_opr_string_dump(denv, address, "binary-name");