5 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
6 * Copyright (c) 2001-2002 by Hiroyuki Yamamoto & The Claws Mail Team.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include <glib/gi18n.h>
29 #include "filtering.h"
31 #include "matcher_parser.h"
32 #include "matcher_parser_lex.h"
35 #define MAX_COLORLABELS (MSG_CLABEL_7 - MSG_CLABEL_NONE)
37 static gint error = 0;
38 static gint bool_op = 0;
39 static gint match_type = 0;
40 static gchar *header = NULL;
42 static MatcherProp *prop;
44 static GSList *matchers_list = NULL;
46 static gboolean enabled = TRUE;
47 static gchar *name = NULL;
48 static gint account_id = 0;
49 static MatcherList *cond;
50 static GSList *action_list = NULL;
51 static FilteringAction *action = NULL;
52 static gboolean matcher_is_fast = TRUE;
54 static FilteringProp *filtering;
56 static GSList **prefs_filtering = NULL;
57 static int enable_compatibility = 0;
62 MATCHER_PARSE_ENABLED,
64 MATCHER_PARSE_ACCOUNT,
65 MATCHER_PARSE_CONDITION,
66 MATCHER_PARSE_FILTERING_ACTION,
69 static int matcher_parse_op = MATCHER_PARSE_FILE;
72 /* ******************************************************************** */
73 /* redeclarations to avoid warnings */
74 void matcher_parserrestart(FILE *input_file);
75 void matcher_parser_init(void);
76 void matcher_parser_switch_to_buffer(void * new_buffer);
77 void matcher_parser_delete_buffer(void * b);
78 int matcher_parserlex(void);
80 void matcher_parser_start_parsing(FILE *f)
82 matcher_parserrestart(f);
84 matcher_parserparse();
88 void * matcher_parser_scan_string(const char * str);
90 FilteringProp *matcher_parser_get_filtering(gchar *str)
95 /* little hack to allow passing rules with no names */
96 if (!strncmp(str, "rulename ", 9))
97 tmp_str = g_strdup(str);
99 tmp_str = g_strconcat("rulename \"\" ", str, NULL);
101 /* bad coding to enable the sub-grammar matching
103 matcher_parserlineno = 1;
104 matcher_parse_op = MATCHER_PARSE_NO_EOL;
105 matcher_parserrestart(NULL);
106 matcher_parser_init();
107 bufstate = matcher_parser_scan_string((const char *) tmp_str);
108 matcher_parser_switch_to_buffer(bufstate);
109 if (matcher_parserparse() != 0)
111 matcher_parse_op = MATCHER_PARSE_FILE;
112 matcher_parser_delete_buffer(bufstate);
117 static gboolean check_quote_symetry(gchar *str)
123 return TRUE; /* heh, that's symetric */
126 for (walk = str; *walk; walk++) {
128 if (walk == str /* first char */
129 || *(walk - 1) != '\\') /* not escaped */
136 MatcherList *matcher_parser_get_name(gchar *str)
140 if (!check_quote_symetry(str)) {
145 /* bad coding to enable the sub-grammar matching
147 matcher_parserlineno = 1;
148 matcher_parse_op = MATCHER_PARSE_NAME;
149 matcher_parserrestart(NULL);
150 matcher_parser_init();
151 bufstate = matcher_parser_scan_string(str);
152 matcher_parserparse();
153 matcher_parse_op = MATCHER_PARSE_FILE;
154 matcher_parser_delete_buffer(bufstate);
158 MatcherList *matcher_parser_get_enabled(gchar *str)
162 if (!check_quote_symetry(str)) {
167 /* bad coding to enable the sub-grammar matching
169 matcher_parserlineno = 1;
170 matcher_parse_op = MATCHER_PARSE_ENABLED;
171 matcher_parserrestart(NULL);
172 matcher_parser_init();
173 bufstate = matcher_parser_scan_string(str);
174 matcher_parserparse();
175 matcher_parse_op = MATCHER_PARSE_FILE;
176 matcher_parser_delete_buffer(bufstate);
180 MatcherList *matcher_parser_get_account(gchar *str)
184 if (!check_quote_symetry(str)) {
189 /* bad coding to enable the sub-grammar matching
191 matcher_parserlineno = 1;
192 matcher_parse_op = MATCHER_PARSE_ACCOUNT;
193 matcher_parserrestart(NULL);
194 matcher_parser_init();
195 bufstate = matcher_parser_scan_string(str);
196 matcher_parserparse();
197 matcher_parse_op = MATCHER_PARSE_FILE;
198 matcher_parser_delete_buffer(bufstate);
202 MatcherList *matcher_parser_get_cond(gchar *str, gboolean *is_fast)
206 if (!check_quote_symetry(str)) {
211 matcher_is_fast = TRUE;
212 /* bad coding to enable the sub-grammar matching
214 matcher_parserlineno = 1;
215 matcher_parse_op = MATCHER_PARSE_CONDITION;
216 matcher_parserrestart(NULL);
217 matcher_parser_init();
218 bufstate = matcher_parser_scan_string(str);
219 matcher_parserparse();
220 matcher_parse_op = MATCHER_PARSE_FILE;
221 matcher_parser_delete_buffer(bufstate);
223 *is_fast = matcher_is_fast;
227 GSList *matcher_parser_get_action_list(gchar *str)
231 if (!check_quote_symetry(str)) {
236 /* bad coding to enable the sub-grammar matching
238 matcher_parserlineno = 1;
239 matcher_parse_op = MATCHER_PARSE_FILTERING_ACTION;
240 matcher_parserrestart(NULL);
241 matcher_parser_init();
242 bufstate = matcher_parser_scan_string(str);
243 matcher_parserparse();
244 matcher_parse_op = MATCHER_PARSE_FILE;
245 matcher_parser_delete_buffer(bufstate);
249 MatcherProp *matcher_parser_get_prop(gchar *str)
254 matcher_parserlineno = 1;
255 list = matcher_parser_get_cond(str, NULL);
259 if (list->matchers == NULL)
262 if (list->matchers->next != NULL)
265 prop = list->matchers->data;
267 g_slist_free(list->matchers);
273 void matcher_parsererror(char *str)
278 for (l = matchers_list; l != NULL; l = g_slist_next(l)) {
279 matcherprop_free((MatcherProp *)
283 g_slist_free(matchers_list);
284 matchers_list = NULL;
287 g_warning("filtering parsing: %i: %s\n",
288 matcher_parserlineno, str);
292 int matcher_parserwrap(void)
302 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
303 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
304 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
305 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
306 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
307 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
308 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
309 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
310 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
311 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
312 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
313 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
314 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
315 %token MATCHER_TEST MATCHER_NOT_TEST MATCHER_MATCHCASE MATCHER_MATCH
316 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
317 %token MATCHER_FOUND_IN_ADDRESSBOOK MATCHER_NOT_FOUND_IN_ADDRESSBOOK MATCHER_IN
318 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
319 %token MATCHER_LOCK MATCHER_UNLOCK
320 %token MATCHER_EXECUTE
321 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
322 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
323 %token MATCHER_OR MATCHER_AND
324 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT
325 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
326 %token MATCHER_LOCKED MATCHER_NOT_LOCKED
327 %token MATCHER_PARTIAL MATCHER_NOT_PARTIAL
328 %token MATCHER_COLORLABEL MATCHER_NOT_COLORLABEL
329 %token MATCHER_IGNORE_THREAD MATCHER_NOT_IGNORE_THREAD
330 %token MATCHER_CHANGE_SCORE MATCHER_SET_SCORE
331 %token MATCHER_STOP MATCHER_HIDE MATCHER_IGNORE
335 %token MATCHER_ENABLED MATCHER_DISABLED
336 %token MATCHER_RULENAME
337 %token MATCHER_ACCOUNT
338 %token <str> MATCHER_STRING
339 %token <str> MATCHER_SECTION
340 %token <str> MATCHER_INTEGER
346 if (matcher_parse_op == MATCHER_PARSE_FILE) {
347 prefs_filtering = &pre_global_processing;
361 { action_list = NULL; }
368 section_notification:
369 MATCHER_SECTION MATCHER_EOL
372 FolderItem *item = NULL;
374 if (matcher_parse_op == MATCHER_PARSE_FILE) {
375 enable_compatibility = 0;
376 if (!strcmp(folder, "global")) {
377 /* backward compatibility */
378 enable_compatibility = 1;
380 else if (!strcmp(folder, "preglobal")) {
381 prefs_filtering = &pre_global_processing;
383 else if (!strcmp(folder, "postglobal")) {
384 prefs_filtering = &post_global_processing;
386 else if (!strcmp(folder, "filtering")) {
387 prefs_filtering = &filtering_rules;
390 item = folder_find_item_from_identifier(folder);
392 prefs_filtering = &item->prefs->processing;
394 prefs_filtering = NULL;
402 enabled name account condition filtering MATCHER_EOL
403 | enabled name account condition filtering
404 | enabled name condition filtering MATCHER_EOL
405 | enabled name condition filtering
406 | name condition filtering MATCHER_EOL
407 | name condition filtering
409 if (matcher_parse_op == MATCHER_PARSE_NO_EOL)
412 matcher_parsererror("parse error [no eol]");
418 if (matcher_parse_op == MATCHER_PARSE_ENABLED)
421 matcher_parsererror("parse error [enabled]");
427 if (matcher_parse_op == MATCHER_PARSE_ACCOUNT)
430 matcher_parsererror("parse error [account]");
436 if (matcher_parse_op == MATCHER_PARSE_NAME)
439 matcher_parsererror("parse error [name]");
445 if (matcher_parse_op == MATCHER_PARSE_CONDITION)
448 matcher_parsererror("parse error [condition]");
452 | filtering_action_list
454 if (matcher_parse_op == MATCHER_PARSE_FILTERING_ACTION)
457 matcher_parsererror("parse error [filtering action]");
476 MATCHER_RULENAME MATCHER_STRING
483 MATCHER_ACCOUNT MATCHER_INTEGER
485 account_id = strtol($2, NULL, 10);
490 filtering_action_list
492 filtering = filteringprop_new(enabled, name, account_id, cond, action_list);
497 if (enable_compatibility) {
498 prefs_filtering = &filtering_rules;
499 if (action_list != NULL) {
500 FilteringAction * first_action;
502 first_action = action_list->data;
504 if (first_action->type == MATCHACTION_CHANGE_SCORE)
505 prefs_filtering = &pre_global_processing;
512 if ((matcher_parse_op == MATCHER_PARSE_FILE) &&
513 (prefs_filtering != NULL)) {
514 *prefs_filtering = g_slist_append(*prefs_filtering,
521 filtering_action_list:
522 filtering_action_b filtering_action_list
529 action_list = g_slist_append(action_list, action);
537 match_type = MATCHTYPE_MATCHCASE;
541 match_type = MATCHTYPE_MATCH;
545 match_type = MATCHTYPE_REGEXPCASE;
549 match_type = MATCHTYPE_REGEXP;
556 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
557 matchers_list = NULL;
562 condition_list bool_op one_condition
564 matchers_list = g_slist_append(matchers_list, prop);
568 matchers_list = NULL;
569 matchers_list = g_slist_append(matchers_list, prop);
576 bool_op = MATCHERBOOL_AND;
580 bool_op = MATCHERBOOL_OR;
589 criteria = MATCHCRITERIA_ALL;
590 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
596 criteria = MATCHCRITERIA_UNREAD;
597 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
603 criteria = MATCHCRITERIA_NOT_UNREAD;
604 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
610 criteria = MATCHCRITERIA_NEW;
611 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
617 criteria = MATCHCRITERIA_NOT_NEW;
618 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
624 criteria = MATCHCRITERIA_MARKED;
625 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
631 criteria = MATCHCRITERIA_NOT_MARKED;
632 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
638 criteria = MATCHCRITERIA_DELETED;
639 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
641 | MATCHER_NOT_DELETED
645 criteria = MATCHCRITERIA_NOT_DELETED;
646 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
652 criteria = MATCHCRITERIA_REPLIED;
653 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
655 | MATCHER_NOT_REPLIED
659 criteria = MATCHCRITERIA_NOT_REPLIED;
660 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
666 criteria = MATCHCRITERIA_FORWARDED;
667 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
669 | MATCHER_NOT_FORWARDED
673 criteria = MATCHCRITERIA_NOT_FORWARDED;
674 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
680 criteria = MATCHCRITERIA_LOCKED;
681 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
687 criteria = MATCHCRITERIA_NOT_LOCKED;
688 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
694 criteria = MATCHCRITERIA_PARTIAL;
695 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
697 | MATCHER_NOT_PARTIAL
701 criteria = MATCHCRITERIA_NOT_PARTIAL;
702 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
704 | MATCHER_COLORLABEL MATCHER_INTEGER
709 criteria = MATCHCRITERIA_COLORLABEL;
710 value = strtol($2, NULL, 10);
711 if (value < 0) value = 0;
712 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
713 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
715 | MATCHER_NOT_COLORLABEL MATCHER_INTEGER
720 criteria = MATCHCRITERIA_NOT_COLORLABEL;
721 value = strtol($2, NULL, 0);
722 if (value < 0) value = 0;
723 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
724 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
726 | MATCHER_IGNORE_THREAD
730 criteria = MATCHCRITERIA_IGNORE_THREAD;
731 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
733 | MATCHER_NOT_IGNORE_THREAD
737 criteria = MATCHCRITERIA_NOT_IGNORE_THREAD;
738 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
740 | MATCHER_SUBJECT match_type MATCHER_STRING
745 criteria = MATCHCRITERIA_SUBJECT;
747 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
749 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
754 criteria = MATCHCRITERIA_NOT_SUBJECT;
756 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
758 | MATCHER_FROM match_type MATCHER_STRING
763 criteria = MATCHCRITERIA_FROM;
765 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
767 | MATCHER_NOT_FROM match_type MATCHER_STRING
772 criteria = MATCHCRITERIA_NOT_FROM;
774 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
776 | MATCHER_TO match_type MATCHER_STRING
781 criteria = MATCHCRITERIA_TO;
783 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
785 | MATCHER_NOT_TO match_type MATCHER_STRING
790 criteria = MATCHCRITERIA_NOT_TO;
792 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
794 | MATCHER_CC match_type MATCHER_STRING
799 criteria = MATCHCRITERIA_CC;
801 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
803 | MATCHER_NOT_CC match_type MATCHER_STRING
808 criteria = MATCHCRITERIA_NOT_CC;
810 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
812 | MATCHER_TO_OR_CC match_type MATCHER_STRING
817 criteria = MATCHCRITERIA_TO_OR_CC;
819 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
821 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
826 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
828 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
830 | MATCHER_AGE_GREATER MATCHER_INTEGER
835 criteria = MATCHCRITERIA_AGE_GREATER;
836 value = strtol($2, NULL, 0);
837 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
839 | MATCHER_AGE_LOWER MATCHER_INTEGER
844 criteria = MATCHCRITERIA_AGE_LOWER;
845 value = strtol($2, NULL, 0);
846 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
848 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
853 criteria = MATCHCRITERIA_NEWSGROUPS;
855 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
857 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
862 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
864 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
866 | MATCHER_INREPLYTO match_type MATCHER_STRING
871 criteria = MATCHCRITERIA_INREPLYTO;
873 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
875 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
880 criteria = MATCHCRITERIA_NOT_INREPLYTO;
882 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
884 | MATCHER_REFERENCES match_type MATCHER_STRING
889 criteria = MATCHCRITERIA_REFERENCES;
891 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
893 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
898 criteria = MATCHCRITERIA_NOT_REFERENCES;
900 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
902 | MATCHER_SCORE_GREATER MATCHER_INTEGER
907 criteria = MATCHCRITERIA_SCORE_GREATER;
908 value = strtol($2, NULL, 0);
909 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
911 | MATCHER_SCORE_LOWER MATCHER_INTEGER
916 criteria = MATCHCRITERIA_SCORE_LOWER;
917 value = strtol($2, NULL, 0);
918 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
920 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
925 criteria = MATCHCRITERIA_SCORE_EQUAL;
926 value = strtol($2, NULL, 0);
927 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
929 | MATCHER_SIZE_GREATER MATCHER_INTEGER
933 criteria = MATCHCRITERIA_SIZE_GREATER;
934 value = strtol($2, NULL, 0);
935 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
937 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
941 criteria = MATCHCRITERIA_SIZE_SMALLER;
942 value = strtol($2, NULL, 0);
943 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
945 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
949 criteria = MATCHCRITERIA_SIZE_EQUAL;
950 value = strtol($2, NULL, 0);
951 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
953 | MATCHER_HEADER MATCHER_STRING
955 header = g_strdup($2);
956 } match_type MATCHER_STRING
960 matcher_is_fast = FALSE;
961 criteria = MATCHCRITERIA_HEADER;
963 prop = matcherprop_new(criteria, header, match_type, expr, 0);
966 | MATCHER_NOT_HEADER MATCHER_STRING
968 header = g_strdup($2);
969 } match_type MATCHER_STRING
973 matcher_is_fast = FALSE;
974 criteria = MATCHCRITERIA_NOT_HEADER;
976 prop = matcherprop_new(criteria, header, match_type, expr, 0);
979 | MATCHER_HEADERS_PART match_type MATCHER_STRING
983 matcher_is_fast = FALSE;
984 criteria = MATCHCRITERIA_HEADERS_PART;
986 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
988 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
992 matcher_is_fast = FALSE;
993 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
995 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
997 | MATCHER_FOUND_IN_ADDRESSBOOK MATCHER_STRING
999 header = g_strdup($2);
1000 } MATCHER_IN MATCHER_STRING
1005 criteria = MATCHCRITERIA_FOUND_IN_ADDRESSBOOK;
1007 prop = matcherprop_new(criteria, header, match_type, expr, 0);
1010 | MATCHER_NOT_FOUND_IN_ADDRESSBOOK MATCHER_STRING
1012 header = g_strdup($2);
1013 } MATCHER_IN MATCHER_STRING
1018 criteria = MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK;
1020 prop = matcherprop_new(criteria, header, match_type, expr, 0);
1023 | MATCHER_MESSAGE match_type MATCHER_STRING
1027 matcher_is_fast = FALSE;
1028 criteria = MATCHCRITERIA_MESSAGE;
1030 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
1032 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
1036 matcher_is_fast = FALSE;
1037 criteria = MATCHCRITERIA_NOT_MESSAGE;
1039 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
1041 | MATCHER_BODY_PART match_type MATCHER_STRING
1045 matcher_is_fast = FALSE;
1046 criteria = MATCHCRITERIA_BODY_PART;
1048 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
1050 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
1054 matcher_is_fast = FALSE;
1055 criteria = MATCHCRITERIA_NOT_BODY_PART;
1057 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
1059 | MATCHER_TEST MATCHER_STRING
1063 matcher_is_fast = FALSE;
1064 criteria = MATCHCRITERIA_TEST;
1066 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
1068 | MATCHER_NOT_TEST MATCHER_STRING
1072 matcher_is_fast = FALSE;
1073 criteria = MATCHCRITERIA_NOT_TEST;
1075 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
1080 MATCHER_EXECUTE MATCHER_STRING
1083 gint action_type = 0;
1085 action_type = MATCHACTION_EXECUTE;
1087 action = filteringaction_new(action_type, 0, cmd, 0, 0);
1089 | MATCHER_MOVE MATCHER_STRING
1091 gchar *destination = NULL;
1092 gint action_type = 0;
1094 action_type = MATCHACTION_MOVE;
1096 action = filteringaction_new(action_type, 0, destination, 0, 0);
1098 | MATCHER_COPY MATCHER_STRING
1100 gchar *destination = NULL;
1101 gint action_type = 0;
1103 action_type = MATCHACTION_COPY;
1105 action = filteringaction_new(action_type, 0, destination, 0, 0);
1109 gint action_type = 0;
1111 action_type = MATCHACTION_DELETE;
1112 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1116 gint action_type = 0;
1118 action_type = MATCHACTION_MARK;
1119 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1123 gint action_type = 0;
1125 action_type = MATCHACTION_UNMARK;
1126 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1130 gint action_type = 0;
1132 action_type = MATCHACTION_LOCK;
1133 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1137 gint action_type = 0;
1139 action_type = MATCHACTION_UNLOCK;
1140 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1142 | MATCHER_MARK_AS_READ
1144 gint action_type = 0;
1146 action_type = MATCHACTION_MARK_AS_READ;
1147 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1149 | MATCHER_MARK_AS_UNREAD
1151 gint action_type = 0;
1153 action_type = MATCHACTION_MARK_AS_UNREAD;
1154 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1156 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
1158 gchar *destination = NULL;
1159 gint action_type = 0;
1160 gint account_id = 0;
1162 action_type = MATCHACTION_FORWARD;
1163 account_id = strtol($2, NULL, 10);
1165 action = filteringaction_new(action_type,
1166 account_id, destination, 0, 0);
1168 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
1170 gchar *destination = NULL;
1171 gint action_type = 0;
1172 gint account_id = 0;
1174 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
1175 account_id = strtol($2, NULL, 10);
1177 action = filteringaction_new(action_type,
1178 account_id, destination, 0, 0);
1180 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
1182 gchar *destination = NULL;
1183 gint action_type = 0;
1184 gint account_id = 0;
1186 action_type = MATCHACTION_REDIRECT;
1187 account_id = strtol($2, NULL, 10);
1189 action = filteringaction_new(action_type,
1190 account_id, destination, 0, 0);
1192 | MATCHER_COLOR MATCHER_INTEGER
1194 gint action_type = 0;
1197 action_type = MATCHACTION_COLOR;
1198 color = strtol($2, NULL, 10);
1199 action = filteringaction_new(action_type, 0, NULL, color, 0);
1201 | MATCHER_CHANGE_SCORE MATCHER_INTEGER
1205 score = strtol($2, NULL, 10);
1206 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1209 /* backward compatibility */
1210 | MATCHER_SCORE MATCHER_INTEGER
1214 score = strtol($2, NULL, 10);
1215 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1218 | MATCHER_SET_SCORE MATCHER_INTEGER
1222 score = strtol($2, NULL, 10);
1223 action = filteringaction_new(MATCHACTION_SET_SCORE, 0,
1228 action = filteringaction_new(MATCHACTION_HIDE, 0, NULL, 0, 0);
1232 action = filteringaction_new(MATCHACTION_IGNORE, 0, NULL, 0, 0);
1236 action = filteringaction_new(MATCHACTION_STOP, 0, NULL, 0, 0);