[v2 tools 1/2] widl: handle "midl_pragma warning" statement in parser

Sergei Bolotov bolotov.s.s at yandex.ru
Tue Mar 29 15:06:44 CDT 2016


Signed-off-by: Sergei Bolotov <bolotov.s.s at yandex.ru>
---
 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,
-- 
1.9.1




More information about the wine-patches mailing list