Finish cleaning up whitespace differences.
authorCarl Worth <cworth@cworth.org>
Thu, 20 May 2010 21:38:06 +0000 (14:38 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 20 May 2010 21:38:06 +0000 (14:38 -0700)
The last remaining thing here was that when a line ended with a macro,
and the parser looked ahead to the newline token, the lexer was
printing that newline before the parser printed the expansion of the
macro.

The fix is simple, just make the lexer tell the parser that a newline
is needed, and the parser can wait until reducing a production to
print that newline.

With this, we now pass the entire test suite with simply "diff -u", so
we no longer have any diff options hiding whitespace bugs from
us. Hurrah!

glcpp-lex.l
glcpp-parse.y
glcpp.h

index 13e4d6f0ef1f25e3f5870201ae348772b618434d..114b59f04567a074ca875ad4601046b05bc3ed53 100644 (file)
@@ -173,12 +173,7 @@ TOKEN              [^[:space:](),]+
 }
 
 \n {
-       /* XXX: Printing here (rather than in a parser production)
-        * *and* frobbing a bit of the parser state here are both ugly
-        * things. But all my attempts to avoid this by returning a
-        * NEWLINE token here have led to even more ugly things. */
-       printf ("\n");
-       yyextra->just_printed_separator = 1;
+       yyextra->need_newline = 1;
 }
 
 {HSPACE}+
index 93713a3f0cae1328e8708aa5e43f6eec8131ea55..ddc2a258cd8736c9b2c8392520c6f76239735f8e 100644 (file)
@@ -171,6 +171,12 @@ input:
 
                if ($2)
                        talloc_free ($2);
+
+               if (parser->need_newline) {
+                       printf ("\n");
+                       parser->just_printed_separator = 1;
+                       parser->need_newline = 0;
+               }
        }
 ;
 
@@ -564,6 +570,7 @@ glcpp_parser_create (void)
        parser->expansions = NULL;
 
        parser->just_printed_separator = 1;
+       parser->need_newline = 0;
 
        return parser;
 }
@@ -577,6 +584,8 @@ glcpp_parser_parse (glcpp_parser_t *parser)
 void
 glcpp_parser_destroy (glcpp_parser_t *parser)
 {
+       if (parser->need_newline)
+               printf ("\n");
        glcpp_lex_destroy (parser->scanner);
        hash_table_dtor (parser->defines);
        talloc_free (parser);
diff --git a/glcpp.h b/glcpp.h
index c25e29c6883db64b5bfd61075f95f2fba4896da0..2e93cb981d8470612c985e6ed334e98a543979c8 100644 (file)
--- a/glcpp.h
+++ b/glcpp.h
@@ -102,6 +102,7 @@ struct glcpp_parser {
        struct hash_table *defines;
        expansion_node_t *expansions;
        int just_printed_separator;
+       int need_newline;
 };
 
 void