Hi, folks.  I was going to take another crack at the performance
optimizations in HtRegexList, but before that, I got down to tackling
some of the config parser bugs that had been nagging at us for quite
some time.  Please have a look at this patch, and test it as much as
possible, to see if it causes any problems.  The fixes in there are:

- improved error handling, gives file name and correct line number, even
  if using include files
- allows space before comment, because otherwise it would just complain
  about the "#" character and go on to parse the text after it as a
  definition
- allows config file with an unterminated line at end of file, by pushing
  an extra newline token to the parser at EOF
- parser correctly handles extra newline tokens, by moving this handling
  out of simple_expression, and into simple_expression_list and block, as
  simple_expression must return a new ConfigDefaults object and a newline
  token doesn't cut it (caused segfaults when dealing with fix above)

Apply using "patch -p0 < this-message-file".

--- htcommon/conf_lexer.lxx.orig        2003-12-14 07:40:12.000000000 -0600
+++ htcommon/conf_lexer.lxx     2004-04-22 15:47:48.000000000 -0500
@@ -41,6 +41,7 @@
 #define MAX_INCLUDE_DEPTH 10
 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
 String *name_stack[MAX_INCLUDE_DEPTH];
+int lineno_stack[MAX_INCLUDE_DEPTH];
 int include_stack_ptr = 0;
 %}
 
@@ -50,7 +51,7 @@ STRING                        [\x21-\xff]+
 BR_STRING              [^ \n\t<>]+
 %%
 
-^#.*\n                 /*   Ignore comments     */
+^[[:space:]]*#.*\n     /*   Ignore comments     */
 ^[[:space:]]*\n                /*   Ignore emty lines   */
 <*>[ \t]+              /*   Ignore spaces       */
 include[ \t]*:         BEGIN(incl);
@@ -157,6 +158,8 @@ include[ \t]*:              BEGIN(incl);
                        }
                        name_stack[include_stack_ptr-1] =
                                        new String(ParsedFilename.get());
+                       lineno_stack[include_stack_ptr-1] = yylineno;
+                       yylineno = 1;
                        yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) );
 
                        BEGIN(INITIAL);
@@ -164,10 +167,18 @@ include[ \t]*:            BEGIN(incl);
 
 <<EOF>>                {
                        if ( include_stack_ptr <= 0 )
+                           {
+                           static int termnext = 0;
+                           // fix to allow unterminated final line
+                           if (++termnext <= 1)
+                               return(T_NEWLINE);
+                           termnext = 0;       // in case we're called again
                            yyterminate();
+                           }
                        else
                            {
                            delete name_stack[include_stack_ptr-1];
+                           yylineno = lineno_stack[include_stack_ptr-1];
                            yy_delete_buffer( YY_CURRENT_BUFFER );
                            yy_switch_to_buffer(
                                 include_stack[--include_stack_ptr] );
@@ -183,7 +194,13 @@ include[ \t]*:             BEGIN(incl);
 
 \n                     
 <*>.|\n                { 
-       fprintf(stderr,"Unknown char in line %d: %s",yylineno,yytext);
-       // exit(1); // Seems to harsh!
+       HtConfiguration* config= HtConfiguration::config();
+       String str;
+       if (include_stack_ptr > 0)
+           str = *name_stack[include_stack_ptr-1];
+       else    // still at top level config
+           str = config->getFileName();
+       fprintf(stderr,"Unknown char in file %s line %d: 
%s\n",str.get(),yylineno,yytext);
+       // exit(1); // Seems too harsh!
        }
 %%
--- htcommon/conf_parser.yxx.orig       2003-11-22 07:40:17.000000000 -0600
+++ htcommon/conf_parser.yxx    2004-04-22 15:48:54.000000000 -0500
@@ -84,6 +84,7 @@ block:        simple_expression               {   
           //    ... : ...
           // </server>
        }
+        | T_NEWLINE    { /* Ignore empty lines */  }
 ;
 
 simple_expression:      T_KEYWORD T_DELIMITER T_STRING T_NEWLINE       { 
@@ -116,7 +117,6 @@ simple_expression:      T_KEYWORD T_DELI
                                    $$->value=new char[1];
                                    *$$->value='\0';
                                        }
-        | T_NEWLINE    { /* Ignore empty lines */  }
 ;
 
 complex_expression:    T_LEFT_BR T_KEYWORD T_DELIMITER T_STRING T_RIGHT_BR T_NEWLINE 
simple_expression_list T_LEFT_BR T_SLASH T_KEYWORD T_RIGHT_BR T_NEWLINE {
@@ -170,6 +170,7 @@ simple_expression_list:   simple_express
                                delete $2;
                                //$$=$1; //I think $$==$1
                        }
+                       | T_NEWLINE     { /* Ignore empty lines */  }
                       ;
 
 list:    T_STRING T_STRING                     { 
@@ -253,8 +254,17 @@ list:        T_STRING T_STRING                     { 
 int
 yyerror (char *s)  /* Called by yyparse on error */
 {
-extern int yylineno;   // I don't know what about included files
-   fprintf (stderr, "%s\nIn line %d\n",s,yylineno);
+extern int yylineno;
+extern int include_stack_ptr;
+extern String *name_stack[];
+   HtConfiguration* config= HtConfiguration::config();
+   String str;
+   if (include_stack_ptr > 0)
+       str = *name_stack[include_stack_ptr-1];
+   else        // still at top level config
+       str = config->getFileName();
+   //fprintf (stderr, "%s\nIn line %d\n",s,yylineno);
+   fprintf(stderr,"Error in file %s line %d: %s\n",str.get(),yylineno,s);
    // exit(1);
    return -1;
 }


-- 
Gilles R. Detillieux              E-mail: <[EMAIL PROTECTED]>
Spinal Cord Research Centre       WWW:    http://www.scrc.umanitoba.ca/
Dept. Physiology, U. of Manitoba  Winnipeg, MB  R3E 3J7  (Canada)


-------------------------------------------------------
This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
For a limited time only, get FREE Ground shipping on all orders of $35
or more. Hurry up and shop folks, this offer expires April 30th!
http://www.thinkgeek.com/freeshipping/?cpg=12297
_______________________________________________
ht://Dig Developer mailing list:
[EMAIL PROTECTED]
List information (subscribe/unsubscribe, etc.)
https://lists.sourceforge.net/lists/listinfo/htdig-dev

Reply via email to