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
388 filtering_action_list
390 filtering = filteringprop_new(name, cond, action_list);
393 if (enable_compatibility) {
394 prefs_filtering = &filtering_rules;
395 if (action_list != NULL) {
396 FilteringAction * first_action;
398 first_action = action_list->data;
400 if (first_action->type == MATCHACTION_CHANGE_SCORE)
401 prefs_filtering = &pre_global_processing;
408 if ((matcher_parse_op == MATCHER_PARSE_FILE) &&
409 (prefs_filtering != NULL)) {
410 *prefs_filtering = g_slist_append(*prefs_filtering,
417 filtering_action_list:
418 filtering_action_b filtering_action_list
425 action_list = g_slist_append(action_list, action);
433 match_type = MATCHTYPE_MATCHCASE;
437 match_type = MATCHTYPE_MATCH;
441 match_type = MATCHTYPE_REGEXPCASE;
445 match_type = MATCHTYPE_REGEXP;
447 | MATCHER_ANY_IN_ADDRESSBOOK
449 match_type = MATCHTYPE_ANY_IN_ADDRESSBOOK;
451 | MATCHER_ALL_IN_ADDRESSBOOK
453 match_type = MATCHTYPE_ALL_IN_ADDRESSBOOK;
460 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
461 matchers_list = NULL;
466 condition_list bool_op one_condition
468 matchers_list = g_slist_append(matchers_list, prop);
472 matchers_list = NULL;
473 matchers_list = g_slist_append(matchers_list, prop);
480 bool_op = MATCHERBOOL_AND;
484 bool_op = MATCHERBOOL_OR;
493 criteria = MATCHCRITERIA_ALL;
494 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
500 criteria = MATCHCRITERIA_UNREAD;
501 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
507 criteria = MATCHCRITERIA_NOT_UNREAD;
508 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
514 criteria = MATCHCRITERIA_NEW;
515 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
521 criteria = MATCHCRITERIA_NOT_NEW;
522 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
528 criteria = MATCHCRITERIA_MARKED;
529 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
535 criteria = MATCHCRITERIA_NOT_MARKED;
536 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
542 criteria = MATCHCRITERIA_DELETED;
543 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
545 | MATCHER_NOT_DELETED
549 criteria = MATCHCRITERIA_NOT_DELETED;
550 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
556 criteria = MATCHCRITERIA_REPLIED;
557 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
559 | MATCHER_NOT_REPLIED
563 criteria = MATCHCRITERIA_NOT_REPLIED;
564 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
570 criteria = MATCHCRITERIA_FORWARDED;
571 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
573 | MATCHER_NOT_FORWARDED
577 criteria = MATCHCRITERIA_NOT_FORWARDED;
578 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
584 criteria = MATCHCRITERIA_LOCKED;
585 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
591 criteria = MATCHCRITERIA_NOT_LOCKED;
592 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
598 criteria = MATCHCRITERIA_PARTIAL;
599 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
601 | MATCHER_NOT_PARTIAL
605 criteria = MATCHCRITERIA_NOT_PARTIAL;
606 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
608 | MATCHER_COLORLABEL MATCHER_INTEGER
613 criteria = MATCHCRITERIA_COLORLABEL;
614 value = strtol($2, NULL, 10);
615 if (value < 0) value = 0;
616 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
617 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
619 | MATCHER_NOT_COLORLABEL MATCHER_INTEGER
624 criteria = MATCHCRITERIA_NOT_COLORLABEL;
625 value = strtol($2, NULL, 0);
626 if (value < 0) value = 0;
627 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
628 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
630 | MATCHER_IGNORE_THREAD
634 criteria = MATCHCRITERIA_IGNORE_THREAD;
635 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
637 | MATCHER_NOT_IGNORE_THREAD
641 criteria = MATCHCRITERIA_NOT_IGNORE_THREAD;
642 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
644 | MATCHER_SUBJECT match_type MATCHER_STRING
649 criteria = MATCHCRITERIA_SUBJECT;
651 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
653 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
658 criteria = MATCHCRITERIA_NOT_SUBJECT;
660 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
662 | MATCHER_FROM match_type MATCHER_STRING
667 criteria = MATCHCRITERIA_FROM;
669 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
671 | MATCHER_NOT_FROM match_type MATCHER_STRING
676 criteria = MATCHCRITERIA_NOT_FROM;
678 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
680 | MATCHER_TO match_type MATCHER_STRING
685 criteria = MATCHCRITERIA_TO;
687 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
689 | MATCHER_NOT_TO match_type MATCHER_STRING
694 criteria = MATCHCRITERIA_NOT_TO;
696 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
698 | MATCHER_CC match_type MATCHER_STRING
703 criteria = MATCHCRITERIA_CC;
705 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
707 | MATCHER_NOT_CC match_type MATCHER_STRING
712 criteria = MATCHCRITERIA_NOT_CC;
714 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
716 | MATCHER_TO_OR_CC match_type MATCHER_STRING
721 criteria = MATCHCRITERIA_TO_OR_CC;
723 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
725 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
730 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
732 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
734 | MATCHER_AGE_GREATER MATCHER_INTEGER
739 criteria = MATCHCRITERIA_AGE_GREATER;
740 value = strtol($2, NULL, 0);
741 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
743 | MATCHER_AGE_LOWER MATCHER_INTEGER
748 criteria = MATCHCRITERIA_AGE_LOWER;
749 value = strtol($2, NULL, 0);
750 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
752 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
757 criteria = MATCHCRITERIA_NEWSGROUPS;
759 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
761 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
766 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
768 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
770 | MATCHER_INREPLYTO match_type MATCHER_STRING
775 criteria = MATCHCRITERIA_INREPLYTO;
777 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
779 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
784 criteria = MATCHCRITERIA_NOT_INREPLYTO;
786 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
788 | MATCHER_REFERENCES match_type MATCHER_STRING
793 criteria = MATCHCRITERIA_REFERENCES;
795 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
797 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
802 criteria = MATCHCRITERIA_NOT_REFERENCES;
804 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
806 | MATCHER_SCORE_GREATER MATCHER_INTEGER
811 criteria = MATCHCRITERIA_SCORE_GREATER;
812 value = strtol($2, NULL, 0);
813 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
815 | MATCHER_SCORE_LOWER MATCHER_INTEGER
820 criteria = MATCHCRITERIA_SCORE_LOWER;
821 value = strtol($2, NULL, 0);
822 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
824 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
829 criteria = MATCHCRITERIA_SCORE_EQUAL;
830 value = strtol($2, NULL, 0);
831 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
833 | MATCHER_SIZE_GREATER MATCHER_INTEGER
837 criteria = MATCHCRITERIA_SIZE_GREATER;
838 value = strtol($2, NULL, 0);
839 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
841 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
845 criteria = MATCHCRITERIA_SIZE_SMALLER;
846 value = strtol($2, NULL, 0);
847 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
849 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
853 criteria = MATCHCRITERIA_SIZE_EQUAL;
854 value = strtol($2, NULL, 0);
855 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
857 | MATCHER_HEADER MATCHER_STRING
859 header = g_strdup($2);
860 } match_type MATCHER_STRING
865 criteria = MATCHCRITERIA_HEADER;
867 prop = matcherprop_new(criteria, header, match_type, expr, 0);
870 | MATCHER_NOT_HEADER MATCHER_STRING
872 header = g_strdup($2);
873 } match_type MATCHER_STRING
878 criteria = MATCHCRITERIA_NOT_HEADER;
880 prop = matcherprop_new(criteria, header, match_type, expr, 0);
883 | MATCHER_HEADERS_PART match_type MATCHER_STRING
888 criteria = MATCHCRITERIA_HEADERS_PART;
890 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
892 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
897 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
899 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
901 | MATCHER_MESSAGE match_type MATCHER_STRING
906 criteria = MATCHCRITERIA_MESSAGE;
908 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
910 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
915 criteria = MATCHCRITERIA_NOT_MESSAGE;
917 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
919 | MATCHER_BODY_PART match_type MATCHER_STRING
924 criteria = MATCHCRITERIA_BODY_PART;
926 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
928 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
933 criteria = MATCHCRITERIA_NOT_BODY_PART;
935 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
937 | MATCHER_TEST MATCHER_STRING
942 criteria = MATCHCRITERIA_TEST;
944 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
946 | MATCHER_NOT_TEST MATCHER_STRING
951 criteria = MATCHCRITERIA_NOT_TEST;
953 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
958 MATCHER_EXECUTE MATCHER_STRING
961 gint action_type = 0;
963 action_type = MATCHACTION_EXECUTE;
965 action = filteringaction_new(action_type, 0, cmd, 0, 0);
967 | MATCHER_MOVE MATCHER_STRING
969 gchar *destination = NULL;
970 gint action_type = 0;
972 action_type = MATCHACTION_MOVE;
974 action = filteringaction_new(action_type, 0, destination, 0, 0);
976 | MATCHER_COPY MATCHER_STRING
978 gchar *destination = NULL;
979 gint action_type = 0;
981 action_type = MATCHACTION_COPY;
983 action = filteringaction_new(action_type, 0, destination, 0, 0);
987 gint action_type = 0;
989 action_type = MATCHACTION_DELETE;
990 action = filteringaction_new(action_type, 0, NULL, 0, 0);
994 gint action_type = 0;
996 action_type = MATCHACTION_MARK;
997 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1001 gint action_type = 0;
1003 action_type = MATCHACTION_UNMARK;
1004 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1008 gint action_type = 0;
1010 action_type = MATCHACTION_LOCK;
1011 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1015 gint action_type = 0;
1017 action_type = MATCHACTION_UNLOCK;
1018 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1020 | MATCHER_MARK_AS_READ
1022 gint action_type = 0;
1024 action_type = MATCHACTION_MARK_AS_READ;
1025 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1027 | MATCHER_MARK_AS_UNREAD
1029 gint action_type = 0;
1031 action_type = MATCHACTION_MARK_AS_UNREAD;
1032 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1034 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
1036 gchar *destination = NULL;
1037 gint action_type = 0;
1038 gint account_id = 0;
1040 action_type = MATCHACTION_FORWARD;
1041 account_id = strtol($2, NULL, 10);
1043 action = filteringaction_new(action_type,
1044 account_id, destination, 0, 0);
1046 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
1048 gchar *destination = NULL;
1049 gint action_type = 0;
1050 gint account_id = 0;
1052 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
1053 account_id = strtol($2, NULL, 10);
1055 action = filteringaction_new(action_type,
1056 account_id, destination, 0, 0);
1058 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
1060 gchar *destination = NULL;
1061 gint action_type = 0;
1062 gint account_id = 0;
1064 action_type = MATCHACTION_REDIRECT;
1065 account_id = strtol($2, NULL, 10);
1067 action = filteringaction_new(action_type,
1068 account_id, destination, 0, 0);
1070 | MATCHER_COLOR MATCHER_INTEGER
1072 gint action_type = 0;
1075 action_type = MATCHACTION_COLOR;
1076 color = strtol($2, NULL, 10);
1077 action = filteringaction_new(action_type, 0, NULL, color, 0);
1079 | MATCHER_CHANGE_SCORE MATCHER_INTEGER
1083 score = strtol($2, NULL, 10);
1084 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1087 /* backward compatibility */
1088 | MATCHER_SCORE MATCHER_INTEGER
1092 score = strtol($2, NULL, 10);
1093 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1096 | MATCHER_SET_SCORE MATCHER_INTEGER
1100 score = strtol($2, NULL, 10);
1101 action = filteringaction_new(MATCHACTION_SET_SCORE, 0,
1106 action = filteringaction_new(MATCHACTION_HIDE, 0, NULL, 0, 0);
1110 action = filteringaction_new(MATCHACTION_STOP, 0, NULL, 0, 0);