]> Pileus Git - ~andy/fetchmail/blobdiff - rcfile_l.l
Wautier's fix.
[~andy/fetchmail] / rcfile_l.l
index bae66f0c6bc1654ffde750590fe1eecd72f95a9f..0c8e5edf6d9a6347802c3097279090b64b00ebbf 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,41 +15,52 @@ int prc_lineno = 1;
 %}
 
 /* this doesn't work with Linux lex, see the INSTALL file */
-%o 5000
+%o 7000
 %a 4000
+%p 3000
 
 %%
 
 set            { return SET; }
-batchlimit     { return BATCHLIMIT; }
-fetchlimit     { return FETCHLIMIT; }
 logfile                { return LOGFILE; }
 daemon         { return DAEMON; }
 syslog         { return SYSLOG; }
+invisible      { return INVISIBLE; }
 
 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; }
+interval       { return INTERVAL; }
 auth(enticate)?        { return AUTHENTICATE; }
 kerberos_v4    { return KERBEROS4; }
-kerberos       { 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; }
 folder(s)?     { return FOLDER; }
 smtp(host)?    { return SMTPHOST; }
+smtpaddress    { return SMTPADDRESS; }
+antispam       { return SPAMRESPONSE; }
 mda            { return MDA; }
 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; }
@@ -57,7 +69,7 @@ to            { return TO; }
 =              { return MAP; }
 "*"            { return WILDCARD; }
 
-no/[kfrsdu ].* { return NO;}
+no/[kfrsdu \t].*       { return NO;}
 
 keep           { return KEEP; }
 flush          { return FLUSH; }
@@ -66,6 +78,8 @@ 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; }
 
@@ -81,6 +95,8 @@ 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; }
@@ -97,7 +113,7 @@ remote(folder)? {
 [0-9]+         { yylval.number = atoi(yytext); return NUMBER; }
 
 \"[^\"]*\"     {
-                       char buf[POPBUFSIZE];
+                       char buf[MSGBUFSIZE];
 
                        yytext[strlen(yytext)-1] = '\0';
                        escapes(yytext+1, buf);
@@ -105,7 +121,7 @@ remote(folder)? {
                        return STRING;
                }
 [^=;:, \t\r\n]+        {
-                       char buf[POPBUFSIZE];
+                       char buf[MSGBUFSIZE];
 
                        escapes(yytext, buf);
                        yylval.sval = (char *) xstrdup(buf);
@@ -114,5 +130,49 @@ remote(folder)? {
 
 [ \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';
+}