- Sync WIDL to Wine 1.5.10. Part 1 of 2.
- Adjust files to use MIDL compatible header guards.
- Add support for nameless structs and unions.

svn path=/trunk/; revision=57095
This commit is contained in:
Eric Kohl 2012-08-18 13:11:56 +00:00
parent f2112ca452
commit 7f242b94c7
7 changed files with 1200 additions and 1072 deletions

View file

@ -541,7 +541,7 @@ public:
// WIDL temp hack : when the interface contains 'long' WIDL writes it out as a 'LONG'
// Setting the prototype to LONG in this class breaks building with MSVC so we use
// the correct 'long' type here and temp hack it for WIDL generated prototypes.
#ifdef __WIDL_EXDISP_H
#ifdef __exdisp_h__
#define long LONG
#endif
virtual HRESULT STDMETHODCALLTYPE get_Left(long *pl);
@ -552,7 +552,7 @@ public:
virtual HRESULT STDMETHODCALLTYPE put_Width(long Width);
virtual HRESULT STDMETHODCALLTYPE get_Height(long *pl);
virtual HRESULT STDMETHODCALLTYPE put_Height(long Height);
#ifdef __WIDL_EXDISP_H
#ifdef __exdisp_h__
#undef long
#endif
virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName);
@ -2537,7 +2537,7 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type)
{
return E_NOTIMPL;
}
#ifdef __WIDL_EXDISP_H
#ifdef __exdisp_h__
#define long LONG
#endif
HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(long *pl)

View file

@ -435,7 +435,7 @@ typedef enum tagHH_GPROPID {
HH_GPROPID_CONTENT_LANGUAGE = 5
} HH_GPROPID;
#ifdef __WIDL_OAIDL_H
#ifdef __oaidl_h__
typedef struct tagHH_GLOBAL_PROPERTY
{
@ -443,7 +443,7 @@ typedef struct tagHH_GLOBAL_PROPERTY
VARIANT var;
} HH_GLOBAL_PROPERTY ;
#endif /* __WIDL_OAIDL_H */
#endif /* __oaidl_h__ */
#ifdef __cplusplus
}

View file

@ -66,6 +66,69 @@
#endif
#endif /* __ANONYMOUS_DEFINED */
#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
#define UNREFERENCED_PARAMETER(P) {(P)=(P);}
#define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);}
#define DBG_UNREFERENCED_PARAMETER(P)

View file

@ -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)
@ -1371,8 +1417,8 @@ void write_header(const statement_list_t *stmts)
fprintf(header, "#include <ole2.h>\n");
fprintf(header, "#endif\n\n");
fprintf(header, "#ifndef __WIDL_%s\n", header_token);
fprintf(header, "#define __WIDL_%s\n\n", header_token);
fprintf(header, "#ifndef __%s__\n", header_token);
fprintf(header, "#define __%s__\n\n", header_token);
fprintf(header, "/* Forward declarations */\n\n");
write_forward_decls(header, stmts);
@ -1394,7 +1440,7 @@ void write_header(const statement_list_t *stmts)
fprintf(header, "\n");
end_cplusplus_guard(header);
fprintf(header, "#endif /* __WIDL_%s */\n", header_token);
fprintf(header, "#endif /* __%s__ */\n", header_token);
fclose(header);
}

File diff suppressed because it is too large Load diff

View file

@ -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;

View file

@ -56,6 +56,7 @@ static const char usage[] =
" -d n Set debug level to 'n'\n"
" -D id[=val] Define preprocessor identifier id=val\n"
" -E Preprocess only\n"
" --help Display this help and exit\n"
" -h Generate headers\n"
" -H file Name of header file (default is infile.h)\n"
" -I path Set include search dir to path (multiple -I allowed)\n"
@ -128,7 +129,6 @@ char *server_token;
char *regscript_name;
char *regscript_token;
static char *idfile_name;
static char *idfile_token;
char *temp_name;
const char *prefix_client = "";
const char *prefix_server = "";
@ -150,6 +150,7 @@ enum {
PREFIX_ALL_OPTION,
PREFIX_CLIENT_OPTION,
PREFIX_SERVER_OPTION,
PRINT_HELP,
WIN32_OPTION,
WIN64_OPTION,
WIN32_ALIGN_OPTION,
@ -161,6 +162,7 @@ static const char short_options[] =
static const struct option long_options[] = {
{ "dlldata", 1, NULL, DLLDATA_OPTION },
{ "dlldata-only", 0, NULL, DLLDATA_ONLY_OPTION },
{ "help", 0, NULL, PRINT_HELP },
{ "local-stubs", 1, NULL, LOCAL_STUBS_OPTION },
{ "oldnames", 0, NULL, OLDNAMES_OPTION },
{ "output", 0, NULL, 'o' },
@ -198,7 +200,7 @@ static char *make_token(const char *name)
token = xstrdup(name);
for (i=0; token[i]; i++) {
if (!isalnum(token[i])) token[i] = '_';
else token[i] = toupper(token[i]);
else token[i] = tolower(token[i]);
}
return token;
}
@ -465,8 +467,6 @@ void write_id_data(const statement_list_t *stmts)
{
if (!do_idfile) return;
idfile_token = make_token(idfile_name);
idfile = fopen(idfile_name, "w");
if (! idfile) {
error("Could not open %s for output\n", idfile_name);
@ -529,6 +529,9 @@ int main(int argc,char *argv[])
case PREFIX_SERVER_OPTION:
prefix_server = xstrdup(optarg);
break;
case PRINT_HELP:
fprintf(stderr, "%s", usage);
return 0;
case WIN32_OPTION:
do_win32 = 1;
do_win64 = 0;
@ -640,6 +643,10 @@ int main(int argc,char *argv[])
}
}
#ifdef DEFAULT_INCLUDE_DIR
wpp_add_include_path(DEFAULT_INCLUDE_DIR);
#endif
if(do_everything) {
set_everything(TRUE);
}