Module: wine Branch: master Commit: 76693d52c7b2d199df9d1f0e6051b2ffa333b8e1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=76693d52c7b2d199df9d1f0e60...
Author: Jacek Caban jacek@codeweavers.com Date: Sat May 12 16:13:57 2012 +0200
widl: Added support for nameless structs and unions.
---
include/winnt.h | 59 +++++++++++++++++++++++++++++++++++++------ tools/widl/header.c | 68 ++++++++++++++++++++++++++++++++++++++++++-------- tools/widl/parser.y | 4 +++ 3 files changed, 111 insertions(+), 20 deletions(-)
diff --git a/include/winnt.h b/include/winnt.h index ecac448..9bde031 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -245,26 +245,67 @@ extern "C" { #define DUMMYUNIONNAME8 u8 #endif /* !defined(NONAMELESSUNION) */
-#ifndef __C89_NAMELESS -# if !defined(__WINESRC__) && !defined(WINE_NO_NAMELESS_EXTENSION) -# ifdef __GNUC__ - /* Anonymous structs support starts with gcc 2.96/g++ 2.95 */ -# if (__GNUC__ > 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ > 95) || ((__GNUC_MINOR__ == 95) && defined(__cplusplus)))) -# define __C89_NAMELESS __extension__ -# endif -# elif defined(_MSC_VER) -# define __C89_NAMELESS +#undef __C89_NAMELESS +#undef __C89_NAMELESSSTRUCTNAME +#undef __C89_NAMELESSSTRUCTNAME1 +#undef __C89_NAMELESSSTRUCTNAME2 +#undef __C89_NAMELESSSTRUCTNAME3 +#undef __C89_NAMELESSSTRUCTNAME4 +#undef __C89_NAMELESSSTRUCTNAME5 +#undef __C89_NAMELESSUNIONNAME +#undef __C89_NAMELESSUNIONNAME1 +#undef __C89_NAMELESSUNIONNAME2 +#undef __C89_NAMELESSUNIONNAME3 +#undef __C89_NAMELESSUNIONNAME4 +#undef __C89_NAMELESSUNIONNAME5 +#undef __C89_NAMELESSUNIONNAME6 +#undef __C89_NAMELESSUNIONNAME7 +#undef __C89_NAMELESSUNIONNAME8 + +#if !defined(__WINESRC__) && !defined(WINE_NO_NAMELESS_EXTENSION) +# ifdef __GNUC__ + /* Anonymous structs support starts with gcc 2.96/g++ 2.95 */ +# if (__GNUC__ > 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ > 95) || ((__GNUC_MINOR__ == 95) && defined(__cplusplus)))) +# define __C89_NAMELESS __extension__ # endif +# elif defined(_MSC_VER) +# define __C89_NAMELESS # endif #endif
#ifdef __C89_NAMELESS # define __C89_NAMELESSSTRUCTNAME +# define __C89_NAMELESSSTRUCTNAME1 +# define __C89_NAMELESSSTRUCTNAME2 +# define __C89_NAMELESSSTRUCTNAME3 +# define __C89_NAMELESSSTRUCTNAME4 +# define __C89_NAMELESSSTRUCTNAME5 # define __C89_NAMELESSUNIONNAME +# define __C89_NAMELESSUNIONNAME1 +# define __C89_NAMELESSUNIONNAME2 +# define __C89_NAMELESSUNIONNAME3 +# define __C89_NAMELESSUNIONNAME4 +# define __C89_NAMELESSUNIONNAME5 +# define __C89_NAMELESSUNIONNAME6 +# define __C89_NAMELESSUNIONNAME7 +# define __C89_NAMELESSUNIONNAME8 #else # define __C89_NAMELESS # define __C89_NAMELESSSTRUCTNAME DUMMYSTRUCTNAME +# define __C89_NAMELESSSTRUCTNAME1 DUMMYSTRUCTNAME1 +# define __C89_NAMELESSSTRUCTNAME2 DUMMYSTRUCTNAME2 +# define __C89_NAMELESSSTRUCTNAME3 DUMMYSTRUCTNAME3 +# define __C89_NAMELESSSTRUCTNAME4 DUMMYSTRUCTNAME4 +# define __C89_NAMELESSSTRUCTNAME5 DUMMYSTRUCTNAME5 # define __C89_NAMELESSUNIONNAME DUMMYUNIONNAME +# define __C89_NAMELESSUNIONNAME1 DUMMYUNIONNAME1 +# define __C89_NAMELESSUNIONNAME2 DUMMYUNIONNAME2 +# define __C89_NAMELESSUNIONNAME3 DUMMYUNIONNAME3 +# define __C89_NAMELESSUNIONNAME4 DUMMYUNIONNAME4 +# define __C89_NAMELESSUNIONNAME5 DUMMYUNIONNAME5 +# define __C89_NAMELESSUNIONNAME6 DUMMYUNIONNAME6 +# define __C89_NAMELESSUNIONNAME7 DUMMYUNIONNAME7 +# define __C89_NAMELESSUNIONNAME8 DUMMYUNIONNAME8 #endif
/* C99 restrict support */ diff --git a/tools/widl/header.c b/tools/widl/header.c index 06c6f1e..0b2b9d5 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -167,21 +167,67 @@ const char *get_name(const var_t *v) return buffer; }
-static void write_field(FILE *h, var_t *v) -{ - if (!v) return; - if (v->type) { - indent(h, 0); - write_type_def_or_decl(h, v->type, TRUE, v->name); - fprintf(h, ";\n"); - } -} - static void write_fields(FILE *h, var_list_t *fields) { + unsigned nameless_struct_cnt = 0, nameless_struct_i = 0, nameless_union_cnt = 0, nameless_union_i = 0; + const char *name; + char buf[32]; var_t *v; + if (!fields) return; - LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) write_field(h, v); + + LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) { + if (!v || !v->type) continue; + + switch(type_get_type_detect_alias(v->type)) { + case TYPE_STRUCT: + case TYPE_ENCAPSULATED_UNION: + nameless_struct_cnt++; + break; + case TYPE_UNION: + nameless_union_cnt++; + break; + default: + ; + } + } + + LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) { + if (!v || !v->type) continue; + + indent(h, 0); + name = v->name; + + switch(type_get_type_detect_alias(v->type)) { + case TYPE_STRUCT: + case TYPE_ENCAPSULATED_UNION: + if(!v->name) { + fprintf(h, "__C89_NAMELESS "); + if(nameless_struct_cnt == 1) { + name = "__C89_NAMELESSSTRUCTNAME"; + }else if(nameless_struct_i < 5 /* # of supporting macros */) { + sprintf(buf, "__C89_NAMELESSSTRUCTNAME%d", ++nameless_struct_i); + name = buf; + } + } + break; + case TYPE_UNION: + if(!v->name) { + fprintf(h, "__C89_NAMELESS "); + if(nameless_union_cnt == 1) { + name = "__C89_NAMELESSUNIONNAME"; + }else if(nameless_union_i < 8 /* # of supporting macros */ ) { + sprintf(buf, "__C89_NAMELESSUNIONNAME%d", ++nameless_union_i); + name = buf; + } + } + break; + default: + ; + } + write_type_def_or_decl(h, v->type, TRUE, name); + fprintf(h, ";\n"); + } }
static void write_enums(FILE *h, var_list_t *enums) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index cd947e8..55b2df9 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -740,6 +740,10 @@ s_field: m_attributes decl_spec declarator { $$ = declare_var(check_field_attrs $2, $3, FALSE); free($3); } + | m_attributes structdef { var_t *v = make_var(NULL); + v->type = $2; v->attrs = $1; + $$ = v; + } ;
funcdef: declaration { $$ = $1;