]> Pileus Git - ~andy/fetchmail/blobdiff - rcfile_l.l
Can specify multiple spam-blocks now.
[~andy/fetchmail] / rcfile_l.l
index 059b07c238d0503f8ebf1b2a7f8e10880e8f39ac..90fc2230d701fe29b08f6188c32f16ee53a04ddf 100644 (file)
@@ -5,8 +5,9 @@
  *
  * For license terms, see the file COPYING in this directory.
  */
+#include <string.h>
 
-#include <config.h>
+#include "config.h"
 #include "fetchmail.h"
 #include "rcfile_y.h"
 
@@ -14,39 +15,54 @@ int prc_lineno = 1;
 %}
 
 /* this doesn't work with Linux lex, see the INSTALL file */
-%o 5000
-%a 3000
-
-WS     [ \t]*
+%o 7000
+%a 4000
+%p 3000
 
 %%
 
 set            { return SET; }
-batchlimit     { return BATCHLIMIT; }
-fetchlimit     { return FETCHLIMIT; }
 logfile                { return LOGFILE; }
-interface      { return INTERFACE; }
-monitor                { return MONITOR; }
+idfile         { return IDFILE; }
+daemon         { return DAEMON; }
+syslog         { return SYSLOG; }
+invisible      { return INVISIBLE; }
+postmaster     { return POSTMASTER; }
 
 defaults       { return DEFAULTS; }
 server                 { return POLL; }
 poll           { return POLL; }
 skip           { return SKIP; }
+via            { return VIA; }
 aka            { return AKA; }
 local(domains) { return LOCALDOMAINS; }
 proto(col)?    { return PROTOCOL; }
+service                { return SERVICE; }
 port           { return PORT; }
+interval       { return INTERVAL; }
 auth(enticate)?        { return AUTHENTICATE; }
+kerberos_v4    { return KERBEROS4; }
 kerberos       { return KERBEROS; }
+kerberos_v5     { return KERBEROS5; }
 timeout                { return TIMEOUT;}
 envelope       { return ENVELOPE; }
+qvirtual       { return QVIRTUAL; }
 
 user(name)?    { return USERNAME; }
 pass(word)?    { return PASSWORD; }
-remote(folder)? { return FOLDER; }
+folder(s)?     { return FOLDER; }
 smtp(host)?    { return SMTPHOST; }
+smtpaddress    { return SMTPADDRESS; }
+antispam       { return SPAMRESPONSE; }
 mda            { return MDA; }
-pre(connect)   { return PRECONNECT; }
+pre(connect)?  { return PRECONNECT; }
+post(connect)? { return POSTCONNECT; }
+netsec         { return NETSEC; }
+interface      { return INTERFACE; }
+monitor                { return MONITOR; }
+batchlimit     { return BATCHLIMIT; }
+fetchlimit     { return FETCHLIMIT; }
+expunge                { return EXPUNGE; }
 
 is             { return IS; }
 here           { return HERE; }
@@ -55,19 +71,20 @@ to          { return TO; }
 =              { return MAP; }
 "*"            { return WILDCARD; }
 
-keep           { yylval.flag = FLAG_TRUE; return KEEP; }
-flush          { yylval.flag = FLAG_TRUE; return FLUSH; }
-fetchall       { yylval.flag = FLAG_TRUE; return FETCHALL; }
-rewrite                { yylval.flag = FLAG_TRUE; return REWRITE; }
-stripcr                { yylval.flag = FLAG_TRUE; return STRIPCR; }
-dns            { yylval.flag = FLAG_TRUE; return DNS; }
-
-no{WS}keep     { yylval.flag = FLAG_FALSE; return KEEP; }
-no{WS}flush    { yylval.flag = FLAG_FALSE; return FLUSH; }
-no{WS}fetchall { yylval.flag = FLAG_FALSE; return FETCHALL; }
-no{WS}rewrite  { yylval.flag = FLAG_FALSE; return REWRITE; }
-no{WS}stripcr  { yylval.flag = FLAG_FALSE; return REWRITE; }
-no{WS}dns      { yylval.flag = FLAG_FALSE; return DNS; }
+no/[kfrsduc \t].*      { return NO;}
+
+keep           { return KEEP; }
+flush          { return FLUSH; }
+fetchall       { return FETCHALL; }
+rewrite                { return REWRITE; }
+forcecr                { return FORCECR; }
+stripcr                { return STRIPCR; }
+pass8(bits)?   { return PASS8BITS; }
+dropstatus?    { return DROPSTATUS; }
+mimedec(ode)?   { return MIMEDECODE; }
+dns            { return DNS; }
+uidl           { return UIDL; }
+checkalias     { return CHECKALIAS; }
 
 limit          { return LIMIT; }
 
@@ -81,17 +98,25 @@ options             {/* EMPTY */}
 (auto)|(AUTO)  { yylval.proto = P_AUTO;  return PROTO; }
 (pop2)|(POP2)  { yylval.proto = P_POP2;  return PROTO; }
 (pop3)|(POP3)  { yylval.proto = P_POP3;  return PROTO; }
+(imap-k4)|(IMAP-K4)   { yylval.proto = P_IMAP_K4;  return PROTO; }
+(imap-gss)|(IMAP-GSS) { yylval.proto = P_IMAP_GSS;  return PROTO; }
 (imap)|(IMAP)  { yylval.proto = P_IMAP;  return PROTO; }
 (apop)|(APOP)   { yylval.proto = P_APOP;  return PROTO; }
+(etrn)|(ETRN)   { yylval.proto = P_ETRN;  return PROTO; }
 (kpop)|(KPOP)  { return KPOP; }
 
+remote(folder)? {
+               fprintf(stderr, 
+                       "fetchmail: `remote' keyword is gone, use `folder'\n");
+               }
+
 
 (#.*)?\\?\n    { prc_lineno++; }   /* newline is ignored */
 
 [0-9]+         { yylval.number = atoi(yytext); return NUMBER; }
 
 \"[^\"]*\"     {
-                       char buf[POPBUFSIZE];
+                       char buf[MSGBUFSIZE];
 
                        yytext[strlen(yytext)-1] = '\0';
                        escapes(yytext+1, buf);
@@ -99,7 +124,7 @@ options              {/* EMPTY */}
                        return STRING;
                }
 [^=;:, \t\r\n]+        {
-                       char buf[POPBUFSIZE];
+                       char buf[MSGBUFSIZE];
 
                        escapes(yytext, buf);
                        yylval.sval = (char *) xstrdup(buf);
@@ -108,3 +133,49 @@ options            {/* EMPTY */}
 
 [ \t\r]+       ;       /* whitespace */
 
+%%
+
+void escapes(cp, tp)
+/* process standard C-style escape sequences in a string */
+const char     *cp;    /* source string with escapes */
+char           *tp;    /* target buffer for digested string */
+{
+    while (*cp)
+    {
+       int     cval = 0;
+
+       if (*cp == '\\' && strchr("0123456789xX", cp[1]))
+       {
+           char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
+           int dcount = 0;
+
+           if (*++cp == 'x' || *cp == 'X')
+               for (++cp; (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++)
+                   cval = (cval * 16) + (dp - hex) / 2;
+           else if (*cp == '0')
+               while (strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3))
+                   cval = (cval * 8) + (*cp++ - '0');
+           else
+               while ((strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3))
+                   cval = (cval * 10) + (*cp++ - '0');
+       }
+       else if (*cp == '\\')           /* C-style character escapes */
+       {
+           switch (*++cp)
+           {
+           case '\\': cval = '\\'; break;
+           case 'n': cval = '\n'; break;
+           case 't': cval = '\t'; break;
+           case 'b': cval = '\b'; break;
+           case 'r': cval = '\r'; break;
+           default: cval = *cp;
+           }
+           cp++;
+       }
+       else
+           cval = *cp++;
+       *tp++ = cval;
+    }
+    *tp = '\0';
+}
+