#ifndef SIEVE_H
#define SIEVE_H
#include <stdio.h>
#define SIEVE_VERSION "CMU Sieve 2.2"
#define SIEVE_OK (0)
#include "sieve_err.h"
typedef struct sieve_interp sieve_interp_t;
typedef struct sieve_script sieve_script_t;
typedef struct sieve_bytecode sieve_bytecode_t;
typedef struct bytecode_info bytecode_info_t;
typedef int sieve_callback(void *action_context, void *interp_context,
void *script_context,
void *message_context, const char **errmsg);
typedef int sieve_get_size(void *message_context, int *size);
typedef int sieve_get_header(void *message_context,
const char *header,
const char ***contents);
typedef int sieve_get_envelope(void *message_context,
const char *field,
const char ***contents);
typedef struct sieve_vacation {
int min_response;
int max_response;
sieve_callback *autorespond;
sieve_callback *send_response;
} sieve_vacation_t;
typedef struct sieve_imapflags {
char **flag;
int nflags;
} sieve_imapflags_t;
typedef struct sieve_redirect_context {
const char *addr;
} sieve_redirect_context_t;
typedef struct sieve_reject_context {
const char *msg;
} sieve_reject_context_t;
typedef struct sieve_fileinto_context {
const char *mailbox;
sieve_imapflags_t *imapflags;
} sieve_fileinto_context_t;
typedef struct sieve_keep_context {
sieve_imapflags_t *imapflags;
} sieve_keep_context_t;
typedef struct sieve_notify_context {
const char *method;
const char **options;
const char *priority;
const char *message;
} sieve_notify_context_t;
typedef struct sieve_autorespond_context {
unsigned char *hash;
int len;
int days;
} sieve_autorespond_context_t;
typedef struct sieve_send_response_context {
char *addr;
char *fromaddr;
const char *msg;
char *subj;
int mime;
} sieve_send_response_context_t;
int sieve_interp_alloc(sieve_interp_t **interp, void *interp_context);
int sieve_interp_free(sieve_interp_t **interp);
int sieve_register_redirect(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_discard(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_reject(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_fileinto(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_keep(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_vacation(sieve_interp_t *interp, sieve_vacation_t *v);
int sieve_register_imapflags(sieve_interp_t *interp, sieve_imapflags_t *mark);
int sieve_register_notify(sieve_interp_t *interp, sieve_callback *f);
int sieve_register_size(sieve_interp_t *interp, sieve_get_size *f);
int sieve_register_header(sieve_interp_t *interp, sieve_get_header *f);
int sieve_register_envelope(sieve_interp_t *interp, sieve_get_envelope *f);
typedef int sieve_parse_error(int lineno, const char *msg,
void *interp_context,
void *script_context);
int sieve_register_parse_error(sieve_interp_t *interp, sieve_parse_error *f);
typedef int sieve_execute_error(const char *msg, void *interp_context,
void *script_context, void *message_context);
int sieve_register_execute_error(sieve_interp_t *interp,
sieve_execute_error *f);
int sieve_script_parse(sieve_interp_t *interp, FILE *script,
void *script_context, sieve_script_t **ret);
int sieve_script_load(const char *fname, sieve_bytecode_t **ret);
int sieve_script_unload(sieve_bytecode_t **s);
int sieve_script_free(sieve_script_t **s);
int sieve_execute_bytecode(sieve_bytecode_t *script, sieve_interp_t *interp,
void *script_context, void *message_context);
const char *sieve_listextensions(void);
int sieve_generate_bytecode(bytecode_info_t **retval, sieve_script_t *s);
int sieve_emit_bytecode(int fd, bytecode_info_t *bc);
void sieve_free_bytecode(bytecode_info_t **p);
#endif