--- monit.orig/l.l 2004-02-06 21:02:20.000000000 +0100 +++ monit/l.l 2004-02-13 15:02:12.000000000 +0100 @@ -51,21 +51,32 @@ #include "monitor.h" #include "y.tab.h" -#define COMPAT_YY_MAX_DEPTH 10 +#define MAX_STACK_DEPTH 10 - int compat_yy_stack_ptr=0; - YY_BUFFER_STATE compat_yy_stack[COMPAT_YY_MAX_DEPTH]; - void compat_yypush_buffer_state(YY_BUFFER_STATE); - void compat_yypop_buffer_state(void); + int buffer_stack_ptr=0; + + struct buffer_stack_s { + int lineno; + char *currentfile; + YY_BUFFER_STATE buffer; + } buffer_stack[MAX_STACK_DEPTH]; + int lineno= 1; + int arglineno= 1; + char *currentfile; + char *argcurrentfile; + char *argyytext=NULL; /* Prototypes */ - void yyerror(const char*); - static char *handle_quoted_string(char *); - void steplinenobycr(char *); + extern void yyerror(const char*,...); + static void steplinenobycr(char *); + static void save_arg(void); static void include_file(char *); + static char *handle_quoted_string(char *); + static void push_buffer_state(YY_BUFFER_STATE, char*); + static void pop_buffer_state(void); %} @@ -261,92 +272,91 @@ } {number} { - yylval.number= atoi(yytext); return NUMBER; + yylval.number= atoi(yytext); + save_arg(); return NUMBER; } {real} { - yylval.real= atof(yytext); return REAL; + yylval.real= atof(yytext); + save_arg(); return REAL; } {real}{percent} { if(sscanf(yytext, "%f%*s", &yylval.real) != 1) { - log("%s: Internal lexer error, parsing '%s'\n", - prog, yytext); + yyerror("internal lexer error, parsing '%s'"); exit(1); } - return PERCENT; + save_arg(); return PERCENT; } [a-zA-Z0-9]{str} { yylval.string= xstrdup(yytext); - return STRING; + save_arg(); return STRING; } \"[/][^\"\n]*\" { yylval.string= handle_quoted_string(yytext); - return PATH; + save_arg(); return PATH; } \'[/][^\'\n]*\' { yylval.string= handle_quoted_string(yytext); - return PATH; + save_arg(); return PATH; } \"[^\"]*\" { steplinenobycr(yytext); yylval.string= handle_quoted_string(yytext); - return STRING; + save_arg(); return STRING; } \'[^\']*\' { steplinenobycr(yytext); yylval.string= handle_quoted_string(yytext); - return STRING; + save_arg(); return STRING; } address@hidden { yylval.string= xstrdup(yytext); - return MAILADDR; + save_arg(); return MAILADDR; } [/]{str} { yylval.string= xstrdup(yytext); - return PATH; + save_arg(); return PATH; } "/" { yylval.string= xstrdup(yytext); - return PATH; + save_arg(); return PATH; } "from:"[ address@hidden { char *p= yytext+strlen("from:"); yylval.string = trim(xstrdup(p)); - return MAILFROM; + save_arg(); return MAILFROM; } "subject:"[^}\n]* { char *p= yytext+strlen("subject:"); yylval.string = trim(xstrdup(p)); - return MAILSUBJECT; + save_arg(); return MAILSUBJECT; } "message:"[^}]* { char *p= yytext+strlen("message:"); steplinenobycr(yytext); yylval.string = trim(xstrdup(p)); - return MAILBODY; + save_arg(); return MAILBODY; } {hostname} { yylval.string = xstrdup(yytext); - return STRING; + save_arg(); return STRING; } [\"\'] { - - yyerror("Unbalanced quotes"); - + yyerror("unbalanced quotes"); } { @@ -360,23 +370,23 @@ {str} { yylval.string= xstrdup(yytext); BEGIN(INITIAL); - return SERVICENAME; + save_arg(); return SERVICENAME; } \"{str}\" { yylval.string= handle_quoted_string(yytext); BEGIN(INITIAL); - return SERVICENAME; + save_arg(); return SERVICENAME; } \'{str}\' { yylval.string= handle_quoted_string(yytext); BEGIN(INITIAL); - return SERVICENAME; + save_arg(); return SERVICENAME; } [\"\'] { - yyerror("Unbalanced quotes"); + yyerror("unbalanced quotes"); } } @@ -391,7 +401,7 @@ {str} { yylval.string= xstrdup(yytext); - return SERVICENAME; + save_arg(); return SERVICENAME; } [ \n\t]+[^,] { @@ -417,16 +427,16 @@ \'[^\']*\' { steplinenobycr(yytext); yylval.string= handle_quoted_string(yytext); - return STRING; + save_arg(); return STRING; } \' { - yyerror("Unbalanced quotes"); + yyerror("unbalanced quotes"); } [^ \t\n\"]+ { yylval.string= xstrdup(yytext); - return STRING; + save_arg(); return STRING; } } @@ -463,7 +473,7 @@ <> { - compat_yypop_buffer_state(); + pop_buffer_state(); if ( !YY_CURRENT_BUFFER ) { @@ -478,7 +488,7 @@ * necessary whenever a yytext has an unknown number of CRs. */ -void steplinenobycr(char *string) { +static void steplinenobycr(char *string) { char *pos= string; @@ -531,43 +541,66 @@ yyin=fopen( globbuf.gl_pathv[i], "r" ); - if ( ! yyin ) - yyerror( "error including file" ); + if ( ! yyin ) { + + yyerror( "failed to include file" ); + + } else { - compat_yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE )); - + push_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ), + globbuf.gl_pathv[i]); + + } } globfree(&globbuf); } -void compat_yypush_buffer_state(YY_BUFFER_STATE buffer) { +static void push_buffer_state(YY_BUFFER_STATE buffer, char *filename) { - if ( compat_yy_stack_ptr >= COMPAT_YY_MAX_DEPTH ) + if ( buffer_stack_ptr >= MAX_STACK_DEPTH ) { - yyerror( "Includes nested too deeply" ); + yyerror( "include files are nested too deeply" ); exit( 1 ); } - compat_yy_stack[compat_yy_stack_ptr++] = - YY_CURRENT_BUFFER; - + buffer_stack[buffer_stack_ptr].lineno=lineno; + buffer_stack[buffer_stack_ptr].currentfile=currentfile; + buffer_stack[buffer_stack_ptr].buffer=YY_CURRENT_BUFFER; + + buffer_stack_ptr++; + + lineno=1; + currentfile=xstrdup(filename); + yy_switch_to_buffer(buffer); BEGIN(INITIAL); } -void compat_yypop_buffer_state(void) { +static void pop_buffer_state(void) { - if ( --compat_yy_stack_ptr < 0 ) { + if ( --buffer_stack_ptr < 0 ) { yy_delete_buffer( YY_CURRENT_BUFFER ); } else { + lineno=buffer_stack[buffer_stack_ptr].lineno; + + FREE(currentfile); + currentfile=buffer_stack[buffer_stack_ptr].currentfile; + yy_delete_buffer( YY_CURRENT_BUFFER ); - yy_switch_to_buffer( compat_yy_stack[compat_yy_stack_ptr] ); + yy_switch_to_buffer( buffer_stack[buffer_stack_ptr].buffer ); } } + +static void save_arg(void) { + arglineno=lineno; + argcurrentfile=currentfile; + FREE(argyytext); + argyytext=xstrdup(yytext); +}