5 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
6 * Copyright (c) 2001-2002 by Hiroyuki Yamamoto & The Sylpheed Claws 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 gchar *name = NULL;
47 static MatcherList *cond;
48 static GSList *action_list = NULL;
49 static FilteringAction *action = NULL;
51 static FilteringProp *filtering;
53 static GSList **prefs_filtering = NULL;
54 static int enable_compatibility = 0;
60 MATCHER_PARSE_CONDITION,
61 MATCHER_PARSE_FILTERING_ACTION,
64 static int matcher_parse_op = MATCHER_PARSE_FILE;
67 /* ******************************************************************** */
69 void matcher_parser_start_parsing(FILE *f)
71 matcher_parserrestart(f);
72 matcher_parserparse();
76 void * matcher_parser_scan_string(const char * str);
78 FilteringProp *matcher_parser_get_filtering(gchar *str)
83 /* little hack to allow passing rules with no names */
84 if (!strncmp(str, "rulename ", 9))
85 tmp_str = g_strdup(str);
87 tmp_str = g_strconcat("rulename \"\" ", str, NULL);
89 /* bad coding to enable the sub-grammar matching
91 matcher_parserlineno = 1;
92 matcher_parse_op = MATCHER_PARSE_NO_EOL;
93 matcher_parserrestart(NULL);
94 matcher_parser_init();
95 bufstate = matcher_parser_scan_string((const char *) tmp_str);
96 matcher_parser_switch_to_buffer(bufstate);
97 if (matcher_parserparse() != 0)
99 matcher_parse_op = MATCHER_PARSE_FILE;
100 matcher_parser_delete_buffer(bufstate);
105 static gboolean check_quote_symetry(gchar *str)
111 return TRUE; /* heh, that's symetric */
114 for (walk = str; *walk; walk++) {
116 if (walk == str /* first char */
117 || *(walk - 1) != '\\') /* not escaped */
124 MatcherList *matcher_parser_get_name(gchar *str)
128 if (!check_quote_symetry(str)) {
133 /* bad coding to enable the sub-grammar matching
135 matcher_parserlineno = 1;
136 matcher_parse_op = MATCHER_PARSE_NAME;
137 matcher_parserrestart(NULL);
138 matcher_parser_init();
139 bufstate = matcher_parser_scan_string(str);
140 matcher_parserparse();
141 matcher_parse_op = MATCHER_PARSE_FILE;
142 matcher_parser_delete_buffer(bufstate);
146 MatcherList *matcher_parser_get_cond(gchar *str)
150 if (!check_quote_symetry(str)) {
155 /* bad coding to enable the sub-grammar matching
157 matcher_parserlineno = 1;
158 matcher_parse_op = MATCHER_PARSE_CONDITION;
159 matcher_parserrestart(NULL);
160 matcher_parser_init();
161 bufstate = matcher_parser_scan_string(str);
162 matcher_parserparse();
163 matcher_parse_op = MATCHER_PARSE_FILE;
164 matcher_parser_delete_buffer(bufstate);
168 GSList *matcher_parser_get_action_list(gchar *str)
172 if (!check_quote_symetry(str)) {
177 /* bad coding to enable the sub-grammar matching
179 matcher_parserlineno = 1;
180 matcher_parse_op = MATCHER_PARSE_FILTERING_ACTION;
181 matcher_parserrestart(NULL);
182 matcher_parser_init();
183 bufstate = matcher_parser_scan_string(str);
184 matcher_parserparse();
185 matcher_parse_op = MATCHER_PARSE_FILE;
186 matcher_parser_delete_buffer(bufstate);
190 MatcherProp *matcher_parser_get_prop(gchar *str)
195 matcher_parserlineno = 1;
196 list = matcher_parser_get_cond(str);
200 if (list->matchers == NULL)
203 if (list->matchers->next != NULL)
206 prop = list->matchers->data;
208 g_slist_free(list->matchers);
214 void matcher_parsererror(char *str)
219 for (l = matchers_list; l != NULL; l = g_slist_next(l)) {
220 matcherprop_free((MatcherProp *)
224 g_slist_free(matchers_list);
225 matchers_list = NULL;
228 g_warning("filtering parsing: %i: %s\n",
229 matcher_parserlineno, str);
233 int matcher_parserwrap(void)
243 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
244 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
245 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
246 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
247 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
248 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
249 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
250 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
251 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
252 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
253 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
254 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
255 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
256 %token MATCHER_TEST MATCHER_NOT_TEST MATCHER_MATCHCASE MATCHER_MATCH
257 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
258 %token MATCHER_ANY_IN_ADDRESSBOOK MATCHER_ALL_IN_ADDRESSBOOK
259 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
260 %token MATCHER_LOCK MATCHER_UNLOCK
261 %token MATCHER_EXECUTE
262 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
263 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
264 %token MATCHER_OR MATCHER_AND
265 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT
266 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
267 %token MATCHER_LOCKED MATCHER_NOT_LOCKED
268 %token MATCHER_PARTIAL MATCHER_NOT_PARTIAL
269 %token MATCHER_COLORLABEL MATCHER_NOT_COLORLABEL
270 %token MATCHER_IGNORE_THREAD MATCHER_NOT_IGNORE_THREAD
271 %token MATCHER_CHANGE_SCORE MATCHER_SET_SCORE
272 %token MATCHER_STOP MATCHER_HIDE
276 %token MATCHER_RULENAME
277 %token <str> MATCHER_STRING
278 %token <str> MATCHER_SECTION
279 %token <str> MATCHER_INTEGER
285 if (matcher_parse_op == MATCHER_PARSE_FILE) {
286 prefs_filtering = &pre_global_processing;
300 { action_list = NULL; }
307 section_notification:
308 MATCHER_SECTION MATCHER_EOL
311 FolderItem *item = NULL;
313 if (matcher_parse_op == MATCHER_PARSE_FILE) {
314 enable_compatibility = 0;
315 if (!strcmp(folder, "global")) {
316 /* backward compatibility */
317 enable_compatibility = 1;
319 else if (!strcmp(folder, "preglobal")) {
320 prefs_filtering = &pre_global_processing;
322 else if (!strcmp(folder, "postglobal")) {
323 prefs_filtering = &post_global_processing;
325 else if (!strcmp(folder, "filtering")) {
326 prefs_filtering = &filtering_rules;
329 item = folder_find_item_from_identifier(folder);
331 prefs_filtering = &item->prefs->processing;
333 prefs_filtering = NULL;
341 name condition filtering MATCHER_EOL
342 | name condition filtering
344 if (matcher_parse_op == MATCHER_PARSE_NO_EOL)
347 matcher_parsererror("parse error a");
353 if (matcher_parse_op == MATCHER_PARSE_NAME)
356 matcher_parsererror("parse error b");
362 if (matcher_parse_op == MATCHER_PARSE_CONDITION)
365 matcher_parsererror("parse error c");
369 | filtering_action_list
371 if (matcher_parse_op == MATCHER_PARSE_FILTERING_ACTION)
374 matcher_parsererror("parse error d");
382 MATCHER_RULENAME MATCHER_STRING
389 filtering_action_list
391 filtering = filteringprop_new(name, cond, action_list);
394 if (enable_compatibility) {
395 prefs_filtering = &filtering_rules;
396 if (action_list != NULL) {
397 FilteringAction * first_action;
399 first_action = action_list->data;
401 if (first_action->type == MATCHACTION_CHANGE_SCORE)
402 prefs_filtering = &pre_global_processing;
409 if ((matcher_parse_op == MATCHER_PARSE_FILE) &&
410 (prefs_filtering != NULL)) {
411 *prefs_filtering = g_slist_append(*prefs_filtering,
418 filtering_action_list:
419 filtering_action_b filtering_action_list
426 action_list = g_slist_append(action_list, action);
434 match_type = MATCHTYPE_MATCHCASE;
438 match_type = MATCHTYPE_MATCH;
442 match_type = MATCHTYPE_REGEXPCASE;
446 match_type = MATCHTYPE_REGEXP;
448 | MATCHER_ANY_IN_ADDRESSBOOK
450 match_type = MATCHTYPE_ANY_IN_ADDRESSBOOK;
452 | MATCHER_ALL_IN_ADDRESSBOOK
454 match_type = MATCHTYPE_ALL_IN_ADDRESSBOOK;
461 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
462 matchers_list = NULL;
467 condition_list bool_op one_condition
469 matchers_list = g_slist_append(matchers_list, prop);
473 matchers_list = NULL;
474 matchers_list = g_slist_append(matchers_list, prop);
481 bool_op = MATCHERBOOL_AND;
485 bool_op = MATCHERBOOL_OR;
494 criteria = MATCHCRITERIA_ALL;
495 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
501 criteria = MATCHCRITERIA_UNREAD;
502 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
508 criteria = MATCHCRITERIA_NOT_UNREAD;
509 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
515 criteria = MATCHCRITERIA_NEW;
516 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
522 criteria = MATCHCRITERIA_NOT_NEW;
523 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
529 criteria = MATCHCRITERIA_MARKED;
530 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
536 criteria = MATCHCRITERIA_NOT_MARKED;
537 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
543 criteria = MATCHCRITERIA_DELETED;
544 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
546 | MATCHER_NOT_DELETED
550 criteria = MATCHCRITERIA_NOT_DELETED;
551 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
557 criteria = MATCHCRITERIA_REPLIED;
558 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
560 | MATCHER_NOT_REPLIED
564 criteria = MATCHCRITERIA_NOT_REPLIED;
565 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
571 criteria = MATCHCRITERIA_FORWARDED;
572 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
574 | MATCHER_NOT_FORWARDED
578 criteria = MATCHCRITERIA_NOT_FORWARDED;
579 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
585 criteria = MATCHCRITERIA_LOCKED;
586 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
592 criteria = MATCHCRITERIA_NOT_LOCKED;
593 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
599 criteria = MATCHCRITERIA_PARTIAL;
600 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
602 | MATCHER_NOT_PARTIAL
606 criteria = MATCHCRITERIA_NOT_PARTIAL;
607 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
609 | MATCHER_COLORLABEL MATCHER_INTEGER
614 criteria = MATCHCRITERIA_COLORLABEL;
615 value = strtol($2, NULL, 10);
616 if (value < 0) value = 0;
617 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
618 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
620 | MATCHER_NOT_COLORLABEL MATCHER_INTEGER
625 criteria = MATCHCRITERIA_NOT_COLORLABEL;
626 value = strtol($2, NULL, 0);
627 if (value < 0) value = 0;
628 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
629 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
631 | MATCHER_IGNORE_THREAD
635 criteria = MATCHCRITERIA_IGNORE_THREAD;
636 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
638 | MATCHER_NOT_IGNORE_THREAD
642 criteria = MATCHCRITERIA_NOT_IGNORE_THREAD;
643 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
645 | MATCHER_SUBJECT match_type MATCHER_STRING
650 criteria = MATCHCRITERIA_SUBJECT;
652 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
654 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
659 criteria = MATCHCRITERIA_NOT_SUBJECT;
661 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
663 | MATCHER_FROM match_type MATCHER_STRING
668 criteria = MATCHCRITERIA_FROM;
670 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
672 | MATCHER_NOT_FROM match_type MATCHER_STRING
677 criteria = MATCHCRITERIA_NOT_FROM;
679 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
681 | MATCHER_TO match_type MATCHER_STRING
686 criteria = MATCHCRITERIA_TO;
688 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
690 | MATCHER_NOT_TO match_type MATCHER_STRING
695 criteria = MATCHCRITERIA_NOT_TO;
697 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
699 | MATCHER_CC match_type MATCHER_STRING
704 criteria = MATCHCRITERIA_CC;
706 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
708 | MATCHER_NOT_CC match_type MATCHER_STRING
713 criteria = MATCHCRITERIA_NOT_CC;
715 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
717 | MATCHER_TO_OR_CC match_type MATCHER_STRING
722 criteria = MATCHCRITERIA_TO_OR_CC;
724 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
726 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
731 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
733 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
735 | MATCHER_AGE_GREATER MATCHER_INTEGER
740 criteria = MATCHCRITERIA_AGE_GREATER;
741 value = strtol($2, NULL, 0);
742 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
744 | MATCHER_AGE_LOWER MATCHER_INTEGER
749 criteria = MATCHCRITERIA_AGE_LOWER;
750 value = strtol($2, NULL, 0);
751 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
753 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
758 criteria = MATCHCRITERIA_NEWSGROUPS;
760 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
762 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
767 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
769 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
771 | MATCHER_INREPLYTO match_type MATCHER_STRING
776 criteria = MATCHCRITERIA_INREPLYTO;
778 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
780 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
785 criteria = MATCHCRITERIA_NOT_INREPLYTO;
787 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
789 | MATCHER_REFERENCES match_type MATCHER_STRING
794 criteria = MATCHCRITERIA_REFERENCES;
796 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
798 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
803 criteria = MATCHCRITERIA_NOT_REFERENCES;
805 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
807 | MATCHER_SCORE_GREATER MATCHER_INTEGER
812 criteria = MATCHCRITERIA_SCORE_GREATER;
813 value = strtol($2, NULL, 0);
814 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
816 | MATCHER_SCORE_LOWER MATCHER_INTEGER
821 criteria = MATCHCRITERIA_SCORE_LOWER;
822 value = strtol($2, NULL, 0);
823 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
825 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
830 criteria = MATCHCRITERIA_SCORE_EQUAL;
831 value = strtol($2, NULL, 0);
832 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
834 | MATCHER_SIZE_GREATER MATCHER_INTEGER
838 criteria = MATCHCRITERIA_SIZE_GREATER;
839 value = strtol($2, NULL, 0);
840 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
842 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
846 criteria = MATCHCRITERIA_SIZE_SMALLER;
847 value = strtol($2, NULL, 0);
848 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
850 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
854 criteria = MATCHCRITERIA_SIZE_EQUAL;
855 value = strtol($2, NULL, 0);
856 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
858 | MATCHER_HEADER MATCHER_STRING
860 header = g_strdup($2);
861 } match_type MATCHER_STRING
866 criteria = MATCHCRITERIA_HEADER;
868 prop = matcherprop_new(criteria, header, match_type, expr, 0);
871 | MATCHER_NOT_HEADER MATCHER_STRING
873 header = g_strdup($2);
874 } match_type MATCHER_STRING
879 criteria = MATCHCRITERIA_NOT_HEADER;
881 prop = matcherprop_new(criteria, header, match_type, expr, 0);
884 | MATCHER_HEADERS_PART match_type MATCHER_STRING
889 criteria = MATCHCRITERIA_HEADERS_PART;
891 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
893 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
898 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
900 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
902 | MATCHER_MESSAGE match_type MATCHER_STRING
907 criteria = MATCHCRITERIA_MESSAGE;
909 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
911 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
916 criteria = MATCHCRITERIA_NOT_MESSAGE;
918 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
920 | MATCHER_BODY_PART match_type MATCHER_STRING
925 criteria = MATCHCRITERIA_BODY_PART;
927 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
929 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
934 criteria = MATCHCRITERIA_NOT_BODY_PART;
936 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
938 | MATCHER_TEST MATCHER_STRING
943 criteria = MATCHCRITERIA_TEST;
945 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
947 | MATCHER_NOT_TEST MATCHER_STRING
952 criteria = MATCHCRITERIA_NOT_TEST;
954 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
959 MATCHER_EXECUTE MATCHER_STRING
962 gint action_type = 0;
964 action_type = MATCHACTION_EXECUTE;
966 action = filteringaction_new(action_type, 0, cmd, 0, 0);
968 | MATCHER_MOVE MATCHER_STRING
970 gchar *destination = NULL;
971 gint action_type = 0;
973 action_type = MATCHACTION_MOVE;
975 action = filteringaction_new(action_type, 0, destination, 0, 0);
977 | MATCHER_COPY MATCHER_STRING
979 gchar *destination = NULL;
980 gint action_type = 0;
982 action_type = MATCHACTION_COPY;
984 action = filteringaction_new(action_type, 0, destination, 0, 0);
988 gint action_type = 0;
990 action_type = MATCHACTION_DELETE;
991 action = filteringaction_new(action_type, 0, NULL, 0, 0);
995 gint action_type = 0;
997 action_type = MATCHACTION_MARK;
998 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1002 gint action_type = 0;
1004 action_type = MATCHACTION_UNMARK;
1005 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1009 gint action_type = 0;
1011 action_type = MATCHACTION_LOCK;
1012 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1016 gint action_type = 0;
1018 action_type = MATCHACTION_UNLOCK;
1019 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1021 | MATCHER_MARK_AS_READ
1023 gint action_type = 0;
1025 action_type = MATCHACTION_MARK_AS_READ;
1026 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1028 | MATCHER_MARK_AS_UNREAD
1030 gint action_type = 0;
1032 action_type = MATCHACTION_MARK_AS_UNREAD;
1033 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1035 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
1037 gchar *destination = NULL;
1038 gint action_type = 0;
1039 gint account_id = 0;
1041 action_type = MATCHACTION_FORWARD;
1042 account_id = strtol($2, NULL, 10);
1044 action = filteringaction_new(action_type,
1045 account_id, destination, 0, 0);
1047 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
1049 gchar *destination = NULL;
1050 gint action_type = 0;
1051 gint account_id = 0;
1053 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
1054 account_id = strtol($2, NULL, 10);
1056 action = filteringaction_new(action_type,
1057 account_id, destination, 0, 0);
1059 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
1061 gchar *destination = NULL;
1062 gint action_type = 0;
1063 gint account_id = 0;
1065 action_type = MATCHACTION_REDIRECT;
1066 account_id = strtol($2, NULL, 10);
1068 action = filteringaction_new(action_type,
1069 account_id, destination, 0, 0);
1071 | MATCHER_COLOR MATCHER_INTEGER
1073 gint action_type = 0;
1076 action_type = MATCHACTION_COLOR;
1077 color = strtol($2, NULL, 10);
1078 action = filteringaction_new(action_type, 0, NULL, color, 0);
1080 | MATCHER_CHANGE_SCORE MATCHER_INTEGER
1084 score = strtol($2, NULL, 10);
1085 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1088 /* backward compatibility */
1089 | MATCHER_SCORE MATCHER_INTEGER
1093 score = strtol($2, NULL, 10);
1094 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1097 | MATCHER_SET_SCORE MATCHER_INTEGER
1101 score = strtol($2, NULL, 10);
1102 action = filteringaction_new(MATCHACTION_SET_SCORE, 0,
1107 action = filteringaction_new(MATCHACTION_HIDE, 0, NULL, 0, 0);
1111 action = filteringaction_new(MATCHACTION_STOP, 0, NULL, 0, 0);