Make the lexer reentrant (to avoid "still reachable" memory).
authorCarl Worth <cworth@cworth.org>
Mon, 10 May 2010 18:52:29 +0000 (11:52 -0700)
committerCarl Worth <cworth@cworth.org>
Mon, 10 May 2010 18:52:29 +0000 (11:52 -0700)
This allows the final program to be 100% "valgrind clean", (freeing
all memory that it allocates). This will make it much easier to ensure
that any allocation that parser actions perform are also cleaned up.

glcpp-lex.l
glcpp-parse.y
glcpp.c

index 9779f2b92e601c1bd92274332652a1d9df3b78d2..276f50ddfe351c947d601c75ce7da2791d31d097 100644 (file)
@@ -28,7 +28,7 @@
 #include "glcpp-parse.h"
 %}
 
-%option noyywrap
+%option reentrant noyywrap
 
 %%
 
index 739b2935b3f11b09680e81f84b4612957c1612d0..9acd549b24c96c35b773756cb6b7fb6fd58a3f30 100644 (file)
 #define YYSTYPE int
 
 void
-yyerror (const char *error);
+yyerror (const char *error, void *scanner);
 
 %}
 
+%parse-param {void *scanner}
+%lex-param {void *scanner}
+
 %token TOKEN
 
 %%
@@ -51,7 +54,7 @@ token:                TOKEN
 %%
 
 void
-yyerror (const char *error)
+yyerror (const char *error, void *scanner)
 {
        fprintf (stderr, "Parse error: %s\n", error);
 }
diff --git a/glcpp.c b/glcpp.c
index 09641ceeadbe3c5aed45302db476915abf30950f..90a0e89cfa6b21fa90e322f39de5520e7d98766d 100644 (file)
--- a/glcpp.c
+++ b/glcpp.c
 int
 main (void)
 {
-       return yyparse ();
+       int ret;
+       void *scanner;
+
+       yylex_init (&scanner);
+       ret = yyparse (scanner);
+       yylex_destroy (scanner);
+
+       return ret;
 }