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 matcher_parserrestart(NULL);
55 matcher_parser_init();
56 bufstate = matcher_parser_scan_string(str);
57 matcher_parser_switch_to_buffer(bufstate);
58 if (matcher_parserparse() != 0)
60 matcher_parser_dialog = 0;
61 matcher_parser_delete_buffer(bufstate);
65 ScoringProp * matcher_parser_get_scoring(gchar * str)
69 /* bad coding to enable the sub-grammar matching
71 matcher_parserlineno = 1;
72 matcher_parser_dialog = 1;
73 matcher_parserrestart(NULL);
74 matcher_parser_init();
75 bufstate = matcher_parser_scan_string(str);
76 matcher_parser_switch_to_buffer(bufstate);
77 if (matcher_parserparse() != 0)
79 matcher_parser_dialog = 0;
80 matcher_parser_delete_buffer(bufstate);
84 static gboolean check_quote_symetry (gchar *str)
90 return TRUE; /* heh, that's symetric */
93 for (walk = str; *walk; walk++) {
95 if (walk == str /* first char */
96 || *(walk - 1) != '\\') /* not escaped */
103 MatcherList * matcher_parser_get_cond(gchar * str)
107 if (!check_quote_symetry(str)) {
112 /* bad coding to enable the sub-grammar matching
114 matcher_parserlineno = 1;
115 matcher_parser_dialog = 1;
116 matcher_parserrestart(NULL);
117 matcher_parser_init();
118 bufstate = matcher_parser_scan_string(str);
119 matcher_parserparse();
120 matcher_parser_dialog = 0;
121 matcher_parser_delete_buffer(bufstate);
125 MatcherProp * matcher_parser_get_prop(gchar * str)
130 matcher_parserlineno = 1;
131 list = matcher_parser_get_cond(str);
135 if (list->matchers == NULL)
138 if (list->matchers->next != NULL)
141 prop = list->matchers->data;
143 g_slist_free(list->matchers);
149 void matcher_parsererror(char * str)
154 for(l = matchers_list ; l != NULL ;
155 l = g_slist_next(l)) {
156 matcherprop_free((MatcherProp *)
160 g_slist_free(matchers_list);
161 matchers_list = NULL;
164 g_warning("scoring / filtering parsing: %i: %s\n",
165 matcher_parserlineno, str);
169 int matcher_parserwrap(void)
180 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
181 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
182 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
183 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
184 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
185 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
186 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
187 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
188 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
189 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
190 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
191 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
192 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
193 %token MATCHER_EXECUTE MATCHER_NOT_EXECUTE MATCHER_MATCHCASE MATCHER_MATCH
194 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
195 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
196 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
197 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
198 %token MATCHER_OR MATCHER_AND
199 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT MATCHER_DELETE_ON_SERVER
200 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
204 %token <str> MATCHER_STRING
205 %token <str> MATCHER_SECTION
206 %token <str> MATCHER_INTEGER
212 if (!matcher_parser_dialog) {
213 prefs_scoring = &global_scoring;
214 prefs_filtering = &global_processing;
233 section_notification:
234 MATCHER_SECTION MATCHER_EOL
237 FolderItem * item = NULL;
239 if (!matcher_parser_dialog) {
240 item = folder_find_item_from_identifier(folder);
242 prefs_scoring = &global_scoring;
243 prefs_filtering = &global_processing;
246 prefs_scoring = &item->prefs->scoring;
247 prefs_filtering = &item->prefs->processing;
254 condition end_instr_opt
259 filtering_or_scoring end_action
262 if (matcher_parser_dialog)
265 matcher_parsererror("parse error");
275 if (matcher_parser_dialog)
278 matcher_parsererror("parse error");
284 filtering_or_scoring:
287 filtering = filteringprop_new(cond, action);
290 if (!matcher_parser_dialog) {
291 * prefs_filtering = g_slist_append(* prefs_filtering,
298 scoring = scoringprop_new(cond, score);
301 if (!matcher_parser_dialog) {
302 * prefs_scoring = g_slist_append(* prefs_scoring, scoring);
311 match_type = MATCHTYPE_MATCHCASE;
315 match_type = MATCHTYPE_MATCH;
319 match_type = MATCHTYPE_REGEXPCASE;
323 match_type = MATCHTYPE_REGEXP;
330 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
331 matchers_list = NULL;
336 condition_list bool_op one_condition
338 matchers_list = g_slist_append(matchers_list, prop);
342 matchers_list = NULL;
343 matchers_list = g_slist_append(matchers_list, prop);
350 bool_op = MATCHERBOOL_AND;
354 bool_op = MATCHERBOOL_OR;
363 criteria = MATCHCRITERIA_ALL;
364 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
370 criteria = MATCHCRITERIA_UNREAD;
371 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
377 criteria = MATCHCRITERIA_NOT_UNREAD;
378 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
384 criteria = MATCHCRITERIA_NEW;
385 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
391 criteria = MATCHCRITERIA_NOT_NEW;
392 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
398 criteria = MATCHCRITERIA_MARKED;
399 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
405 criteria = MATCHCRITERIA_NOT_MARKED;
406 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
412 criteria = MATCHCRITERIA_DELETED;
413 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
415 | MATCHER_NOT_DELETED
419 criteria = MATCHCRITERIA_NOT_DELETED;
420 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
426 criteria = MATCHCRITERIA_REPLIED;
427 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
429 | MATCHER_NOT_REPLIED
433 criteria = MATCHCRITERIA_NOT_REPLIED;
434 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
440 criteria = MATCHCRITERIA_FORWARDED;
441 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
443 | MATCHER_NOT_FORWARDED
447 criteria = MATCHCRITERIA_NOT_FORWARDED;
448 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
450 | MATCHER_SUBJECT match_type MATCHER_STRING
455 criteria = MATCHCRITERIA_SUBJECT;
457 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
459 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
464 criteria = MATCHCRITERIA_NOT_SUBJECT;
466 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
468 | MATCHER_FROM match_type MATCHER_STRING
473 criteria = MATCHCRITERIA_FROM;
475 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
477 | MATCHER_NOT_FROM match_type MATCHER_STRING
482 criteria = MATCHCRITERIA_NOT_FROM;
484 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
486 | MATCHER_TO match_type MATCHER_STRING
491 criteria = MATCHCRITERIA_TO;
493 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
495 | MATCHER_NOT_TO match_type MATCHER_STRING
500 criteria = MATCHCRITERIA_NOT_TO;
502 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
504 | MATCHER_CC match_type MATCHER_STRING
509 criteria = MATCHCRITERIA_CC;
511 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
513 | MATCHER_NOT_CC match_type MATCHER_STRING
518 criteria = MATCHCRITERIA_NOT_CC;
520 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
522 | MATCHER_TO_OR_CC match_type MATCHER_STRING
527 criteria = MATCHCRITERIA_TO_OR_CC;
529 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
531 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
536 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
538 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
540 | MATCHER_AGE_GREATER MATCHER_INTEGER
545 criteria = MATCHCRITERIA_AGE_GREATER;
547 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
549 | MATCHER_AGE_LOWER MATCHER_INTEGER
554 criteria = MATCHCRITERIA_AGE_LOWER;
556 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
558 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
563 criteria = MATCHCRITERIA_NEWSGROUPS;
565 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
567 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
572 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
574 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
576 | MATCHER_INREPLYTO match_type MATCHER_STRING
581 criteria = MATCHCRITERIA_INREPLYTO;
583 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
585 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
590 criteria = MATCHCRITERIA_NOT_INREPLYTO;
592 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
594 | MATCHER_REFERENCES match_type MATCHER_STRING
599 criteria = MATCHCRITERIA_REFERENCES;
601 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
603 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
608 criteria = MATCHCRITERIA_NOT_REFERENCES;
610 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
612 | MATCHER_SCORE_GREATER MATCHER_INTEGER
617 criteria = MATCHCRITERIA_SCORE_GREATER;
619 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
621 | MATCHER_SCORE_LOWER MATCHER_INTEGER
626 criteria = MATCHCRITERIA_SCORE_LOWER;
628 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
630 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
635 criteria = MATCHCRITERIA_SCORE_EQUAL;
637 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
639 | MATCHER_SIZE_GREATER MATCHER_INTEGER
643 criteria = MATCHCRITERIA_SIZE_GREATER;
645 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
647 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
651 criteria = MATCHCRITERIA_SIZE_SMALLER;
653 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
655 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
659 criteria = MATCHCRITERIA_SIZE_EQUAL;
661 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
663 | MATCHER_HEADER MATCHER_STRING
665 header = g_strdup($2);
666 } match_type MATCHER_STRING
671 criteria = MATCHCRITERIA_HEADER;
673 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
676 | MATCHER_NOT_HEADER MATCHER_STRING
678 header = g_strdup($2);
679 } match_type MATCHER_STRING
684 criteria = MATCHCRITERIA_NOT_HEADER;
686 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
689 | MATCHER_HEADERS_PART match_type MATCHER_STRING
694 criteria = MATCHCRITERIA_HEADERS_PART;
696 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
698 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
703 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
705 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
707 | MATCHER_MESSAGE match_type MATCHER_STRING
712 criteria = MATCHCRITERIA_MESSAGE;
714 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
716 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
721 criteria = MATCHCRITERIA_NOT_MESSAGE;
723 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
725 | MATCHER_BODY_PART match_type MATCHER_STRING
730 criteria = MATCHCRITERIA_BODY_PART;
732 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
734 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
739 criteria = MATCHCRITERIA_NOT_BODY_PART;
741 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
743 | MATCHER_EXECUTE MATCHER_STRING
748 criteria = MATCHCRITERIA_EXECUTE;
750 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
752 | MATCHER_NOT_EXECUTE MATCHER_STRING
757 criteria = MATCHCRITERIA_NOT_EXECUTE;
759 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
764 MATCHER_EXECUTE MATCHER_STRING
767 gint action_type = 0;
769 action_type = MATCHACTION_EXECUTE;
771 action = filteringaction_new(action_type, 0, cmd, 0);
773 | MATCHER_MOVE MATCHER_STRING
775 gchar * destination = NULL;
776 gint action_type = 0;
778 action_type = MATCHACTION_MOVE;
780 action = filteringaction_new(action_type, 0, destination, 0);
782 | MATCHER_COPY MATCHER_STRING
784 gchar * destination = NULL;
785 gint action_type = 0;
787 action_type = MATCHACTION_COPY;
789 action = filteringaction_new(action_type, 0, destination, 0);
793 gint action_type = 0;
795 action_type = MATCHACTION_DELETE;
796 action = filteringaction_new(action_type, 0, NULL, 0);
800 gint action_type = 0;
802 action_type = MATCHACTION_MARK;
803 action = filteringaction_new(action_type, 0, NULL, 0);
807 gint action_type = 0;
809 action_type = MATCHACTION_UNMARK;
810 action = filteringaction_new(action_type, 0, NULL, 0);
812 | MATCHER_MARK_AS_READ
814 gint action_type = 0;
816 action_type = MATCHACTION_MARK_AS_READ;
817 action = filteringaction_new(action_type, 0, NULL, 0);
819 | MATCHER_MARK_AS_UNREAD
821 gint action_type = 0;
823 action_type = MATCHACTION_MARK_AS_UNREAD;
824 action = filteringaction_new(action_type, 0, NULL, 0);
826 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
828 gchar * destination = NULL;
829 gint action_type = 0;
832 action_type = MATCHACTION_FORWARD;
833 account_id = atoi($2);
835 action = filteringaction_new(action_type, account_id, destination, 0);
837 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
839 gchar * destination = NULL;
840 gint action_type = 0;
843 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
844 account_id = atoi($2);
846 action = filteringaction_new(action_type, account_id, destination, 0);
848 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
850 gchar * destination = NULL;
851 gint action_type = 0;
854 action_type = MATCHACTION_REDIRECT;
855 account_id = atoi($2);
857 action = filteringaction_new(action_type, account_id, destination, 0);
859 | MATCHER_COLOR MATCHER_INTEGER
861 gint action_type = 0;
864 action_type = MATCHACTION_COLOR;
866 action = filteringaction_new(action_type, 0, NULL, color);
868 | MATCHER_DELETE_ON_SERVER
870 gint action_type = 0;
871 action_type = MATCHACTION_DELETE_ON_SERVER;
872 action = filteringaction_new(action_type, 0, NULL, 0);
877 MATCHER_SCORE MATCHER_INTEGER