static bool tst_spamvirustest_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *tst) { if ( sieve_command_is(tst, spamtest_test) ) sieve_operation_emit(cgenv->sblock, tst->ext, &spamtest_operation); else if ( sieve_command_is(tst, virustest_test) ) sieve_operation_emit(cgenv->sblock, tst->ext, &virustest_operation); else i_unreached(); /* Generate arguments */ return sieve_generate_arguments(cgenv, tst, NULL); }
static bool cmd_global_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { struct sieve_ast_argument *arg = cmd->first_positional; sieve_operation_emit(cgenv->sblock, cmd->ext, &global_operation); if ( sieve_ast_argument_type(arg) == SAAT_STRING ) { /* Single string */ struct sieve_variable *var = (struct sieve_variable *) arg->argument->data; (void)sieve_binary_emit_unsigned(cgenv->sblock, 1); (void)sieve_binary_emit_unsigned(cgenv->sblock, var->index); } else if ( sieve_ast_argument_type(arg) == SAAT_STRING_LIST ) { /* String list */ struct sieve_ast_argument *stritem = sieve_ast_strlist_first(arg); (void)sieve_binary_emit_unsigned (cgenv->sblock, sieve_ast_strlist_count(arg)); while ( stritem != NULL ) { struct sieve_variable *var = (struct sieve_variable *) stritem->argument->data; (void)sieve_binary_emit_unsigned(cgenv->sblock, var->index); stritem = sieve_ast_strlist_next(stritem); } } else { i_unreached(); } return TRUE; }
static bool cmd_test_binary_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { /* Emit operation */ if ( sieve_command_is(cmd, cmd_test_binary_load) ) sieve_operation_emit(cgenv->sblock, cmd->ext, &test_binary_load_operation); else if ( sieve_command_is(cmd, cmd_test_binary_save) ) sieve_operation_emit(cgenv->sblock, cmd->ext, &test_binary_save_operation); else i_unreached(); /* Generate arguments */ if ( !sieve_generate_arguments(cgenv, cmd, NULL) ) return FALSE; return TRUE; }
static bool tst_mailboxexists_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *tst) { sieve_operation_emit(cgenv->sblock, tst->ext, &mailboxexists_operation); /* Generate arguments */ return sieve_generate_arguments(cgenv, tst, NULL); }
static bool tst_vnotifym_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { sieve_operation_emit(cgenv->sblock, cmd->ext, &valid_notify_method_operation); /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); }
static bool cmd_fileinto_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { sieve_operation_emit(cgenv->sblock, cmd->ext, &fileinto_operation); /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); }
static bool tst_test_multiscript_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *tst) { sieve_operation_emit(cgenv->sblock, tst->ext, &test_multiscript_operation); /* Generate arguments */ return sieve_generate_arguments(cgenv, tst, NULL); }
static bool tst_body_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { (void)sieve_operation_emit(cgenv->sblock, cmd->ext, &body_operation); /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); }
bool sieve_generate_test (const struct sieve_codegen_env *cgenv, struct sieve_ast_node *tst_node, struct sieve_jumplist *jlist, bool jump_true) { struct sieve_command *test; const struct sieve_command_def *tst_def; i_assert( tst_node->command != NULL && tst_node->command->def != NULL ); test = tst_node->command; tst_def = test->def; if ( tst_def->control_generate != NULL ) { sieve_generate_debug_from_ast_node(cgenv, tst_node); if ( tst_def->control_generate(cgenv, test, jlist, jump_true) ) return TRUE; return FALSE; } if ( tst_def->generate != NULL ) { sieve_generate_debug_from_ast_node(cgenv, tst_node); if ( tst_def->generate(cgenv, test) ) { if ( jump_true ) sieve_operation_emit(cgenv->sblock, NULL, &sieve_jmptrue_operation); else sieve_operation_emit(cgenv->sblock, NULL, &sieve_jmpfalse_operation); sieve_jumplist_add(jlist, sieve_binary_emit_offset(cgenv->sblock, 0)); return TRUE; } return FALSE; } return TRUE; }
static bool cmd_filter_generate (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) { sieve_operation_emit(cgenv->sblock, cmd->ext, &cmd_filter_operation); /* Emit is_test flag */ sieve_binary_emit_byte(cgenv->sblock, ( cmd->ast_node->type == SAT_TEST )); /* Generate arguments */ if ( !sieve_generate_arguments(cgenv, cmd, NULL) ) return FALSE; /* Emit a placeholder when the <arguments> argument is missing */ if ( sieve_ast_argument_next(cmd->first_positional) == NULL ) sieve_opr_omitted_emit(cgenv->sblock); return TRUE; }