%x incl %x module_lex_state %x worker_lex_state %x classifier_lex_state %{ #define NO_GMIME #include "config.h" #include "cfg_file.h" #include "cfg_yacc.h" #define ECHO do {} while(0) #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int line_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; int nested_depth = 0; extern struct config_file *yacc_cfg; %} %option noyywrap %option yylineno %% [ \t]*#.* /* ignore comments */; .include BEGIN(incl); .module BEGIN(module_lex_state); worker BEGIN(worker_lex_state); return WORKER; composites BEGIN(module_lex_state);return COMPOSITES; tempdir return TEMPDIR; pidfile return PIDFILE; view return VIEW; ip return IP; client_ip return CLIENT_IP; from return FROM; symbols return SYMBOLS; skip_check return SKIP_CHECK; error_time return ERROR_TIME; dead_time return DEAD_TIME; maxerrors return MAXERRORS; reconnect_timeout return RECONNECT_TIMEOUT; connect_timeout return CONNECT_TIMEOUT; protocol return PROTOCOL; memcached return MEMCACHED; servers return SERVERS; modules return MODULES; module_path return MODULE_PATH; settings return SETTINGS; user_settings return USER_SETTINGS; domain_settings return DOMAIN_SETTINGS; maxfiles return MAXFILES; maxcore return MAXCORE; filters return FILTERS; factors return FACTORS; grow_factor return GROW_FACTOR; metric return METRIC; name return NAME; required_score return REQUIRED_SCORE; reject_score return REJECT_SCORE; function return FUNCTION; cache_file return CACHE_FILE; control return CONTROL; password return PASSWORD; lmtp return LMTP; raw_mode return RAW_MODE; enabled return ENABLED; delivery return DELIVERY; agent return AGENT; classifier BEGIN(classifier_lex_state); return CLASSIFIER; logging return LOGGING; log_type return LOG_TYPE; console return LOG_TYPE_CONSOLE; syslog return LOG_TYPE_SYSLOG; file return LOG_TYPE_FILE; log_urls return LOG_URLS; log_level return LOG_LEVEL; DEBUG return LOG_LEVEL_DEBUG; INFO return LOG_LEVEL_INFO; WARNING return LOG_LEVEL_WARNING; ERROR return LOG_LEVEL_ERROR; log_facility return LOG_FACILITY; log_file return LOG_FILENAME; log_buffer return LOG_BUFFER; debug_ip return DEBUG_IP; profile_file return PROFILE_FILE; statfile_pool_size return STATFILE_POOL_SIZE; \{ return OBRACE; \} return EBRACE; ; return SEMICOLON; , return COMMA; = return EQSIGN; yes|YES|no|NO|[yY]|[nN] yylval.flag=parse_flag(yytext); return FLAG; \n /* ignore EOL */; [ \t]+ /* ignore whitespace */; \".+[^\\]\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; unescape_quotes(yylval.string); return QUOTEDSTRING; \" return QUOTE; \$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE; [0-9]+ yylval.number=strtol(yytext, NULL, 10); return NUMBER; -?[0-9]+\.?[0-9]* yylval.fract=strtod(yytext, NULL); return FRACT; [0-9]+[kKmMgG]? yylval.limit=parse_limit(yytext); return SIZELIMIT; [0-9]+[mMsShHdD]? yylval.seconds=parse_seconds(yytext); return SECONDS; [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} yylval.string=strdup(yytext); return IPADDR; [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2} yylval.string=strdup(yytext); return IPNETWORK; [*a-zA-Z0-9.-]+:[0-9]{1,5} yylval.string=strdup(yytext); return HOSTPORT; [a-zA-Z<][a-zA-Z@+>_-]* yylval.string=strdup(yytext); return STRING; \/[^/\n]+\/ yylval.string=strdup(yytext); return REGEXP; [a-zA-Z0-9].[a-zA-Z0-9\/.-]+ yylval.string=strdup(yytext); return DOMAINNAME; [ \t]* /* eat the whitespace */ [^ \t\n]+ { /* got the include file name */ /* got the include file name */ /* Handle XML case */ int len = strlen (yytext); if (strcmp (yytext + len - 4, ".xml") == 0) { if (!read_xml_config (yacc_cfg, yytext)) { yyerror ("invalid xml detected"); } BEGIN(INITIAL); } if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { yyerror ("yylex: includes nested too deeply" ); return -1; } line_stack[include_stack_ptr] = yylineno; include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yylineno = 1; yyin = fopen (yytext, "r"); if (!yyin) { yyerror ("yylex: cannot open include file"); return -1; } yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE)); BEGIN(INITIAL); } <> { if ( --include_stack_ptr < 0 ) { include_stack_ptr = 0; yylineno = 1; yyterminate (); } else { yy_delete_buffer (YY_CURRENT_BUFFER); yy_switch_to_buffer (include_stack[include_stack_ptr] ); yylineno = line_stack[include_stack_ptr]; } } \n /* ignore EOL */; [ \t]+ /* ignore whitespace */; [ \t]*#.* /* ignore comments */; \'[a-zA-Z0-9_-]+\' yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return MODULE_OPT; \{ nested_depth ++; return OBRACE; \} if (--nested_depth == 0) { BEGIN(INITIAL); } return EBRACE; \; return SEMICOLON; = return EQSIGN; \$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE; [a-zA-Z0-9_%-]+ yylval.string=strdup(yytext); return PARAM; \".+[^\\]\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; unescape_quotes(yylval.string); return QUOTEDSTRING; \n /* ignore EOL */; [ \t]+ /* ignore whitespace */; [ \t]*#.* /* ignore comments */; \{ nested_depth ++; return OBRACE; \} if (--nested_depth == 0) { BEGIN(INITIAL); } return EBRACE; \; return SEMICOLON; = return EQSIGN; type return TYPE; bind_socket return BINDSOCK; count return COUNT; [0-9]+ yylval.number=strtol(yytext, NULL, 10); return NUMBER; [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} yylval.string=strdup(yytext); return IPADDR; [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2} yylval.string=strdup(yytext); return IPNETWORK; [*a-zA-Z0-9.-]+:[0-9]{1,5} yylval.string=strdup(yytext); return HOSTPORT; [a-zA-Z<][a-zA-Z@+>_-]* yylval.string=strdup(yytext); return STRING; \$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE; \".+[^\\]\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; unescape_quotes(yylval.string); return QUOTEDSTRING; \n /* ignore EOL */; [ \t]+ /* ignore whitespace */; [ \t]*#.* /* ignore comments */; \{ nested_depth ++; return OBRACE; \} if (--nested_depth == 0) { BEGIN(INITIAL); } return EBRACE; \; return SEMICOLON; = return EQSIGN; type return TYPE; bind_socket return BINDSOCK; count return COUNT; statfile return STATFILE; symbol return SYMBOL; path return PATH; size return SIZE; tokenizer return TOKENIZER; section return SECTION; autolearn return AUTOLEARN; min_mark return MIN_MARK; max_mark return MAX_MARK; binlog return BINLOG; binlog_master return BINLOG_MASTER; binlog_rotate return BINLOG_ROTATE; normalizer return NORMALIZER; [0-9]+ yylval.number=strtol(yytext, NULL, 10); return NUMBER; -?[0-9]+\.?[0-9]* yylval.fract=strtod(yytext, NULL); return FRACT; [0-9]+[kKmMgG]? yylval.limit=parse_limit(yytext); return SIZELIMIT; [0-9]+[mMsShHdD]? yylval.seconds=parse_seconds(yytext); return SECONDS; \$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE; [a-zA-Z0-9_%-]+ yylval.string=strdup(yytext); return PARAM; \".+[^\\]\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; unescape_quotes(yylval.string); return QUOTEDSTRING; %% /* * vi:ts=4 */