rcfile_l.l
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:6k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. %{
  2. /*
  3.  * rcfile_l.l -- lexer for the run control file
  4.  *
  5.  * For license terms, see the file COPYING in this directory.
  6.  */
  7. #include <string.h>
  8. #include "config.h"
  9. #include "fetchmail.h"
  10. #include "rcfile_y.h"
  11. int prc_lineno = 1;
  12. #ifdef LEXDEBUG
  13. #define SETSTATE(n) if (yydebug) do {BEGIN(n); fprintf(stderr, "Entering lexer state %dn", n);} while (0)
  14. #else
  15. #define SETSTATE(n) BEGIN(n)
  16. #endif /* LEXDEBUG */
  17. %}
  18. /* this doesn't work with Linux lex, see the INSTALL file */
  19. %o 7000
  20. %a 4000
  21. %p 3000
  22. %s NAME PREAUTH
  23. %%
  24. "[^"]*" {
  25. char buf[MSGBUFSIZE];
  26. yytext[strlen(yytext)-1] = '';
  27. escapes(yytext+1, buf);
  28. yylval.sval = (char *) xstrdup(buf);
  29.                         SETSTATE(0);
  30. return STRING;
  31. }
  32. '[^']*' {
  33. char buf[MSGBUFSIZE];
  34. yytext[strlen(yytext)-1] = '';
  35. escapes(yytext+1, buf);
  36. yylval.sval = (char *) xstrdup(buf);
  37.                         SETSTATE(0);
  38. return STRING;
  39. }
  40. "*" { BEGIN(0); return WILDCARD; }
  41. <NAME>[^=;:, trn]+ {
  42. char buf[MSGBUFSIZE];
  43. escapes(yytext, buf);
  44. yylval.sval = (char *) xstrdup(buf);
  45.                         SETSTATE(0);
  46. return STRING;
  47. }
  48. set { return SET; }
  49. logfile { return LOGFILE; }
  50. idfile { return IDFILE; }
  51. daemon { return DAEMON; }
  52. syslog { return SYSLOG; }
  53. invisible { return INVISIBLE; }
  54. postmaster { return POSTMASTER; }
  55. bouncemail { return BOUNCEMAIL; }
  56. warnings { return WARNINGS; }
  57. defaults  { return DEFAULTS; }
  58. server  { return POLL; }
  59. poll { return POLL; }
  60. skip { return SKIP; }
  61. via { return VIA; }
  62. aka { return AKA; }
  63. local(domains) { return LOCALDOMAINS; }
  64. proto(col)?  { return PROTOCOL; }
  65. service { return SERVICE; }
  66. port { return PORT; }
  67. interval { return INTERVAL; }
  68. preauth(enticate)? { SETSTATE(PREAUTH); return PREAUTHENTICATE; }
  69. kerberos(_v)?4 { SETSTATE(0); return KERBEROS4; }
  70. kerberos(_v)?5 { SETSTATE(0); return KERBEROS5; }
  71. kerberos { SETSTATE(0); return KERBEROS; }
  72. ssh { SETSTATE(0); return SSH; }
  73. <PREAUTH>password { SETSTATE(0); return PASSWORD; }
  74. timeout { return TIMEOUT;}
  75. envelope { return ENVELOPE; }
  76. qvirtual { return QVIRTUAL; }
  77. user(name)? {SETSTATE(NAME); return USERNAME; }
  78. pass(word)? {SETSTATE(NAME); return PASSWORD; }
  79. folder(s)?  { return FOLDER; }
  80. smtp(host)? { return SMTPHOST; }
  81. smtpaddress { return SMTPADDRESS; }
  82. antispam { return SPAMRESPONSE; }
  83. mda { return MDA; }
  84. bsmtp { return BSMTP; }
  85. lmtp { return LMTP; }
  86. pre(connect)? { return PRECONNECT; }
  87. post(connect)? { return POSTCONNECT; }
  88. netsec { return NETSEC; }
  89. interface { return INTERFACE; }
  90. monitor { return MONITOR; }
  91. plugin { return PLUGIN; }
  92. plugout { return PLUGOUT; }
  93. batchlimit { return BATCHLIMIT; }
  94. fetchlimit { return FETCHLIMIT; }
  95. expunge { return EXPUNGE; }
  96. properties { return PROPERTIES; }
  97. is { SETSTATE(NAME); return IS; }
  98. here { return HERE; }
  99. there { return THERE; }
  100. to { SETSTATE(NAME); return TO; }
  101. = { SETSTATE(NAME); return MAP; }
  102. nobouncemail |
  103. nouidl |
  104. nocheckalias |
  105. nodns |
  106. noenvelope |
  107. nokeep |
  108. noflush |
  109. nofetchall |
  110. norewrite |
  111. noforcecr |
  112. nostripcr |
  113. nopass8(bits)? |
  114. nodropstatus |
  115. nomimedec(ode)? {
  116.                    yyless(2);
  117.                    return NO;
  118.                 }
  119. no {return NO;}
  120. keep { return KEEP; }
  121. flush { return FLUSH; }
  122. fetchall { return FETCHALL; }
  123. rewrite { return REWRITE; }
  124. forcecr { return FORCECR; }
  125. stripcr { return STRIPCR; }
  126. pass8(bits)? { return PASS8BITS; }
  127. dropstatus { return DROPSTATUS; }
  128. mimedec(ode)?   { return MIMEDECODE; }
  129. dns { return DNS; }
  130. uidl { return UIDL; }
  131. ssl { return SSL; }
  132. sslkey { return SSLKEY; }
  133. sslcert { return SSLCERT; }
  134. checkalias { return CHECKALIAS; }
  135. limit { return LIMIT; }
  136. with {/* EMPTY */}
  137. and {/* EMPTY */}
  138. has {/* EMPTY */}
  139. wants {/* EMPTY */}
  140. options {/* EMPTY */}
  141. [;:,] {/* EMPTY */}
  142. (auto)|(AUTO) { yylval.proto = P_AUTO;  return PROTO; }
  143. (pop2)|(POP2) { yylval.proto = P_POP2;  return PROTO; }
  144. (sdps)|(SDPS)   { return SDPS; }
  145. (pop3)|(POP3) { yylval.proto = P_POP3;  return PROTO; }
  146. (imap-k4)|(IMAP-K4)   { yylval.proto = P_IMAP_K4;  return PROTO; }
  147. (imap-gss)|(IMAP-GSS) { yylval.proto = P_IMAP_GSS;  return PROTO; }
  148. (imap-crammd5)|(IMAP-CRAMMD5) { yylval.proto = P_IMAP_CRAM_MD5;  return PROTO; }
  149. (imap-login)|(IMAP-LOGIN) { yylval.proto = P_IMAP_LOGIN;  return PROTO; }
  150. (imap)|(IMAP) { yylval.proto = P_IMAP;  return PROTO; }
  151. (apop)|(APOP)   { yylval.proto = P_APOP;  return PROTO; }
  152. (etrn)|(ETRN)   { yylval.proto = P_ETRN;  return PROTO; }
  153. (kpop)|(KPOP) { return KPOP; }
  154. (#.*)?\?n { prc_lineno++; }   /* newline is ignored */
  155. -?[0-9]+ { yylval.number = atoi(yytext); return NUMBER; }
  156. [^=;:, trn]+ {
  157. char buf[MSGBUFSIZE];
  158. escapes(yytext, buf);
  159. yylval.sval = (char *) xstrdup(buf);
  160. return STRING;
  161. }
  162. [ tr]+ ; /* whitespace */
  163. %%
  164. void escapes(cp, tp)
  165. /* process standard C-style escape sequences in a string */
  166. const char *cp; /* source string with escapes */
  167. char *tp; /* target buffer for digested string */
  168. {
  169.     while (*cp)
  170.     {
  171. int cval = 0;
  172. if (*cp == '\' && strchr("0123456789xX", cp[1]))
  173. {
  174.     char *dp;
  175.     const char *hex = "00112233445566778899aAbBcCdDeEfF";
  176.     int dcount = 0;
  177.     if (*++cp == 'x' || *cp == 'X')
  178. for (++cp; (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++)
  179.     cval = (cval * 16) + (dp - hex) / 2;
  180.     else if (*cp == '0')
  181. while (strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3))
  182.     cval = (cval * 8) + (*cp++ - '0');
  183.     else
  184. while ((strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3))
  185.     cval = (cval * 10) + (*cp++ - '0');
  186. }
  187. else if (*cp == '\') /* C-style character escapes */
  188. {
  189.     switch (*++cp)
  190.     {
  191.     case '\': cval = '\'; break;
  192.     case 'n': cval = 'n'; break;
  193.     case 't': cval = 't'; break;
  194.     case 'b': cval = 'b'; break;
  195.     case 'r': cval = 'r'; break;
  196.     default: cval = *cp;
  197.     }
  198.     cp++;
  199. }
  200. else
  201.     cval = *cp++;
  202. *tp++ = cval;
  203.     }
  204.     *tp = '';
  205. }