1
/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
4
#ifndef __SIEVE_INTERPRETER_H
5
#define __SIEVE_INTERPRETER_H
10
#include "mail-storage.h"
12
#include "sieve-common.h"
15
* Forward declarations
18
struct sieve_interpreter;
24
struct sieve_runtime_env {
25
struct sieve_interpreter *interp;
27
struct sieve_script *script;
28
const struct sieve_script_env *scriptenv;
30
const struct sieve_message_data *msgdata;
31
struct sieve_message_context *msgctx;
33
struct sieve_binary *sbin;
34
struct sieve_result *result;
36
struct sieve_exec_status *exec_status;
37
struct ostream *trace_stream;
44
struct sieve_interpreter *sieve_interpreter_create
45
(struct sieve_binary *sbin, struct sieve_error_handler *ehandler);
46
void sieve_interpreter_free(struct sieve_interpreter **interp);
52
pool_t sieve_interpreter_pool
53
(struct sieve_interpreter *interp);
54
struct sieve_script *sieve_interpreter_script
55
(struct sieve_interpreter *interp);
56
struct sieve_error_handler *sieve_interpreter_get_error_handler
57
(struct sieve_interpreter *interp);
59
/* Do not use this function for normal sieve extensions. This is intended for
62
void sieve_interpreter_set_result
63
(struct sieve_interpreter *interp, struct sieve_result *result);
69
void sieve_interpreter_reset
70
(struct sieve_interpreter *interp);
71
void sieve_interpreter_interrupt
72
(struct sieve_interpreter *interp);
73
sieve_size_t sieve_interpreter_program_counter
74
(struct sieve_interpreter *interp);
76
int sieve_interpreter_program_jump
77
(struct sieve_interpreter *interp, bool jump);
83
void sieve_interpreter_set_test_result
84
(struct sieve_interpreter *interp, bool result);
85
bool sieve_interpreter_get_test_result
86
(struct sieve_interpreter *interp);
92
/* This is not particularly user-friendly, so avoid using this.. */
93
const char *sieve_runtime_location(const struct sieve_runtime_env *runenv);
95
void sieve_runtime_error
96
(const struct sieve_runtime_env *runenv, const char *location,
97
const char *fmt, ...) ATTR_FORMAT(3, 4);
98
void sieve_runtime_warning
99
(const struct sieve_runtime_env *runenv, const char *location,
100
const char *fmt, ...) ATTR_FORMAT(3, 4);
101
void sieve_runtime_log
102
(const struct sieve_runtime_env *runenv, const char *location,
103
const char *fmt, ...) ATTR_FORMAT(3, 4);
109
#ifdef SIEVE_RUNTIME_TRACE
111
void _sieve_runtime_trace
112
(const struct sieve_runtime_env *runenv, const char *fmt, ...)
114
void _sieve_runtime_trace_error
115
(const struct sieve_runtime_env *runenv, const char *fmt, ...)
118
# define sieve_runtime_trace(runenv, ...) STMT_START { \
119
if ( (runenv)->trace_stream != NULL ) \
120
_sieve_runtime_trace((runenv), __VA_ARGS__); \
122
# define sieve_runtime_trace_error(runenv, ...) STMT_START { \
123
if ( (runenv)->trace_stream != NULL ) \
124
_sieve_runtime_trace_error((runenv), __VA_ARGS__); \
128
# define sieve_runtime_trace(runenv, ...)
129
# define sieve_runtime_trace_error(runenv, ...)
136
struct sieve_interpreter_extension {
137
const struct sieve_extension *ext;
139
void (*run)(const struct sieve_runtime_env *renv, void *context);
140
void (*free)(struct sieve_interpreter *interp, void *context);
143
void sieve_interpreter_extension_register
144
(struct sieve_interpreter *interp,
145
const struct sieve_interpreter_extension *int_ext, void *context);
146
void sieve_interpreter_extension_set_context
147
(struct sieve_interpreter *interp, const struct sieve_extension *ext,
149
void *sieve_interpreter_extension_get_context
150
(struct sieve_interpreter *interp, const struct sieve_extension *ext);
153
* Opcodes and operands
156
int sieve_interpreter_handle_optional_operands
157
(const struct sieve_runtime_env *renv, sieve_size_t *address,
158
struct sieve_side_effects_list **list);
164
int sieve_interpreter_continue
165
(struct sieve_interpreter *interp, bool *interrupted);
166
int sieve_interpreter_start
167
(struct sieve_interpreter *interp, const struct sieve_message_data *msgdata,
168
const struct sieve_script_env *senv, struct sieve_result *result,
170
int sieve_interpreter_run
171
(struct sieve_interpreter *interp, const struct sieve_message_data *msgdata,
172
const struct sieve_script_env *senv, struct sieve_result *result);
174
#endif /* __SIEVE_INTERPRETER_H */