From 51b2da657aa42b214a9aedeef60670b5037bb387 Mon Sep 17 00:00:00 2001 From: Jeff Squyres Date: Fri, 15 Oct 2004 11:42:54 +0000 Subject: [PATCH] Fix a problem where internal flex buffers were not getting properly reset when scanning a second file. This commit was SVN r3158. --- src/mca/base/mca_base_parse_paramfile.c | 1 + src/mca/base/mca_base_parse_paramfile_lex.h | 3 ++- src/mca/base/mca_base_parse_paramfile_lex.l | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/mca/base/mca_base_parse_paramfile.c b/src/mca/base/mca_base_parse_paramfile.c index 904f6e4fd2..5b8c0c6799 100644 --- a/src/mca/base/mca_base_parse_paramfile.c +++ b/src/mca/base/mca_base_parse_paramfile.c @@ -31,6 +31,7 @@ int mca_base_parse_paramfile(const char *paramfile) } mca_base_parse_done = false; + mca_base_param_init_buffer(mca_base_yyin); while (!mca_base_parse_done) { val = mca_base_yylex(); switch (val) { diff --git a/src/mca/base/mca_base_parse_paramfile_lex.h b/src/mca/base/mca_base_parse_paramfile_lex.h index 36a3d2bf79..36f44a71a7 100644 --- a/src/mca/base/mca_base_parse_paramfile_lex.h +++ b/src/mca/base/mca_base_parse_paramfile_lex.h @@ -20,7 +20,8 @@ #include -extern int mca_base_yylex(void); +int mca_base_yylex(void); +int mca_base_param_init_buffer(FILE *file); extern FILE *mca_base_yyin; extern bool mca_base_parse_done; diff --git a/src/mca/base/mca_base_parse_paramfile_lex.l b/src/mca/base/mca_base_parse_paramfile_lex.l index 319dfd548c..a024578ab1 100644 --- a/src/mca/base/mca_base_parse_paramfile_lex.l +++ b/src/mca/base/mca_base_parse_paramfile_lex.l @@ -62,8 +62,27 @@ static int finish_parsing(void) return YY_NULL; } + static int mca_base_yywrap(void) { mca_base_parse_done = true; return 1; } + + +/* + * Ensure that we have a valid yybuffer to use. Specifically, if this + * scanner is invoked a second time, finish_parsing() (above) will + * have been executed, and the current buffer will have been freed. + * Flex doesn't recognize this fact because as far as it's concerned, + * its internal state was already initialized, so it thinks it should + * have a valid buffer. Hence, here we ensure to give it a valid + * buffer. + */ +int mca_base_param_init_buffer(FILE *file) +{ + YY_BUFFER_STATE buf = yy_create_buffer(file, YY_BUF_SIZE); + yy_switch_to_buffer(buf); + + return 0; +}