From: R��mi Bernon rbernon@codeweavers.com
--- tools/widl/parser.h | 4 +- tools/widl/parser.l | 91 ++++++++++++++++++++++++--------------------- tools/widl/widl.c | 1 + 3 files changed, 50 insertions(+), 46 deletions(-)
diff --git a/tools/widl/parser.h b/tools/widl/parser.h index 270db49189b..0c661b55e85 100644 --- a/tools/widl/parser.h +++ b/tools/widl/parser.h @@ -34,13 +34,11 @@ extern char *parser_text; extern int parser_debug; extern int yy_flex_debug;
-extern int import_stack_ptr; +extern int parse_only; void push_import(char *fname); void abort_import(void); void pop_import(void);
-#define parse_only import_stack_ptr - int is_type(const char *name);
int do_warning(const char *toggle, warning_list_t *wnum); diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 6fd1b85ee19..8016bdc1fcc 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -81,14 +81,16 @@ static void switch_to_acf(void);
static warning_list_t *disabled_warnings = NULL;
-#define MAX_IMPORT_DEPTH 20 -struct { - YY_BUFFER_STATE state; - char *input_name; - int line_number; - char *temp_name; -} import_stack[MAX_IMPORT_DEPTH]; -int import_stack_ptr = 0; +struct import_state +{ + YY_BUFFER_STATE buffer; + char *input_name; + int line_number; + char *temp_name; + struct list entry; +}; +static struct list import_stack = LIST_INIT( import_stack ); +int parse_only = 0;
struct import { @@ -160,7 +162,8 @@ struct uuid *parse_uuid(const char *u) } <PP_PRAGMA>midl_echo[^\n]* yyless(9); yy_pop_state(); return tCPPQUOTE; <PP_PRAGMA>winrt[^\n]* { - if(import_stack_ptr) { + if (!list_empty( &import_stack )) + { if(!winrt_mode) error_loc("winrt IDL file imported in non-winrt mode\n"); }else { @@ -235,7 +238,7 @@ SAFEARRAY{ws}*/( return tSAFEARRAY; <INITIAL,ATTR>... return ELLIPSIS; <INITIAL,ATTR>. return yytext[0]; <<EOF>> { - if (import_stack_ptr) + if (!list_empty( &import_stack )) return aEOF; if (acf_name) { @@ -511,37 +514,44 @@ static char *get_buffered_cstring(void)
void pop_import(void) { - int ptr = import_stack_ptr-1; - - if (yyin) fclose( yyin ); - yy_delete_buffer( YY_CURRENT_BUFFER ); - yy_switch_to_buffer( import_stack[ptr].state ); - if (temp_name) { - unlink(temp_name); - free(temp_name); - } - temp_name = import_stack[ptr].temp_name; - input_name = import_stack[ptr].input_name; - line_number = import_stack[ptr].line_number; - import_stack_ptr--; + struct list *entry = list_head( &import_stack ); + struct import_state *state; + + assert(entry); + + state = LIST_ENTRY( entry, struct import_state, entry ); + list_remove( &state->entry ); + parse_only = !list_empty( &import_stack ); + + if (yyin) fclose( yyin ); + yy_delete_buffer( YY_CURRENT_BUFFER ); + if (temp_name) unlink( temp_name ); + free( temp_name ); + + temp_name = state->temp_name; + input_name = state->input_name; + line_number = state->line_number; + yy_switch_to_buffer( state->buffer ); + free( state ); }
void push_import(char *fname) { + struct import_state *state; FILE *f; char *path, *name; struct import *import; - int ptr = import_stack_ptr; int ret, fd;
- if (import_stack_ptr == MAX_IMPORT_DEPTH) - error_loc("Exceeded max import depth\n"); + state = xmalloc( sizeof(struct import_state )); + list_add_head( &import_stack, &state->entry ); + parse_only = !list_empty( &import_stack );
- 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++; + state->buffer = YY_CURRENT_BUFFER; + state->temp_name = temp_name; + state->input_name = input_name; + state->line_number = line_number; + input_name = NULL; temp_name = NULL;
LIST_FOR_EACH_ENTRY( import, &imports, struct import, entry ) @@ -585,29 +595,25 @@ void push_import(char *fname)
void abort_import(void) { - int ptr; - - for (ptr=0; ptr<import_stack_ptr; ptr++) - unlink(import_stack[ptr].temp_name); + while (!list_empty( &import_stack )) pop_import(); }
static void switch_to_acf(void) { - int ptr = import_stack_ptr; int ret, fd; - char *name; FILE *f;
- assert(import_stack_ptr == 0); + if (yyin) fclose( yyin ); + yy_delete_buffer( YY_CURRENT_BUFFER ); + if (temp_name) unlink( temp_name ); + free( temp_name );
input_name = acf_name; acf_name = NULL; line_number = 1;
- fd = make_temp_file( "widl-acf", NULL, &name ); - temp_name = name; - if (!(f = fdopen(fd, "wt"))) - error("Could not open fd %s for writing\n", name); + fd = make_temp_file( "widl-acf", NULL, &temp_name ); + if (!(f = fdopen( fd, "wt" ))) error( "Could not open fd %s for writing\n", temp_name );
ret = wpp_parse(input_name, f); fclose(f); @@ -616,7 +622,6 @@ static void switch_to_acf(void) 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)); }
diff --git a/tools/widl/widl.c b/tools/widl/widl.c index 84cb30ac7a4..c339fc30e98 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -898,6 +898,7 @@ int main(int argc,char *argv[]) init_types(); ret = parser_parse( &ctx );
+ abort_import(); fclose(parser_in);
if(ret) {