update Russian translation
[claws.git] / src / matcher_parser_lex.l
1 %{
2 #include <string.h>
3 #include <glib.h>
4
5 #include "matcher_parser_lex.h"
6 #include "matcher_parser_parse.h"
7
8 #define MAX_STR_CONST 512
9 #define YY_NO_UNPUT 1
10
11 char string_buf[MAX_STR_CONST];
12 char * string_buf_ptr;
13
14 static void add_char(char ch)
15 {
16         if (string_buf_ptr - string_buf < sizeof(string_buf))
17                 *string_buf_ptr++ = ch;
18 }
19
20
21 /* this function will reinitializes the parser */
22
23 void matcher_parser_init(void)
24 {
25         BEGIN(0);
26 }
27 %}
28
29 %option prefix="matcher_parser"
30 %option outfile="lex.yy.c"
31 %option yylineno
32
33 %x string
34 %x section
35
36 %%
37
38 "all"           return MATCHER_ALL;
39 "unread"        return MATCHER_UNREAD;
40 "~unread"       return MATCHER_NOT_UNREAD;
41 "new"           return MATCHER_NEW;
42 "~new"          return MATCHER_NOT_NEW;
43 "marked"        return MATCHER_MARKED;
44 "~marked"       return MATCHER_NOT_MARKED;
45 "deleted"       return MATCHER_DELETED;
46 "~deleted"      return MATCHER_NOT_DELETED;
47 "replied"       return MATCHER_REPLIED;
48 "~replied"      return MATCHER_NOT_REPLIED;
49 "forwarded"     return MATCHER_FORWARDED;
50 "~forwarded"    return MATCHER_NOT_FORWARDED;
51 "subject"       return MATCHER_SUBJECT;
52 "~subject"      return MATCHER_NOT_SUBJECT;
53 "from"          return MATCHER_FROM;
54 "~from"         return MATCHER_NOT_FROM;
55 "to"            return MATCHER_TO;
56 "~to"           return MATCHER_NOT_TO;
57 "cc"            return MATCHER_CC;
58 "~cc"           return MATCHER_NOT_CC;
59 "to_or_cc"      return MATCHER_TO_OR_CC;
60 "~to_or_cc"     return MATCHER_NOT_TO_AND_NOT_CC;
61 "age_greater"   return MATCHER_AGE_GREATER;
62 "age_lower"     return MATCHER_AGE_LOWER;
63 "newsgroups"    return MATCHER_NEWSGROUPS;
64 "~newsgroups"   return MATCHER_NOT_NEWSGROUPS;
65 "inreplyto"     return MATCHER_INREPLYTO;
66 "~inreplyto"    return MATCHER_NOT_INREPLYTO;
67 "references"    return MATCHER_REFERENCES;
68 "~references"   return MATCHER_NOT_REFERENCES;
69 "score_greater" return MATCHER_SCORE_GREATER;
70 "score_lower"   return MATCHER_SCORE_LOWER;
71 "score_equal"   return MATCHER_SCORE_EQUAL;
72 "size_greater"  return MATCHER_SIZE_GREATER;
73 "size_smaller"  return MATCHER_SIZE_SMALLER;
74 "size_equal"    return MATCHER_SIZE_EQUAL;
75 "header"        return MATCHER_HEADER;
76 "~header"       return MATCHER_NOT_HEADER;
77 "headers_part"  return MATCHER_HEADERS_PART;
78 "~headers_part" return MATCHER_NOT_HEADERS_PART;
79 "message"       return MATCHER_MESSAGE;
80 "~message"      return MATCHER_NOT_MESSAGE;
81 "body_part"     return MATCHER_BODY_PART;
82 "~body_part"    return MATCHER_NOT_BODY_PART;
83 "execute"       return MATCHER_EXECUTE;
84 "~execute"      return MATCHER_NOT_EXECUTE;
85 "matchcase"     return MATCHER_MATCHCASE;
86 "match"         return MATCHER_MATCH;
87 "regexpcase"    return MATCHER_REGEXPCASE;
88 "regexp"        return MATCHER_REGEXP;
89 "score"         return MATCHER_SCORE;
90 "move"          return MATCHER_MOVE;
91 "copy"          return MATCHER_COPY;
92 "delete"        return MATCHER_DELETE;
93 "mark"          return MATCHER_MARK;
94 "unmark"        return MATCHER_UNMARK;
95 "mark_as_read"  return MATCHER_MARK_AS_READ;
96 "mark_as_unread"       return MATCHER_MARK_AS_UNREAD;
97 "forward"              return MATCHER_FORWARD;
98 "forward_as_attachment"       return MATCHER_FORWARD_AS_ATTACHMENT;
99 "color"         return MATCHER_COLOR;
100 "redirect"      return MATCHER_REDIRECT;
101 "delete_on_server"      return MATCHER_DELETE_ON_SERVER;
102 [ \t]+
103 "\n"            return MATCHER_EOL;
104 "&"             return MATCHER_AND;
105 "|"             return MATCHER_OR;
106 \"              {
107                 BEGIN(string);
108                 string_buf_ptr = string_buf;
109                 }
110                 /* alfons - OK, the new attempt is to just swallow 
111                  * *EVERYTHING* and make sure everything is escaped
112                  * when actually performing things. */
113 <string>\\\"    {
114                 /* take care of escaped \" because this means the
115                  * quote char should be skipped */
116                 add_char('\\');
117                 add_char('\"');
118                 }
119 <string>\"      {
120                 /* get out of the state: string ends. */
121                 BEGIN(0);
122                 *string_buf_ptr = '\0';
123                 yylval.str = string_buf;
124                 return MATCHER_STRING;
125                 }
126                 /* put everything else in the output. */
127 <string>.       {
128                 add_char(yytext[0]);
129                 }
130 \[[^\[\]]*\]    {
131                 BEGIN(0);
132                 yylval.str = yytext + 1;
133                 yytext[strlen(yytext) - 1] = '\0';
134                 return MATCHER_SECTION;
135                 }
136 [-+]?[0-9]+     {
137                 yylval.str = yytext;
138                 return MATCHER_INTEGER;
139                 }
140
141 %%