Module: wine Branch: master Commit: 646dfe746d0842c882df33fb0f3ebedc2d6095bd URL: http://source.winehq.org/git/wine.git/?a=commit;h=646dfe746d0842c882df33fb0f...
Author: Sergei Bolotov bolotov.s.s@yandex.ru Date: Tue Mar 29 23:06:44 2016 +0300
widl: Handle "midl_pragma warning" statement in parser.
Signed-off-by: Sergei Bolotov bolotov.s.s@yandex.ru Signed-off-by: Alexandre Julliard julliard@winehq.org
---
tools/widl/parser.l | 1 + tools/widl/parser.y | 31 ++++++++++++++++++++++++++++++- tools/widl/widltypes.h | 7 +++++++ 3 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 5c2dcab..c0b2fcd 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -164,6 +164,7 @@ UUID *parse_uuid(const char *u) yy_pop_state(); } <PP_PRAGMA>[^\n]* parser_lval.str = xstrdup(yytext); yy_pop_state(); return aPRAGMA; +<INITIAL>^{ws}*midl_pragma{ws}+warning return tPRAGMA_WARNING; <INITIAL,ATTR>" yy_push_state(QUOTE); cbufidx = 0; <QUOTE>" { yy_pop_state(); diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 7de7567..3131e0d 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -83,6 +83,7 @@ static declarator_t *make_declarator(var_t *var); static type_t *make_safearray(type_t *type); static typelib_t *make_library(const char *name, const attr_list_t *attrs); static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type); +static warning_list_t *append_warning(warning_list_t *, int);
static type_t *reg_typedefs(decl_spec_t *decl_spec, var_list_t *names, attr_list_t *attrs); static type_t *find_type_or_error(const char *name, int t); @@ -148,6 +149,8 @@ static struct namespace *current_namespace = &global_namespace; declarator_list_t *declarator_list; statement_t *statement; statement_list_t *stmt_list; + warning_t *warning; + warning_list_t *warning_list; ifref_t *ifref; ifref_list_t *ifref_list; char *str; @@ -224,6 +227,7 @@ static struct namespace *current_namespace = &global_namespace; %token tOUT %token tPARTIALIGNORE tPASCAL %token tPOINTERDEFAULT +%token tPRAGMA_WARNING %token tPROGID tPROPERTIES %token tPROPGET tPROPPUT tPROPPUTREF %token tPROXY tPTR @@ -291,8 +295,9 @@ static struct namespace *current_namespace = &global_namespace; %type <uuid> uuid_string %type <import> import_start %type <typelib> library_start librarydef -%type <statement> statement typedef +%type <statement> statement typedef pragma_warning %type <stmt_list> gbl_statements imp_statements int_statements +%type <warning_list> warnings
%left ',' %right '?' ':' @@ -373,6 +378,15 @@ statement: | import { $$ = make_statement_import($1); } | typedef ';' { $$ = $1; } | aPRAGMA { $$ = make_statement_pragma($1); } + | pragma_warning { $$ = NULL; } + ; + +pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')' { $$ = NULL; } + ; + +warnings: + aNUM { $$ = append_warning(NULL, $1); } + | warnings aNUM { $$ = append_warning($1, $2); } ;
typedecl: @@ -1413,6 +1427,21 @@ static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type) return ptrchain; }
+static warning_list_t *append_warning(warning_list_t *list, int num) +{ + warning_t *entry; + + if(!list) + { + list = xmalloc( sizeof(*list) ); + list_init( list ); + } + entry = xmalloc( sizeof(*entry) ); + entry->num = num; + list_add_tail( list, &entry->entry ); + return list; +} + static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, const declarator_t *decl, int top) { diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 4d51312..1f4a9dd 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -51,6 +51,7 @@ typedef struct _user_type_t context_handle_t; typedef struct _user_type_t generic_handle_t; typedef struct _type_list_t type_list_t; typedef struct _statement_t statement_t; +typedef struct _warning_t warning_t;
typedef struct list attr_list_t; typedef struct list str_list_t; @@ -63,6 +64,7 @@ typedef struct list user_type_list_t; typedef struct list context_handle_list_t; typedef struct list generic_handle_list_t; typedef struct list statement_list_t; +typedef struct list warning_list_t;
enum attr_type { @@ -538,6 +540,11 @@ struct _statement_t { } u; };
+struct _warning_t { + int num; + struct list entry; +}; + typedef enum { SYS_WIN16, SYS_WIN32,