From: R��mi Bernon rbernon@codeweavers.com
--- tools/widl/parser.h | 2 +- tools/widl/parser.l | 32 ++++++++++++++++++++------------ tools/widl/parser.y | 15 ++++----------- 3 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/tools/widl/parser.h b/tools/widl/parser.h index 5f6b8c091e8..270db49189b 100644 --- a/tools/widl/parser.h +++ b/tools/widl/parser.h @@ -35,7 +35,7 @@ extern int parser_debug; extern int yy_flex_debug;
extern int import_stack_ptr; -int do_import(char *fname); +void push_import(char *fname); void abort_import(void); void pop_import(void);
diff --git a/tools/widl/parser.l b/tools/widl/parser.l index de8cae93b2f..6fd1b85ee19 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -513,7 +513,7 @@ void pop_import(void) { int ptr = import_stack_ptr-1;
- fclose(yyin); + if (yyin) fclose( yyin ); yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( import_stack[ptr].state ); if (temp_name) { @@ -526,7 +526,7 @@ void pop_import(void) import_stack_ptr--; }
-int do_import(char *fname) +void push_import(char *fname) { FILE *f; char *path, *name; @@ -534,8 +534,25 @@ int do_import(char *fname) int ptr = import_stack_ptr; int ret, fd;
+ if (import_stack_ptr == MAX_IMPORT_DEPTH) + error_loc("Exceeded max import depth\n"); + + import_stack[ptr].state = YY_CURRENT_BUFFER; + import_stack[ptr].temp_name = temp_name; + import_stack[ptr].input_name = input_name; + import_stack[ptr].line_number = line_number; + import_stack_ptr++; + temp_name = NULL; + LIST_FOR_EACH_ENTRY( import, &imports, struct import, entry ) - if (!strcmp( import->name, fname )) return 0; /* already imported */ + { + if (!strcmp( import->name, fname )) + { + /* already imported, scan an empty buffer for <<EOF>> */ + yy_scan_string( "" ); + return; + } + }
import = xmalloc( sizeof(struct import) ); import->name = xstrdup( fname ); @@ -548,13 +565,6 @@ int do_import(char *fname) else if (!(path = wpp_find_include( fname, input_name ))) error_loc("Unable to open include file %s\n", fname);
- if (import_stack_ptr == MAX_IMPORT_DEPTH) - error_loc("Exceeded max import depth\n"); - - import_stack[ptr].temp_name = temp_name; - import_stack[ptr].input_name = input_name; - import_stack[ptr].line_number = line_number; - import_stack_ptr++; input_name = path; line_number = 1;
@@ -570,9 +580,7 @@ int do_import(char *fname) if((f = fopen(temp_name, "r")) == NULL) error_loc("Unable to open %s\n", temp_name);
- import_stack[ptr].state = YY_CURRENT_BUFFER; yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE)); - return 1; }
void abort_import(void) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 044279f9906..9227fd633ef 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -333,7 +333,7 @@ int parser_lex( PARSER_STYPE *yylval ); %type <str> libraryhdr callconv cppquote importlib import %type <str> typename m_typename %type <uuid> uuid_string -%type <import> import_start +%type <str> import_start %type <typelib> library_start librarydef %type <statement> statement typedef pragma_warning %type <stmt_list> gbl_statements imp_statements int_statements @@ -486,17 +486,10 @@ typedecl:
cppquote: tCPPQUOTE '(' aSTRING ')' { $$ = $3; } ; -import_start: tIMPORT aSTRING ';' { $$ = xmalloc(sizeof(struct _import_t)); - $$->name = $2; - $$->import_performed = do_import($2); - if (!$$->import_performed) yychar = aEOF; - } - ;
-import: import_start imp_statements aEOF { $$ = $1->name; - if ($1->import_performed) pop_import(); - free($1); - } +import_start: tIMPORT aSTRING ';' { $$ = $2; push_import($2); } + ; +import: import_start imp_statements aEOF { pop_import(); } ;
importlib: tIMPORTLIB '(' aSTRING ')'