Alexandre Julliard : widl: Add support for #pragma directives.

Alexandre Julliard julliard at winehq.org
Mon Nov 4 13:59:20 CST 2013


Module: wine
Branch: master
Commit: cc02e15220cdf082b3fc19e585f7bab11e523198
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cc02e15220cdf082b3fc19e585f7bab11e523198

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Nov  4 14:13:06 2013 +0100

widl: Add support for #pragma directives.

---

 tools/widl/header.c     |    3 +++
 tools/widl/parser.l     |    4 ++++
 tools/widl/parser.y     |   11 ++++++++++-
 tools/widl/widltypes.h  |    1 +
 tools/widl/write_msft.c |    1 +
 5 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 2f275c7..bd9f21c 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -1342,6 +1342,7 @@ static void write_imports(FILE *header, const statement_list_t *stmts)
       case STMT_TYPEDEF:
       case STMT_MODULE:
       case STMT_CPPQUOTE:
+      case STMT_PRAGMA:
       case STMT_DECLARATION:
         /* not processed here */
         break;
@@ -1376,6 +1377,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
       case STMT_TYPEDEF:
       case STMT_MODULE:
       case STMT_CPPQUOTE:
+      case STMT_PRAGMA:
       case STMT_DECLARATION:
         /* not processed here */
         break;
@@ -1428,6 +1430,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
         break;
       case STMT_IMPORTLIB:
       case STMT_MODULE:
+      case STMT_PRAGMA:
         /* not included in header */
         break;
       case STMT_IMPORT:
diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index fb61e21..b911186 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -37,6 +37,7 @@ double	[0-9]+\.[0-9]+([eE][+-]?[0-9]+)*
 %x WSTRQUOTE
 %x ATTR
 %x PP_LINE
+%x PP_PRAGMA
 %x SQUOTE
 
 %{
@@ -125,6 +126,7 @@ UUID *parse_uuid(const char *u)
  **************************************************************************
  */
 %%
+<INITIAL>^{ws}*\#{ws}*pragma{ws}+ yy_push_state(PP_PRAGMA);
 <INITIAL,ATTR>^{ws}*\#{ws}*	yy_push_state(PP_LINE);
 <PP_LINE>[^\n]*         {
                             int lineno;
@@ -144,6 +146,8 @@ UUID *parse_uuid(const char *u)
                             line_number = lineno - 1;  /* We didn't read the newline */
                             input_name = xstrdup(fname);
                         }
+<PP_PRAGMA>midl_echo[^\n]*  yyless(9); yy_pop_state(); return tCPPQUOTE;
+<PP_PRAGMA>[^\n]*       parser_lval.str = xstrdup(yytext); yy_pop_state(); return aPRAGMA;
 <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 97c3896..946d165 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -114,6 +114,7 @@ static statement_t *make_statement_type_decl(type_t *type);
 static statement_t *make_statement_reference(type_t *type);
 static statement_t *make_statement_declaration(var_t *var);
 static statement_t *make_statement_library(typelib_t *typelib);
+static statement_t *make_statement_pragma(const char *str);
 static statement_t *make_statement_cppquote(const char *str);
 static statement_t *make_statement_importlib(const char *str);
 static statement_t *make_statement_module(type_t *type);
@@ -152,7 +153,7 @@ static attr_list_t *append_attribs(attr_list_t *, attr_list_t *);
 	enum storage_class stgclass;
 }
 
-%token <str> aIDENTIFIER
+%token <str> aIDENTIFIER aPRAGMA
 %token <str> aKNOWNTYPE
 %token <num> aNUM aHEXNUM
 %token <dbl> aDOUBLE
@@ -363,6 +364,7 @@ statement:
 	| declaration ';'			{ $$ = make_statement_declaration($1); }
 	| import				{ $$ = make_statement_import($1); }
 	| typedef ';'				{ $$ = $1; }
+	| aPRAGMA				{ $$ = make_statement_pragma($1); }
 	;
 
 typedecl:
@@ -2744,6 +2746,13 @@ static statement_t *make_statement_library(typelib_t *typelib)
     return stmt;
 }
 
+static statement_t *make_statement_pragma(const char *str)
+{
+    statement_t *stmt = make_statement(STMT_PRAGMA);
+    stmt->u.str = str;
+    return stmt;
+}
+
 static statement_t *make_statement_cppquote(const char *str)
 {
     statement_t *stmt = make_statement(STMT_CPPQUOTE);
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index efde0b0..30b6560 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -243,6 +243,7 @@ enum statement_type
     STMT_TYPEDEF,
     STMT_IMPORT,
     STMT_IMPORTLIB,
+    STMT_PRAGMA,
     STMT_CPPQUOTE
 };
 
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index dd98486..6eb229a 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -2266,6 +2266,7 @@ static void add_entry(msft_typelib_t *typelib, const statement_t *stmt)
     switch(stmt->type) {
     case STMT_LIBRARY:
     case STMT_IMPORT:
+    case STMT_PRAGMA:
     case STMT_CPPQUOTE:
     case STMT_DECLARATION:
         /* not included in typelib */




More information about the wine-cvs mailing list