Rob Shearman : widl: Create a statement object for import statements.

Alexandre Julliard julliard at winehq.org
Fri Apr 25 08:11:11 CDT 2008


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Fri Apr 25 10:59:40 2008 +0100

widl: Create a statement object for import statements.

Move the writing of include directives into the generated header into 
header.c.

---

 tools/widl/header.c |   12 ++++++++++++
 tools/widl/header.h |    1 +
 tools/widl/parser.l |   11 +----------
 tools/widl/parser.y |   36 ++++++++++++++++++++++++++++--------
 4 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 0d7e0b2..ae70454 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -1039,3 +1039,15 @@ void write_coclass_forward(type_t *cocl)
   fprintf(header, "typedef struct %s %s;\n", cocl->name, cocl->name);
   fprintf(header, "#endif /* defined __%s_FWD_DEFINED__ */\n\n", cocl->name );
 }
+
+void write_import(const char *fname)
+{
+  char *hname, *p;
+
+  hname = dup_basename(fname, ".idl");
+  p = hname + strlen(hname) - 2;
+  if (p <= hname || strcmp( p, ".h" )) strcat(hname, ".h");
+
+  fprintf(header, "#include <%s>\n", hname);
+  free(hname);
+}
diff --git a/tools/widl/header.h b/tools/widl/header.h
index c663c70..c2cecd5 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -49,6 +49,7 @@ extern int need_proxy_file(const statement_list_t *stmts);
 extern const var_t *is_callas(const attr_list_t *list);
 extern void write_args(FILE *h, const var_list_t *arg, const char *name, int obj, int do_indent);
 extern void write_array(FILE *h, array_dims_t *v, int field);
+extern void write_import(const char *fname);
 extern void write_forward(type_t *iface);
 extern void write_interface(type_t *iface);
 extern void write_dispinterface(type_t *iface);
diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index d40c9d0..1e8460b 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -411,20 +411,11 @@ struct imports {
 int do_import(char *fname)
 {
 	FILE *f;
-	char *hname, *path, *p;
+	char *path;
 	struct imports *import;
 	int ptr = import_stack_ptr;
 	int ret;
 
-	if (!parse_only && do_header) {
-		hname = dup_basename(fname, ".idl");
-                p = hname + strlen(hname) - 2;
-                if (p <= hname || strcmp( p, ".h" )) strcat(hname, ".h");
-
-		fprintf(header, "#include <%s>\n", hname);
-		free(hname);
-	}
-
 	import = first_import;
 	while (import && strcmp(import->name, fname))
 		import = import->next;
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 43c4af2..d57d286 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -78,6 +78,12 @@ struct typenode {
   struct list entry;
 };
 
+struct _import_t
+{
+  char *name;
+  int import_performed;
+};
+
 typelist_t incomplete_types = LIST_INIT(incomplete_types);
 
 static void add_incomplete(type_t *t);
@@ -150,6 +156,7 @@ static statement_t *make_statement_library(typelib_t *typelib);
 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);
+static statement_t *make_statement_import(const char *str);
 static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt);
 
 #define tsENUM   1
@@ -180,7 +187,8 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
 	unsigned int num;
 	double dbl;
 	interface_info_t ifinfo;
-        typelib_t *typelib;
+	typelib_t *typelib;
+	struct _import_t *import;
 }
 
 %token <str> aIDENTIFIER
@@ -298,9 +306,9 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
 %type <func_list> int_statements dispint_meths
 %type <type> coclass coclasshdr coclassdef
 %type <num> pointer_type version
-%type <str> libraryhdr callconv cppquote importlib
+%type <str> libraryhdr callconv cppquote importlib import
 %type <uuid> uuid_string
-%type <num> import_start
+%type <import> import_start
 %type <typelib> library_start librarydef
 %type <statement> statement typedef
 %type <stmt_list> gbl_statements imp_statements
@@ -387,7 +395,7 @@ statement: constdef ';'				{ $$ = make_statement_init_decl($1);
 	| externdef ';'				{ $$ = make_statement_extern($1);
 						  if (!parse_only && do_header) write_externdef($1);
 						}
-	| import				{ $$ = NULL; }
+	| import				{ $$ = make_statement_import($1); }
 	| structdef ';'				{ $$ = make_statement_type_decl($1);
 						  if (!parse_only && do_header) {
 						    write_type_def_or_decl(header, $1, FALSE, NULL);
@@ -406,13 +414,18 @@ statement: constdef ';'				{ $$ = make_statement_init_decl($1);
 cppquote: tCPPQUOTE '(' aSTRING ')'		{ $$ = $3; if (!parse_only && do_header) fprintf(header, "%s\n", $3); }
 	;
 import_start: tIMPORT aSTRING ';'		{ assert(yychar == YYEMPTY);
-						  $$ = do_import($2);
-						  if (!$$) yychar = aEOF;
+						  $$ = xmalloc(sizeof(struct _import_t));
+						  $$->name = $2;
+						  $$->import_performed = do_import($2);
+						  if (!$$->import_performed) yychar = aEOF;
 						}
 	;
 
-import: import_start imp_statements aEOF
-						{ if ($1) pop_import(); }
+import: import_start imp_statements aEOF	{ $$ = $1->name;
+						  if ($1->import_performed) pop_import();
+						  free($1);
+						  if (!parse_only && do_header) write_import($$);
+						}
 	;
 
 importlib: tIMPORTLIB '(' aSTRING ')'
@@ -2607,6 +2620,13 @@ static statement_t *make_statement_importlib(const char *str)
     return stmt;
 }
 
+static statement_t *make_statement_import(const char *str)
+{
+    statement_t *stmt = make_statement(STMT_IMPORT);
+    stmt->u.str = str;
+    return stmt;
+}
+
 static statement_t *make_statement_module(type_t *type)
 {
     statement_t *stmt = make_statement(STMT_MODULE);




More information about the wine-cvs mailing list