sieve-lex.l
4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
%{
/* sieve.l -- sieve lexer
* Larry Greenfield
*/
/***********************************************************
Copyright 1999 by Carnegie Mellon University
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Carnegie Mellon
University not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.
CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR
ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h> /* for strdup */
#include "xmalloc.h"
#include "tree.h"
#include "sieve-gram.h"
static int tonum(char *c);
static char *fixstr(char *);
static char *mlbuf;
static int mlbufsz, mlcur;
extern int yyerror(char *);
%}
%option yylineno
%option noyywrap
ws [ \t]+
ident [a-zA-Z_][a-zA-Z_0-9]*
CRLF (\r\n|\r|\n)
%state MULTILINE
%%
<MULTILINE>^\.{CRLF} { BEGIN INITIAL;
mlbuf[mlcur] = '\0';
yylval.sval = mlbuf; return STRING; }
<MULTILINE>^\.\. { /* dot stuffing! we want one . */ yyless(1); }
<MULTILINE>(.|\n) { if (mlcur == mlbufsz)
mlbuf = xrealloc(mlbuf, 1 + (mlbufsz+=1024));
mlbuf[mlcur++] = yytext[0]; }
<MULTILINE><<EOF>> { yyerror("unexpected end of file in string");
yyterminate(); }
<INITIAL>text:{ws}?(#.*)?{CRLF} { BEGIN MULTILINE;
mlcur = 0; mlbufsz = 0; mlbuf = NULL; }
<INITIAL>[0-9]+[KMG]? { yylval.nval = tonum(yytext); return NUMBER; }
<INITIAL>if return IF;
<INITIAL>elsif return ELSIF;
<INITIAL>else return ELSE;
<INITIAL>anyof return ANYOF;
<INITIAL>allof return ALLOF;
<INITIAL>exists return EXISTS;
<INITIAL>false return SFALSE;
<INITIAL>true return STRUE;
<INITIAL>address return ADDRESS;
<INITIAL>envelope return ENVELOPE;
<INITIAL>header return HEADER;
<INITIAL>not return NOT;
<INITIAL>size return SIZE;
<INITIAL>reject return REJCT;
<INITIAL>fileinto return FILEINTO;
<INITIAL>redirect return FORWARD;
<INITIAL>keep return KEEP;
<INITIAL>require return REQUIRE;
<INITIAL>stop return STOP;
<INITIAL>discard return DISCARD;
<INITIAL>setflag return SETFLAG;
<INITIAL>addflag return ADDFLAG;
<INITIAL>removeflag return REMOVEFLAG;
<INITIAL>mark return MARK;
<INITIAL>unmark return UNMARK;
<INITIAL>notify return NOTIFY;
<INITIAL>denotify return DENOTIFY;
<INITIAL>:low return LOW;
<INITIAL>:medium return MEDIUM;
<INITIAL>:high return HIGH;
<INITIAL>vacation return VACATION;
<INITIAL>:days return DAYS;
<INITIAL>:addresses return ADDRESSES;
<INITIAL>:subject return SUBJECT;
<INITIAL>:mime return MIME;
<INITIAL>:comparator return COMPARATOR;
<INITIAL>:is return IS;
<INITIAL>:contains return CONTAINS;
<INITIAL>:matches return MATCHES;
<INITIAL>:regex return REGEX;
<INITIAL>:over return OVER;
<INITIAL>:under return UNDER;
<INITIAL>:all return ALL;
<INITIAL>:localpart return LOCALPART;
<INITIAL>:domain return DOMAIN;
<INITIAL>:user return USER;
<INITIAL>:detail return DETAIL;
<INITIAL>\"([^"]|\\.)*\" { yylval.sval = fixstr(yytext); return STRING; }
<INITIAL>[ \t\n\r] ; /* ignore whitespace */
<INITIAL>#.* ; /* ignore comments */
. return yytext[0];
%%
static int tonum(char *c)
{
int val = atoi(c);
switch (c[strlen(c)-1]) {
case 'K': val *= (1 << 10); break;
case 'M': val *= (1 << 20); break;
case 'G': val *= (1 << 30); break;
default: break;
}
return val;
}
static char *fixstr(char *str)
{
char *r, *s = (char *) xmalloc(sizeof(char) * strlen(str));
r = s;
str++; /* skip open " */
while (*str != '"') {
if (*str == '\\')
str++;
*s++ = *str++;
}
*s = '\0';
return r;
}