summaryrefslogtreecommitdiff
path: root/libsieve/sieve.h
blob: 41c1f8329a96eceff5ba4abc9355abc90467b212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* GNU Mailutils -- a suite of utilities for electronic mail
   Copyright (C) 1999, 2000, 2001, 2002, 2005, 2006,
   2007 Free Software Foundation, Inc.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General
   Public License along with this library; if not, write to the
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301 USA */

#include <mailutils/libsieve.h>
#include <mu_asprintf.h>
#include <setjmp.h>
#include <string.h>

#define SIEVE_CODE_INCR 128

typedef void (*sieve_instr_t) (mu_sieve_machine_t mach);

typedef union {
  sieve_instr_t instr;
  mu_sieve_handler_t handler;
  mu_sieve_value_t *val;
  mu_list_t list;
  long number;
  const char *string;
  size_t pc;
  size_t line;
} sieve_op_t;

struct sieve_machine {
  /* Static data */
  mu_sieve_locus_t locus;    /* Approximate location in the code */

  mu_list_t memory_pool;     /* Pool of allocated memory objects */
  mu_list_t destr_list;      /* List of destructor functions */

  /* Symbol space: */
  mu_list_t test_list;       /* Tests */
  mu_list_t action_list;     /* Actions */
  mu_list_t comp_list;       /* Comparators */
  mu_list_t source_list;     /* Source names (for diagnostics) */
  
  size_t progsize;           /* Number of allocated program cells */
  sieve_op_t *prog;          /* Compiled program */

  /* Runtime data */
  size_t pc;                 /* Current program counter */
  long reg;                  /* Numeric register */
  mu_list_t stack;           /* Runtime stack */

  int debug_level;           /* Debugging level */
  jmp_buf errbuf;            /* Target location for non-local exits */
  const char *identifier;    /* Name of action or test being executed */
  
  mu_mailbox_t mailbox;      /* Mailbox to operate upon */
  size_t    msgno;           /* Current message number */
  mu_message_t msg;          /* Current message */
  int action_count;          /* Number of actions executed over this message */
			    
  /* User supplied data */
  mu_sieve_parse_error_t parse_error_printer;
  mu_sieve_printf_t error_printer; 
  mu_sieve_printf_t debug_printer;
  mu_sieve_action_log_t logger;
  
  mu_mailer_t mailer;
  mu_ticket_t ticket;
  mu_debug_t debug;
  char *daemon_email;
  void *data;
};

extern char *sieve_filename;
extern int sieve_line_num;
extern mu_sieve_machine_t sieve_machine;
extern int sieve_error_count; 

#define TAG_COMPFUN "__compfun__"
#define TAG_RELFUN  "__relfun__"

void sieve_compile_error (const char *filename, int linenum,
			  const char *fmt, ...);
void sieve_debug_internal (mu_sieve_printf_t printer, void *data,
			   const char *fmt, ...);
void sieve_print_value (mu_sieve_value_t *val, mu_sieve_printf_t printer,
		        void *data);
void sieve_print_value_list (mu_list_t list, mu_sieve_printf_t printer, void *data);
void sieve_print_tag_list (mu_list_t list, mu_sieve_printf_t printer, void *data);

int _sieve_default_error_printer (void *data, const char *fmt, va_list ap);
int _sieve_default_parse_error (void *unused, const char *filename, int lineno,
			        const char *fmt, va_list ap);

int sieve_lex_begin (const char *name);
void sieve_lex_finish (void);
int mu_sieve_yyerror (char *s);
int mu_sieve_yylex (); 

void sieve_register_standard_actions (mu_sieve_machine_t mach);
void sieve_register_standard_tests (mu_sieve_machine_t mach);
void sieve_register_standard_comparators (mu_sieve_machine_t mach);

int sieve_code (sieve_op_t *op);
int sieve_code_instr (sieve_instr_t instr);
int sieve_code_handler (mu_sieve_handler_t handler);
int sieve_code_list (mu_list_t list);
int sieve_code_number (long num);
int sieve_code_test (mu_sieve_register_t *reg, mu_list_t arglist);
int sieve_code_action (mu_sieve_register_t *reg, mu_list_t arglist);
void sieve_code_anyof (size_t start);
void sieve_code_allof (size_t start);
int sieve_code_source (const char *name);
int sieve_code_line (size_t line);
void sieve_change_source (void);

void instr_action (mu_sieve_machine_t mach);
void instr_test (mu_sieve_machine_t mach);
void instr_push (mu_sieve_machine_t mach);
void instr_pop (mu_sieve_machine_t mach);
void instr_not (mu_sieve_machine_t mach);
void instr_branch (mu_sieve_machine_t mach);
void instr_brz (mu_sieve_machine_t mach);
void instr_brnz (mu_sieve_machine_t mach);
void instr_nop (mu_sieve_machine_t mach);
void instr_source (mu_sieve_machine_t mach);
void instr_line (mu_sieve_machine_t mach);

int sieve_mark_deleted (mu_message_t msg, int deleted);

int mu_sieve_match_part_checker (const char *name, mu_list_t tags, mu_list_t args);
int sieve_relational_checker (const char *name, mu_list_t tags, mu_list_t args);

int sieve_load_add_path (mu_list_t path);
int sieve_load_add_dir (mu_sieve_machine_t mach, const char *name);

Return to:

Send suggestions and report system problems to the System administrator.