]> Pileus Git - ~andy/fetchmail/blobdiff - rcfile_l.l
Wautier's fix.
[~andy/fetchmail] / rcfile_l.l
index a48b97d82370e6e0ac450c377115a80c7f33ed81..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,30 +15,53 @@ int prc_lineno = 1;
 %}
 
 /* this doesn't work with Linux lex, see the INSTALL file */
-%o 5000
-%a 3000
+%o 7000
+%a 4000
+%p 3000
 
 %%
 
 set            { return SET; }
-batchlimit     { return BATCHLIMIT; }
 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; }
 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; }
+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; }
 there          { return THERE; }
@@ -45,14 +69,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_FALSE; return REWRITE; }
-nokeep         { yylval.flag = FLAG_FALSE; return KEEP; }
-noflush                { yylval.flag = FLAG_FALSE; return FLUSH; }
-nofetchall     { yylval.flag = FLAG_FALSE; return FETCHALL; }
-norewrite      { yylval.flag = FLAG_TRUE;  return REWRITE; }
+no/[kfrsdu \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; }
+
 limit          { return LIMIT; }
 
 with           {/* EMPTY */}
@@ -65,25 +95,33 @@ 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);
                        yylval.sval = (char *) xstrdup(buf);
                        return STRING;
                }
-[^;:, \t\r\n]+ {
-                       char buf[POPBUFSIZE];
+[^=;:, \t\r\n]+        {
+                       char buf[MSGBUFSIZE];
 
                        escapes(yytext, buf);
                        yylval.sval = (char *) xstrdup(buf);
@@ -92,3 +130,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';
+}
+