11 #include "matcher_parser.h"
12 #include "matcher_parser_lex.h"
14 static gint error = 0;
15 static gint bool_op = 0;
16 static gint match_type = 0;
17 static gchar * header = NULL;
19 static MatcherProp * prop;
21 static GSList * matchers_list = NULL;
23 static MatcherList * cond;
24 static gint score = 0;
25 static FilteringAction * action = NULL;
27 static FilteringProp * filtering;
28 static ScoringProp * scoring = NULL;
30 static GSList ** prefs_scoring = NULL;
31 static GSList ** prefs_filtering = NULL;
33 static int matcher_parser_dialog = 0;
36 /* ******************************************************************** */
40 void matcher_parser_start_parsing(FILE * f)
42 matcher_parserrestart(f);
43 matcher_parserparse();
46 FilteringProp * matcher_parser_get_filtering(gchar * str)
50 /* bad coding to enable the sub-grammar matching
52 matcher_parserlineno = 1;
53 matcher_parser_dialog = 1;
54 bufstate = matcher_parser_scan_string(str);
55 if (matcher_parserparse() != 0)
57 matcher_parser_dialog = 0;
58 matcher_parser_delete_buffer(bufstate);
62 ScoringProp * matcher_parser_get_scoring(gchar * str)
66 /* bad coding to enable the sub-grammar matching
68 matcher_parserlineno = 1;
69 matcher_parser_dialog = 1;
70 bufstate = matcher_parser_scan_string(str);
71 if (matcher_parserparse() != 0)
73 matcher_parser_dialog = 0;
74 matcher_parser_delete_buffer(bufstate);
78 MatcherList * matcher_parser_get_cond(gchar * str)
82 /* bad coding to enable the sub-grammar matching
84 matcher_parserlineno = 1;
85 matcher_parser_dialog = 1;
86 bufstate = matcher_parser_scan_string(str);
87 matcher_parserparse();
88 matcher_parser_dialog = 0;
89 matcher_parser_delete_buffer(bufstate);
93 MatcherProp * matcher_parser_get_prop(gchar * str)
98 matcher_parserlineno = 1;
99 list = matcher_parser_get_cond(str);
103 if (list->matchers == NULL)
106 if (list->matchers->next != NULL)
109 prop = list->matchers->data;
111 g_slist_free(list->matchers);
117 void matcher_parsererror(char * str)
122 for(l = matchers_list ; l != NULL ;
124 matcherprop_free((MatcherProp *)
126 g_slist_free(matchers_list);
127 matchers_list = NULL;
130 g_warning(_("scoring / filtering parsing: %i: %s\n"),
131 matcher_parserlineno, str);
135 int matcher_parserwrap(void)
146 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
147 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
148 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
149 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
150 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
151 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
152 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
153 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
154 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
155 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
156 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
157 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
158 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
159 %token MATCHER_EXECUTE MATCHER_NOT_EXECUTE MATCHER_MATCHCASE MATCHER_MATCH
160 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
161 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
162 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
163 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
164 %token MATCHER_OR MATCHER_AND
165 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT MATCHER_DELETE_ON_SERVER
166 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
170 %token <str> MATCHER_STRING
171 %token <str> MATCHER_SECTION
172 %token <value> MATCHER_INTEGER
178 if (!matcher_parser_dialog) {
179 prefs_scoring = &global_scoring;
180 prefs_filtering = &global_processing;
199 section_notification:
200 MATCHER_SECTION MATCHER_EOL
203 FolderItem * item = NULL;
205 if (!matcher_parser_dialog) {
206 item = folder_find_item_from_identifier(folder);
208 prefs_scoring = &global_scoring;
209 prefs_filtering = &global_processing;
212 prefs_scoring = &item->prefs->scoring;
213 prefs_filtering = &item->prefs->processing;
220 condition end_instr_opt
225 filtering_or_scoring end_action
228 if (matcher_parser_dialog)
231 matcher_parsererror("parse error");
241 if (matcher_parser_dialog)
244 matcher_parsererror("parse error");
250 filtering_or_scoring:
253 filtering = filteringprop_new(cond, action);
256 if (!matcher_parser_dialog) {
257 * prefs_filtering = g_slist_append(* prefs_filtering,
264 scoring = scoringprop_new(cond, score);
267 if (!matcher_parser_dialog) {
268 * prefs_scoring = g_slist_append(* prefs_scoring, scoring);
277 match_type = MATCHTYPE_MATCHCASE;
281 match_type = MATCHTYPE_MATCH;
285 match_type = MATCHTYPE_REGEXPCASE;
289 match_type = MATCHTYPE_REGEXP;
296 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
297 matchers_list = NULL;
302 condition_list bool_op one_condition
304 matchers_list = g_slist_append(matchers_list, prop);
308 matchers_list = NULL;
309 matchers_list = g_slist_append(matchers_list, prop);
316 bool_op = MATCHERBOOL_AND;
320 bool_op = MATCHERBOOL_OR;
329 criteria = MATCHCRITERIA_ALL;
330 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
336 criteria = MATCHCRITERIA_UNREAD;
337 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
343 criteria = MATCHCRITERIA_NOT_UNREAD;
344 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
350 criteria = MATCHCRITERIA_NEW;
351 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
357 criteria = MATCHCRITERIA_NOT_NEW;
358 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
364 criteria = MATCHCRITERIA_MARKED;
365 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
371 criteria = MATCHCRITERIA_NOT_MARKED;
372 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
378 criteria = MATCHCRITERIA_DELETED;
379 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
381 | MATCHER_NOT_DELETED
385 criteria = MATCHCRITERIA_NOT_DELETED;
386 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
392 criteria = MATCHCRITERIA_REPLIED;
393 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
395 | MATCHER_NOT_REPLIED
399 criteria = MATCHCRITERIA_NOT_REPLIED;
400 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
406 criteria = MATCHCRITERIA_FORWARDED;
407 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
409 | MATCHER_NOT_FORWARDED
413 criteria = MATCHCRITERIA_NOT_FORWARDED;
414 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
416 | MATCHER_SUBJECT match_type MATCHER_STRING
421 criteria = MATCHCRITERIA_SUBJECT;
423 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
425 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
430 criteria = MATCHCRITERIA_NOT_SUBJECT;
432 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
434 | MATCHER_FROM match_type MATCHER_STRING
439 criteria = MATCHCRITERIA_FROM;
441 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
443 | MATCHER_NOT_FROM match_type MATCHER_STRING
448 criteria = MATCHCRITERIA_NOT_FROM;
450 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
452 | MATCHER_TO match_type MATCHER_STRING
457 criteria = MATCHCRITERIA_TO;
459 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
461 | MATCHER_NOT_TO match_type MATCHER_STRING
466 criteria = MATCHCRITERIA_NOT_TO;
468 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
470 | MATCHER_CC match_type MATCHER_STRING
475 criteria = MATCHCRITERIA_CC;
477 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
479 | MATCHER_NOT_CC match_type MATCHER_STRING
484 criteria = MATCHCRITERIA_NOT_CC;
486 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
488 | MATCHER_TO_OR_CC match_type MATCHER_STRING
493 criteria = MATCHCRITERIA_TO_OR_CC;
495 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
497 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
502 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
504 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
506 | MATCHER_AGE_GREATER MATCHER_INTEGER
511 criteria = MATCHCRITERIA_AGE_GREATER;
513 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
515 | MATCHER_AGE_LOWER MATCHER_INTEGER
520 criteria = MATCHCRITERIA_AGE_LOWER;
522 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
524 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
529 criteria = MATCHCRITERIA_NEWSGROUPS;
531 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
533 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
538 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
540 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
542 | MATCHER_INREPLYTO match_type MATCHER_STRING
547 criteria = MATCHCRITERIA_INREPLYTO;
549 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
551 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
556 criteria = MATCHCRITERIA_NOT_INREPLYTO;
558 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
560 | MATCHER_REFERENCES match_type MATCHER_STRING
565 criteria = MATCHCRITERIA_REFERENCES;
567 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
569 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
574 criteria = MATCHCRITERIA_NOT_REFERENCES;
576 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
578 | MATCHER_SCORE_GREATER MATCHER_INTEGER
583 criteria = MATCHCRITERIA_SCORE_GREATER;
585 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
587 | MATCHER_SCORE_LOWER MATCHER_INTEGER
592 criteria = MATCHCRITERIA_SCORE_LOWER;
594 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
596 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
601 criteria = MATCHCRITERIA_SCORE_EQUAL;
603 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
605 | MATCHER_SIZE_GREATER MATCHER_INTEGER
609 criteria = MATCHCRITERIA_SIZE_GREATER;
611 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
613 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
617 criteria = MATCHCRITERIA_SIZE_SMALLER;
619 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
621 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
625 criteria = MATCHCRITERIA_SIZE_EQUAL;
627 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
629 | MATCHER_HEADER MATCHER_STRING
631 header = g_strdup($2);
632 } match_type MATCHER_STRING
637 criteria = MATCHCRITERIA_HEADER;
639 prop = matcherprop_new(criteria, header, match_type, expr, 0);
642 | MATCHER_NOT_HEADER MATCHER_STRING
644 header = g_strdup($2);
645 } match_type MATCHER_STRING
650 criteria = MATCHCRITERIA_NOT_HEADER;
652 prop = matcherprop_new(criteria, header, match_type, expr, 0);
655 | MATCHER_HEADERS_PART match_type MATCHER_STRING
660 criteria = MATCHCRITERIA_HEADERS_PART;
662 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
664 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
669 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
671 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
673 | MATCHER_MESSAGE match_type MATCHER_STRING
678 criteria = MATCHCRITERIA_MESSAGE;
680 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
682 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
687 criteria = MATCHCRITERIA_NOT_MESSAGE;
689 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
691 | MATCHER_BODY_PART match_type MATCHER_STRING
696 criteria = MATCHCRITERIA_BODY_PART;
698 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
700 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
705 criteria = MATCHCRITERIA_NOT_BODY_PART;
707 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
709 | MATCHER_EXECUTE MATCHER_STRING
714 criteria = MATCHCRITERIA_EXECUTE;
716 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
718 | MATCHER_NOT_EXECUTE MATCHER_STRING
723 criteria = MATCHCRITERIA_NOT_EXECUTE;
725 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
730 MATCHER_EXECUTE MATCHER_STRING
733 gint action_type = 0;
735 action_type = MATCHACTION_EXECUTE;
737 action = filteringaction_new(action_type, 0, cmd, 0);
739 | MATCHER_MOVE MATCHER_STRING
741 gchar * destination = NULL;
742 gint action_type = 0;
744 action_type = MATCHACTION_MOVE;
746 action = filteringaction_new(action_type, 0, destination, 0);
748 | MATCHER_COPY MATCHER_STRING
750 gchar * destination = NULL;
751 gint action_type = 0;
753 action_type = MATCHACTION_COPY;
755 action = filteringaction_new(action_type, 0, destination, 0);
759 gint action_type = 0;
761 action_type = MATCHACTION_DELETE;
762 action = filteringaction_new(action_type, 0, NULL, 0);
766 gint action_type = 0;
768 action_type = MATCHACTION_MARK;
769 action = filteringaction_new(action_type, 0, NULL, 0);
773 gint action_type = 0;
775 action_type = MATCHACTION_UNMARK;
776 action = filteringaction_new(action_type, 0, NULL, 0);
778 | MATCHER_MARK_AS_READ
780 gint action_type = 0;
782 action_type = MATCHACTION_MARK_AS_READ;
783 action = filteringaction_new(action_type, 0, NULL, 0);
785 | MATCHER_MARK_AS_UNREAD
787 gint action_type = 0;
789 action_type = MATCHACTION_MARK_AS_UNREAD;
790 action = filteringaction_new(action_type, 0, NULL, 0);
792 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
794 gchar * destination = NULL;
795 gint action_type = 0;
798 action_type = MATCHACTION_FORWARD;
799 account_id = atoi($2);
801 action = filteringaction_new(action_type, account_id, destination, 0);
803 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
805 gchar * destination = NULL;
806 gint action_type = 0;
809 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
810 account_id = atoi($2);
812 action = filteringaction_new(action_type, account_id, destination, 0);
814 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
816 gchar * destination = NULL;
817 gint action_type = 0;
820 action_type = MATCHACTION_REDIRECT;
821 account_id = atoi($2);
823 action = filteringaction_new(action_type, account_id, destination, 0);
825 | MATCHER_COLOR MATCHER_INTEGER
827 gint action_type = 0;
830 action_type = MATCHACTION_COLOR;
832 action = filteringaction_new(action_type, 0, NULL, color);
834 | MATCHER_DELETE_ON_SERVER
836 gint action_type = 0;
837 action_type = MATCHACTION_DELETE_ON_SERVER;
838 action = filteringaction_new(action_type, 0, NULL, 0);
843 MATCHER_SCORE MATCHER_INTEGER