Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
df0e38c0
Commit
df0e38c0
authored
Apr 24, 2008
by
Rob Shearman
Committed by
Alexandre Julliard
Apr 24, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
widl: Create a list of statements in the whole IDL file, instead of just a list of interfaces.
parent
58be8923
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
470 additions
and
228 deletions
+470
-228
client.c
tools/widl/client.c
+43
-32
header.c
tools/widl/header.c
+3
-3
header.h
tools/widl/header.h
+3
-3
parser.y
tools/widl/parser.y
+167
-44
proxy.c
tools/widl/proxy.c
+86
-46
server.c
tools/widl/server.c
+43
-32
typegen.c
tools/widl/typegen.c
+75
-42
typegen.h
tools/widl/typegen.h
+5
-5
typelib.c
tools/widl/typelib.c
+3
-11
typelib.h
tools/widl/typelib.h
+1
-1
widl.c
tools/widl/widl.c
+2
-2
widl.h
tools/widl/widl.h
+4
-4
widltypes.h
tools/widl/widltypes.h
+31
-0
write_msft.c
tools/widl/write_msft.c
+4
-3
No files found.
tools/widl/client.c
View file @
df0e38c0
...
@@ -431,58 +431,69 @@ static void init_client(void)
...
@@ -431,58 +431,69 @@ static void init_client(void)
}
}
void
write_client
(
ifref_list_t
*
ifaces
)
static
void
write_client_ifaces
(
const
statement_list_t
*
stmts
,
int
expr_eval_routines
,
unsigned
int
*
proc_offset
)
{
const
statement_t
*
stmt
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
{
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
type_t
*
iface
=
stmt
->
u
.
type
;
if
(
!
need_stub
(
iface
))
return
;
fprintf
(
client
,
"/*****************************************************************************
\n
"
);
fprintf
(
client
,
" * %s interface
\n
"
,
iface
->
name
);
fprintf
(
client
,
" */
\n
"
);
fprintf
(
client
,
"
\n
"
);
if
(
iface
->
funcs
)
{
write_implicithandledecl
(
iface
);
write_clientinterfacedecl
(
iface
);
write_stubdescdecl
(
iface
);
write_function_stubs
(
iface
,
proc_offset
);
print_client
(
"#if !defined(__RPC_WIN32__)
\n
"
);
print_client
(
"#error Invalid build platform for this stub.
\n
"
);
print_client
(
"#endif
\n
"
);
fprintf
(
client
,
"
\n
"
);
write_stubdescriptor
(
iface
,
expr_eval_routines
);
}
}
else
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_client_ifaces
(
stmt
->
u
.
lib
->
stmts
,
expr_eval_routines
,
proc_offset
);
}
}
void
write_client
(
const
statement_list_t
*
stmts
)
{
{
unsigned
int
proc_offset
=
0
;
unsigned
int
proc_offset
=
0
;
int
expr_eval_routines
;
int
expr_eval_routines
;
ifref_t
*
iface
;
if
(
!
do_client
)
if
(
!
do_client
)
return
;
return
;
if
(
do_everything
&&
!
need_stub_files
(
iface
s
))
if
(
do_everything
&&
!
need_stub_files
(
stmt
s
))
return
;
return
;
init_client
();
init_client
();
if
(
!
client
)
if
(
!
client
)
return
;
return
;
write_formatstringsdecl
(
client
,
indent
,
iface
s
,
need_stub
);
write_formatstringsdecl
(
client
,
indent
,
stmt
s
,
need_stub
);
expr_eval_routines
=
write_expr_eval_routines
(
client
,
client_token
);
expr_eval_routines
=
write_expr_eval_routines
(
client
,
client_token
);
if
(
expr_eval_routines
)
if
(
expr_eval_routines
)
write_expr_eval_routine_list
(
client
,
client_token
);
write_expr_eval_routine_list
(
client
,
client_token
);
write_user_quad_list
(
client
);
write_user_quad_list
(
client
);
if
(
ifaces
)
LIST_FOR_EACH_ENTRY
(
iface
,
ifaces
,
ifref_t
,
entry
)
write_client_ifaces
(
stmts
,
expr_eval_routines
,
&
proc_offset
);
{
if
(
!
need_stub
(
iface
->
iface
))
continue
;
fprintf
(
client
,
"/*****************************************************************************
\n
"
);
fprintf
(
client
,
" * %s interface
\n
"
,
iface
->
iface
->
name
);
fprintf
(
client
,
" */
\n
"
);
fprintf
(
client
,
"
\n
"
);
if
(
iface
->
iface
->
funcs
)
{
write_implicithandledecl
(
iface
->
iface
);
write_clientinterfacedecl
(
iface
->
iface
);
write_stubdescdecl
(
iface
->
iface
);
write_function_stubs
(
iface
->
iface
,
&
proc_offset
);
print_client
(
"#if !defined(__RPC_WIN32__)
\n
"
);
print_client
(
"#error Invalid build platform for this stub.
\n
"
);
print_client
(
"#endif
\n
"
);
fprintf
(
client
,
"
\n
"
);
write_stubdescriptor
(
iface
->
iface
,
expr_eval_routines
);
}
}
fprintf
(
client
,
"
\n
"
);
fprintf
(
client
,
"
\n
"
);
write_procformatstring
(
client
,
iface
s
,
need_stub
);
write_procformatstring
(
client
,
stmt
s
,
need_stub
);
write_typeformatstring
(
client
,
iface
s
,
need_stub
);
write_typeformatstring
(
client
,
stmt
s
,
need_stub
);
fclose
(
client
);
fclose
(
client
);
}
}
tools/widl/header.c
View file @
df0e38c0
...
@@ -487,11 +487,11 @@ void write_externdef(const var_t *v)
...
@@ -487,11 +487,11 @@ void write_externdef(const var_t *v)
fprintf
(
header
,
";
\n\n
"
);
fprintf
(
header
,
";
\n\n
"
);
}
}
void
write_library
(
const
char
*
name
,
const
attr_list_t
*
attr
)
void
write_library
(
const
typelib_t
*
typelib
)
{
{
const
UUID
*
uuid
=
get_attrp
(
attr
,
ATTR_UUID
);
const
UUID
*
uuid
=
get_attrp
(
typelib
->
attrs
,
ATTR_UUID
);
fprintf
(
header
,
"
\n
"
);
fprintf
(
header
,
"
\n
"
);
write_guid
(
header
,
"LIBID"
,
name
,
uuid
);
write_guid
(
header
,
"LIBID"
,
typelib
->
name
,
uuid
);
fprintf
(
header
,
"
\n
"
);
fprintf
(
header
,
"
\n
"
);
}
}
...
...
tools/widl/header.h
View file @
df0e38c0
...
@@ -44,8 +44,8 @@ extern int is_object(const attr_list_t *list);
...
@@ -44,8 +44,8 @@ extern int is_object(const attr_list_t *list);
extern
int
is_local
(
const
attr_list_t
*
list
);
extern
int
is_local
(
const
attr_list_t
*
list
);
extern
int
need_stub
(
const
type_t
*
iface
);
extern
int
need_stub
(
const
type_t
*
iface
);
extern
int
need_proxy
(
const
type_t
*
iface
);
extern
int
need_proxy
(
const
type_t
*
iface
);
extern
int
need_stub_files
(
const
ifref_list_t
*
iface
s
);
extern
int
need_stub_files
(
const
statement_list_t
*
stmt
s
);
extern
int
need_proxy_file
(
const
ifref_list_t
*
iface
s
);
extern
int
need_proxy_file
(
const
statement_list_t
*
stmt
s
);
extern
const
var_t
*
is_callas
(
const
attr_list_t
*
list
);
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_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_array
(
FILE
*
h
,
array_dims_t
*
v
,
int
field
);
...
@@ -58,7 +58,7 @@ extern void write_coclass_forward(type_t *cocl);
...
@@ -58,7 +58,7 @@ extern void write_coclass_forward(type_t *cocl);
extern
void
write_typedef
(
type_t
*
type
);
extern
void
write_typedef
(
type_t
*
type
);
extern
void
write_constdef
(
const
var_t
*
v
);
extern
void
write_constdef
(
const
var_t
*
v
);
extern
void
write_externdef
(
const
var_t
*
v
);
extern
void
write_externdef
(
const
var_t
*
v
);
extern
void
write_library
(
const
char
*
name
,
const
attr_list_t
*
attr
);
extern
void
write_library
(
const
typelib_t
*
typelib
);
extern
void
write_user_types
(
void
);
extern
void
write_user_types
(
void
);
extern
void
write_context_handle_rundowns
(
void
);
extern
void
write_context_handle_rundowns
(
void
);
extern
void
write_generic_handle_routines
(
void
);
extern
void
write_generic_handle_routines
(
void
);
...
...
tools/widl/parser.y
View file @
df0e38c0
...
@@ -103,6 +103,7 @@ static type_t *make_class(char *name);
...
@@ -103,6 +103,7 @@ static type_t *make_class(char *name);
static type_t *make_safearray(type_t *type);
static type_t *make_safearray(type_t *type);
static type_t *make_builtin(char *name);
static type_t *make_builtin(char *name);
static type_t *make_int(int sign);
static type_t *make_int(int sign);
static typelib_t *make_library(const char *name, const attr_list_t *attrs);
static type_t *make_func_type(var_list_t *args);
static type_t *make_func_type(var_list_t *args);
static void type_set_function_callconv(type_t *type, char *callconv);
static void type_set_function_callconv(type_t *type, char *callconv);
static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type);
static type_t *append_ptrchain_type(type_t *ptrchain, type_t *type);
...
@@ -116,7 +117,7 @@ static int get_struct_type(var_list_t *fields);
...
@@ -116,7 +117,7 @@ static int get_struct_type(var_list_t *fields);
static var_t *reg_const(var_t *var);
static var_t *reg_const(var_t *var);
static void write_libid(const
char *name, const attr_list_t *attr
);
static void write_libid(const
typelib_t *typelib
);
static void write_clsid(type_t *cls);
static void write_clsid(type_t *cls);
static void write_diid(type_t *iface);
static void write_diid(type_t *iface);
static void write_iid(type_t *iface);
static void write_iid(type_t *iface);
...
@@ -126,7 +127,7 @@ static char *gen_name(void);
...
@@ -126,7 +127,7 @@ static char *gen_name(void);
static void process_typedefs(var_list_t *names);
static void process_typedefs(var_list_t *names);
static void check_arg(var_t *arg);
static void check_arg(var_t *arg);
static void check_functions(const type_t *iface);
static void check_functions(const type_t *iface);
static void check_all_user_types(
ifref_list_t *iface
s);
static void check_all_user_types(
const statement_list_t *stmt
s);
static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs);
static const attr_list_t *check_iface_attrs(const char *name, const attr_list_t *attrs);
static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
static attr_list_t *check_function_attrs(const char *name, attr_list_t *attrs);
static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
static attr_list_t *check_typedef_attrs(attr_list_t *attrs);
...
@@ -138,6 +139,17 @@ static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_
...
@@ -138,6 +139,17 @@ static const attr_list_t *check_coclass_attrs(const char *name, const attr_list_
const char *get_attr_display_name(enum attr_type type);
const char *get_attr_display_name(enum attr_type type);
static void add_explicit_handle_if_necessary(func_t *func);
static void add_explicit_handle_if_necessary(func_t *func);
static statement_t *make_statement(enum statement_type type);
static statement_t *make_statement_type_decl(type_t *type);
static statement_t *make_statement_reference(type_t *type);
static statement_t *make_statement_init_decl(var_t *var);
static statement_t *make_statement_extern(var_t *var);
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_list_t *append_statement(statement_list_t *list, statement_t *stmt);
#define tsENUM 1
#define tsENUM 1
#define tsSTRUCT 2
#define tsSTRUCT 2
#define tsUNION 3
#define tsUNION 3
...
@@ -157,6 +169,8 @@ static void add_explicit_handle_if_necessary(func_t *func);
...
@@ -157,6 +169,8 @@ static void add_explicit_handle_if_necessary(func_t *func);
pident_list_t *pident_list;
pident_list_t *pident_list;
func_t *func;
func_t *func;
func_list_t *func_list;
func_list_t *func_list;
statement_t *statement;
statement_list_t *stmt_list;
ifref_t *ifref;
ifref_t *ifref;
ifref_list_t *ifref_list;
ifref_list_t *ifref_list;
char *str;
char *str;
...
@@ -164,6 +178,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
...
@@ -164,6 +178,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
unsigned int num;
unsigned int num;
double dbl;
double dbl;
interface_info_t ifinfo;
interface_info_t ifinfo;
typelib_t *typelib;
}
}
%token <str> aIDENTIFIER
%token <str> aIDENTIFIER
...
@@ -272,7 +287,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
...
@@ -272,7 +287,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
%type <type> enumdef structdef uniondef
%type <type> enumdef structdef uniondef
%type <type> type
%type <type> type
%type <ifref> coclass_int
%type <ifref> coclass_int
%type <ifref_list>
gbl_statements
coclass_ints
%type <ifref_list> coclass_ints
%type <var> arg field s_field case enum constdef externdef
%type <var> arg field s_field case enum constdef externdef
%type <var_list> m_args no_args args fields cases enums enum_list dispint_props
%type <var_list> m_args no_args args fields cases enums enum_list dispint_props
%type <var> m_ident t_ident ident
%type <var> m_ident t_ident ident
...
@@ -282,9 +297,12 @@ static void add_explicit_handle_if_necessary(func_t *func);
...
@@ -282,9 +297,12 @@ static void add_explicit_handle_if_necessary(func_t *func);
%type <func_list> int_statements dispint_meths
%type <func_list> int_statements dispint_meths
%type <type> coclass coclasshdr coclassdef
%type <type> coclass coclasshdr coclassdef
%type <num> pointer_type version
%type <num> pointer_type version
%type <str> libraryhdr callconv
%type <str> libraryhdr callconv
cppquote importlib
%type <uuid> uuid_string
%type <uuid> uuid_string
%type <num> import_start
%type <num> import_start
%type <typelib> library_start librarydef
%type <statement> statement
%type <stmt_list> gbl_statements imp_statements
%left ','
%left ','
%right '?' ':'
%right '?' ':'
...
@@ -314,33 +332,36 @@ input: gbl_statements { fix_incomplete();
...
@@ -314,33 +332,36 @@ input: gbl_statements { fix_incomplete();
gbl_statements: { $$ = NULL; }
gbl_statements: { $$ = NULL; }
| gbl_statements interfacedec { $$ = $1; }
| gbl_statements interfacedec { $$ = $1; }
| gbl_statements interfacedef { $$ = append_
ifref( $1, make_ifref($2)
); }
| gbl_statements interfacedef { $$ = append_
statement($1, make_statement_type_decl($2)
); }
| gbl_statements coclass ';' { $$ = $1;
| gbl_statements coclass ';' { $$ = $1;
reg_type($2, $2->name, 0);
reg_type($2, $2->name, 0);
if (!parse_only && do_header) write_coclass_forward($2);
if (!parse_only && do_header) write_coclass_forward($2);
}
}
| gbl_statements coclassdef { $$ =
$1
;
| gbl_statements coclassdef { $$ =
append_statement($1, make_statement_type_decl($2))
;
add_typelib_entry($2);
add_typelib_entry($2);
reg_type($2, $2->name, 0);
reg_type($2, $2->name, 0);
if (!parse_only && do_header) write_coclass_forward($2);
if (!parse_only && do_header) write_coclass_forward($2);
}
}
| gbl_statements moduledef { $$ = $1; add_typelib_entry($2); }
| gbl_statements moduledef { $$ = append_statement($1, make_statement_module($2));
| gbl_statements librarydef { $$ = $1; }
add_typelib_entry($2);
| gbl_statements statement { $$ = $1; }
}
| gbl_statements librarydef { $$ = append_statement($1, make_statement_library($2)); }
| gbl_statements statement { $$ = append_statement($1, $2); }
;
;
imp_statements: {}
imp_statements: { $$ = NULL; }
| imp_statements interfacedec { if (!parse_only) add_typelib_entry($2); }
| imp_statements interfacedec { $$ = append_statement($1, make_statement_reference($2)); if (!parse_only) add_typelib_entry($2); }
| imp_statements interfacedef { if (!parse_only) add_typelib_entry($2); }
| imp_statements interfacedef { $$ = append_statement($1, make_statement_type_decl($2)); if (!parse_only) add_typelib_entry($2); }
| imp_statements coclass ';' { reg_type($2, $2->name, 0); if (!parse_only && do_header) write_coclass_forward($2); }
| imp_statements coclass ';' { $$ = $1; reg_type($2, $2->name, 0); if (!parse_only && do_header) write_coclass_forward($2); }
| imp_statements coclassdef { if (!parse_only) add_typelib_entry($2);
| imp_statements coclassdef { $$ = append_statement($1, make_statement_type_decl($2));
if (!parse_only) add_typelib_entry($2);
reg_type($2, $2->name, 0);
reg_type($2, $2->name, 0);
if (!parse_only && do_header) write_coclass_forward($2);
if (!parse_only && do_header) write_coclass_forward($2);
}
}
| imp_statements moduledef { if (!parse_only) add_typelib_entry($2); }
| imp_statements moduledef {
$$ = append_statement($1, make_statement_module($2));
if (!parse_only) add_typelib_entry($2); }
| imp_statements statement {}
| imp_statements statement {
$$ = append_statement($1, $2);
}
| imp_statements importlib {}
| imp_statements importlib {
$$ = append_statement($1, make_statement_importlib($2));
}
| imp_statements librarydef {}
| imp_statements librarydef {
$$ = append_statement($1, make_statement_library($2));
}
;
;
int_statements: { $$ = NULL; }
int_statements: { $$ = NULL; }
...
@@ -352,29 +373,36 @@ semicolon_opt:
...
@@ -352,29 +373,36 @@ semicolon_opt:
| ';'
| ';'
;
;
statement: constdef ';' { if (!parse_only && do_header) { write_constdef($1); } }
statement: constdef ';' { $$ = make_statement_init_decl($1);
| cppquote {}
if (!parse_only && do_header) { write_constdef($1); }
| enumdef ';' { if (!parse_only && do_header) {
}
| cppquote { $$ = make_statement_cppquote($1); }
| enumdef ';' { $$ = make_statement_type_decl($1);
if (!parse_only && do_header) {
write_type_def_or_decl(header, $1, FALSE, NULL);
write_type_def_or_decl(header, $1, FALSE, NULL);
fprintf(header, ";\n\n");
fprintf(header, ";\n\n");
}
}
}
}
| externdef ';' { if (!parse_only && do_header) { write_externdef($1); } }
| externdef ';' { $$ = make_statement_extern($1);
| import {}
if (!parse_only && do_header) write_externdef($1);
| structdef ';' { if (!parse_only && do_header) {
}
| import { $$ = NULL; }
| structdef ';' { $$ = make_statement_type_decl($1);
if (!parse_only && do_header) {
write_type_def_or_decl(header, $1, FALSE, NULL);
write_type_def_or_decl(header, $1, FALSE, NULL);
fprintf(header, ";\n\n");
fprintf(header, ";\n\n");
}
}
}
}
| typedef ';' {}
| typedef ';' { $$ = NULL; /* FIXME */ }
| uniondef ';' { if (!parse_only && do_header) {
| uniondef ';' { $$ = make_statement_type_decl($1);
if (!parse_only && do_header) {
write_type_def_or_decl(header, $1, FALSE, NULL);
write_type_def_or_decl(header, $1, FALSE, NULL);
fprintf(header, ";\n\n");
fprintf(header, ";\n\n");
}
}
}
}
;
;
cppquote: tCPPQUOTE '(' aSTRING ')' { if (!parse_only && do_header) fprintf(header, "%s\n", $3); }
cppquote: tCPPQUOTE '(' aSTRING ')' {
$$ = $3;
if (!parse_only && do_header) fprintf(header, "%s\n", $3); }
;
;
import_start: tIMPORT aSTRING ';' { assert(yychar == YYEMPTY);
import_start: tIMPORT aSTRING ';' { assert(yychar == YYEMPTY);
$$ = do_import($2);
$$ = do_import($2);
...
@@ -387,20 +415,24 @@ import: import_start imp_statements aEOF
...
@@ -387,20 +415,24 @@ import: import_start imp_statements aEOF
;
;
importlib: tIMPORTLIB '(' aSTRING ')'
importlib: tIMPORTLIB '(' aSTRING ')'
semicolon_opt { if(!parse_only) add_importlib($3); }
semicolon_opt {
$$ = $3;
if(!parse_only) add_importlib($3); }
;
;
libraryhdr: tLIBRARY aIDENTIFIER { $$ = $2; }
libraryhdr: tLIBRARY aIDENTIFIER { $$ = $2; }
;
;
library_start: attributes libraryhdr '{' {
check_library_attrs($2, $1
);
library_start: attributes libraryhdr '{' {
$$ = make_library($2, check_library_attrs($2, $1)
);
if (!parse_only) start_typelib($
2, $1
);
if (!parse_only) start_typelib($
$
);
if (!parse_only && do_header) write_library($
2, $1
);
if (!parse_only && do_header) write_library($
$
);
if (!parse_only && do_idfile) write_libid($
2, $1
);
if (!parse_only && do_idfile) write_libid($
$
);
is_inside_library = TRUE;
is_inside_library = TRUE;
}
}
;
;
librarydef: library_start imp_statements '}'
librarydef: library_start imp_statements '}'
semicolon_opt { if (!parse_only) end_typelib(); is_inside_library = FALSE; }
semicolon_opt { $$ = $1;
$$->stmts = $2;
if (!parse_only) end_typelib();
is_inside_library = FALSE;
}
;
;
m_args: { $$ = NULL; }
m_args: { $$ = NULL; }
...
@@ -1457,7 +1489,7 @@ static func_t *make_func(var_t *def)
...
@@ -1457,7 +1489,7 @@ static func_t *make_func(var_t *def)
static type_t *make_class(char *name)
static type_t *make_class(char *name)
{
{
type_t *c = make_type(
0
, NULL);
type_t *c = make_type(
RPC_FC_COCLASS
, NULL);
c->name = name;
c->name = name;
c->kind = TKIND_COCLASS;
c->kind = TKIND_COCLASS;
return c;
return c;
...
@@ -1470,6 +1502,17 @@ static type_t *make_safearray(type_t *type)
...
@@ -1470,6 +1502,17 @@ static type_t *make_safearray(type_t *type)
return make_type(pointer_default, sa);
return make_type(pointer_default, sa);
}
}
static typelib_t *make_library(const char *name, const attr_list_t *attrs)
{
typelib_t *typelib = xmalloc(sizeof(*typelib));
typelib->name = xstrdup(name);
typelib->filename = NULL;
typelib->attrs = attrs;
list_init( &typelib->entries );
list_init( &typelib->importlibs );
return typelib;
}
#define HASHMAX 64
#define HASHMAX 64
static int hash_ident(const char *name)
static int hash_ident(const char *name)
...
@@ -1877,10 +1920,10 @@ var_t *find_const(const char *name, int f)
...
@@ -1877,10 +1920,10 @@ var_t *find_const(const char *name, int f)
return cur->var;
return cur->var;
}
}
static void write_libid(const
char *name, const attr_list_t *attr
)
static void write_libid(const
typelib_t *typelib
)
{
{
const UUID *uuid = get_attrp(
attr
, ATTR_UUID);
const UUID *uuid = get_attrp(
typelib->attrs
, ATTR_UUID);
write_guid(idfile, "LIBID", name, uuid);
write_guid(idfile, "LIBID",
typelib->
name, uuid);
}
}
static void write_clsid(type_t *cls)
static void write_clsid(type_t *cls)
...
@@ -2462,16 +2505,21 @@ static void check_functions(const type_t *iface)
...
@@ -2462,16 +2505,21 @@ static void check_functions(const type_t *iface)
}
}
}
}
static void check_all_user_types(
ifref_list_t *ifref
s)
static void check_all_user_types(
const statement_list_t *stmt
s)
{
{
const ifref_t *ifref;
const statement_t *stmt;
const func_t *f;
if (
ifrefs) LIST_FOR_EACH_ENTRY(ifref, ifrefs, const ifref
_t, entry)
if (
stmts) LIST_FOR_EACH_ENTRY(stmt, stmts, const statement
_t, entry)
{
{
const func_list_t *fs = ifref->iface->funcs;
if (stmt->type == STMT_LIBRARY)
if (fs) LIST_FOR_EACH_ENTRY(f, fs, const func_t, entry)
check_all_user_types(stmt->u.lib->stmts);
check_for_additional_prototype_types(f->args);
else if (stmt->type == STMT_TYPE && stmt->u.type->type == RPC_FC_IP)
{
const func_t *f;
const func_list_t *fs = stmt->u.type->funcs;
if (fs) LIST_FOR_EACH_ENTRY(f, fs, const func_t, entry)
check_for_additional_prototype_types(f->args);
}
}
}
}
}
...
@@ -2491,3 +2539,78 @@ int is_valid_uuid(const char *s)
...
@@ -2491,3 +2539,78 @@ int is_valid_uuid(const char *s)
return s[i] == '\0';
return s[i] == '\0';
}
}
static statement_t *make_statement(enum statement_type type)
{
statement_t *stmt = xmalloc(sizeof(*stmt));
stmt->type = type;
return stmt;
}
static statement_t *make_statement_type_decl(type_t *type)
{
statement_t *stmt = make_statement(STMT_TYPE);
stmt->u.type = type;
return stmt;
}
static statement_t *make_statement_reference(type_t *type)
{
statement_t *stmt = make_statement(STMT_TYPEREF);
stmt->u.type = type;
return stmt;
}
static statement_t *make_statement_init_decl(var_t *var)
{
statement_t *stmt = make_statement(STMT_INITDECL);
stmt->u.var = var;
return stmt;
}
static statement_t *make_statement_extern(var_t *var)
{
statement_t *stmt = make_statement(STMT_EXTERN);
stmt->u.var = var;
return stmt;
}
static statement_t *make_statement_library(typelib_t *typelib)
{
statement_t *stmt = make_statement(STMT_LIBRARY);
stmt->u.lib = typelib;
return stmt;
}
static statement_t *make_statement_cppquote(const char *str)
{
statement_t *stmt = make_statement(STMT_CPPQUOTE);
stmt->u.str = str;
return stmt;
}
static statement_t *make_statement_importlib(const char *str)
{
statement_t *stmt = make_statement(STMT_IMPORTLIB);
stmt->u.str = str;
return stmt;
}
static statement_t *make_statement_module(type_t *type)
{
statement_t *stmt = make_statement(STMT_MODULE);
stmt->u.type = type;
return stmt;
}
static statement_list_t *append_statement(statement_list_t *list, statement_t *stmt)
{
if (!stmt) return list;
if (!list)
{
list = xmalloc( sizeof(*list) );
list_init( list );
}
list_add_tail( list, &stmt->entry );
return list;
}
tools/widl/proxy.c
View file @
df0e38c0
...
@@ -89,7 +89,7 @@ static void write_stubdesc(int expr_eval_routines)
...
@@ -89,7 +89,7 @@ static void write_stubdesc(int expr_eval_routines)
print_proxy
(
"
\n
"
);
print_proxy
(
"
\n
"
);
}
}
static
void
init_proxy
(
ifref_list_t
*
iface
s
)
static
void
init_proxy
(
const
statement_list_t
*
stmt
s
)
{
{
if
(
proxy
)
return
;
if
(
proxy
)
return
;
if
(
!
(
proxy
=
fopen
(
proxy_name
,
"w"
)))
if
(
!
(
proxy
=
fopen
(
proxy_name
,
"w"
)))
...
@@ -109,7 +109,7 @@ static void init_proxy(ifref_list_t *ifaces)
...
@@ -109,7 +109,7 @@ static void init_proxy(ifref_list_t *ifaces)
print_proxy
(
"
\n
"
);
print_proxy
(
"
\n
"
);
print_proxy
(
"#include
\"
%s
\"\n
"
,
header_name
);
print_proxy
(
"#include
\"
%s
\"\n
"
,
header_name
);
print_proxy
(
"
\n
"
);
print_proxy
(
"
\n
"
);
write_formatstringsdecl
(
proxy
,
indent
,
iface
s
,
need_proxy
);
write_formatstringsdecl
(
proxy
,
indent
,
stmt
s
,
need_proxy
);
write_stubdescproto
();
write_stubdescproto
();
}
}
...
@@ -592,14 +592,24 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
...
@@ -592,14 +592,24 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset)
print_proxy
(
"
\n
"
);
print_proxy
(
"
\n
"
);
}
}
static
int
does_any_iface
(
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
static
int
does_any_iface
(
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
ifref_t
*
ir
;
const
statement_t
*
stmt
;
if
(
ifaces
)
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
ir
,
ifaces
,
ifref_t
,
entry
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
if
(
pred
(
ir
->
iface
))
{
return
TRUE
;
if
(
stmt
->
type
==
STMT_LIBRARY
)
{
if
(
does_any_iface
(
stmt
->
u
.
lib
->
stmts
,
pred
))
return
TRUE
;
}
else
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
if
(
pred
(
stmt
->
u
.
type
))
return
TRUE
;
}
}
return
FALSE
;
return
FALSE
;
}
}
...
@@ -614,34 +624,84 @@ int need_stub(const type_t *iface)
...
@@ -614,34 +624,84 @@ int need_stub(const type_t *iface)
return
!
is_object
(
iface
->
attrs
)
&&
!
is_local
(
iface
->
attrs
);
return
!
is_object
(
iface
->
attrs
)
&&
!
is_local
(
iface
->
attrs
);
}
}
int
need_proxy_file
(
const
ifref_list_t
*
ifaces
)
int
need_proxy_file
(
const
statement_list_t
*
stmts
)
{
return
does_any_iface
(
stmts
,
need_proxy
);
}
int
need_stub_files
(
const
statement_list_t
*
stmts
)
{
return
does_any_iface
(
stmts
,
need_stub
);
}
static
void
write_proxy_stmts
(
const
statement_list_t
*
stmts
,
unsigned
int
*
proc_offset
)
{
const
statement_t
*
stmt
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
{
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_proxy_stmts
(
stmt
->
u
.
lib
->
stmts
,
proc_offset
);
else
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
if
(
need_proxy
(
stmt
->
u
.
type
))
write_proxy
(
stmt
->
u
.
type
,
proc_offset
);
}
}
}
static
void
write_proxy_iface_name_format
(
const
statement_list_t
*
stmts
,
const
char
*
format
)
{
{
return
does_any_iface
(
ifaces
,
need_proxy
);
const
statement_t
*
stmt
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
{
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_proxy_iface_name_format
(
stmt
->
u
.
lib
->
stmts
,
format
);
else
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
type_t
*
iface
=
stmt
->
u
.
type
;
if
(
iface
->
ref
&&
iface
->
funcs
&&
need_proxy
(
iface
))
fprintf
(
proxy
,
format
,
iface
->
name
);
}
}
}
}
int
need_stub_files
(
const
ifref_list_t
*
ifaces
)
static
void
write_iid_lookup
(
const
statement_list_t
*
stmts
,
const
char
*
file_id
,
int
*
c
)
{
{
return
does_any_iface
(
ifaces
,
need_stub
);
const
statement_t
*
stmt
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
{
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_iid_lookup
(
stmt
->
u
.
lib
->
stmts
,
file_id
,
c
);
else
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
type_t
*
iface
=
stmt
->
u
.
type
;
if
(
iface
->
ref
&&
iface
->
funcs
&&
need_proxy
(
iface
))
{
fprintf
(
proxy
,
" if (!_%s_CHECK_IID(%d))
\n
"
,
file_id
,
*
c
);
fprintf
(
proxy
,
" {
\n
"
);
fprintf
(
proxy
,
" *pIndex = %d;
\n
"
,
*
c
);
fprintf
(
proxy
,
" return 1;
\n
"
);
fprintf
(
proxy
,
" }
\n
"
);
(
*
c
)
++
;
}
}
}
}
}
void
write_proxies
(
ifref_list_t
*
iface
s
)
void
write_proxies
(
const
statement_list_t
*
stmt
s
)
{
{
ifref_t
*
cur
;
int
expr_eval_routines
;
int
expr_eval_routines
;
char
*
file_id
=
proxy_token
;
char
*
file_id
=
proxy_token
;
int
c
;
int
c
;
unsigned
int
proc_offset
=
0
;
unsigned
int
proc_offset
=
0
;
if
(
!
do_proxies
)
return
;
if
(
!
do_proxies
)
return
;
if
(
do_everything
&&
!
need_proxy_file
(
iface
s
))
return
;
if
(
do_everything
&&
!
need_proxy_file
(
stmt
s
))
return
;
init_proxy
(
iface
s
);
init_proxy
(
stmt
s
);
if
(
!
proxy
)
return
;
if
(
!
proxy
)
return
;
if
(
ifaces
)
write_proxy_stmts
(
stmts
,
&
proc_offset
);
LIST_FOR_EACH_ENTRY
(
cur
,
ifaces
,
ifref_t
,
entry
)
if
(
need_proxy
(
cur
->
iface
))
write_proxy
(
cur
->
iface
,
&
proc_offset
);
expr_eval_routines
=
write_expr_eval_routines
(
proxy
,
proxy_token
);
expr_eval_routines
=
write_expr_eval_routines
(
proxy
,
proxy_token
);
if
(
expr_eval_routines
)
if
(
expr_eval_routines
)
...
@@ -653,36 +713,26 @@ void write_proxies(ifref_list_t *ifaces)
...
@@ -653,36 +713,26 @@ void write_proxies(ifref_list_t *ifaces)
print_proxy
(
"#error Currently only Wine and WIN32 are supported.
\n
"
);
print_proxy
(
"#error Currently only Wine and WIN32 are supported.
\n
"
);
print_proxy
(
"#endif
\n
"
);
print_proxy
(
"#endif
\n
"
);
print_proxy
(
"
\n
"
);
print_proxy
(
"
\n
"
);
write_procformatstring
(
proxy
,
iface
s
,
need_proxy
);
write_procformatstring
(
proxy
,
stmt
s
,
need_proxy
);
write_typeformatstring
(
proxy
,
iface
s
,
need_proxy
);
write_typeformatstring
(
proxy
,
stmt
s
,
need_proxy
);
fprintf
(
proxy
,
"static const CInterfaceProxyVtbl* const _%s_ProxyVtblList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"static const CInterfaceProxyVtbl* const _%s_ProxyVtblList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"{
\n
"
);
fprintf
(
proxy
,
"{
\n
"
);
if
(
ifaces
)
write_proxy_iface_name_format
(
stmts
,
" (const CInterfaceProxyVtbl*)&_%sProxyVtbl,
\n
"
);
LIST_FOR_EACH_ENTRY
(
cur
,
ifaces
,
ifref_t
,
entry
)
if
(
cur
->
iface
->
ref
&&
cur
->
iface
->
funcs
&&
need_proxy
(
cur
->
iface
))
fprintf
(
proxy
,
" (const CInterfaceProxyVtbl*)&_%sProxyVtbl,
\n
"
,
cur
->
iface
->
name
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"static const CInterfaceStubVtbl* const _%s_StubVtblList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"static const CInterfaceStubVtbl* const _%s_StubVtblList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"{
\n
"
);
fprintf
(
proxy
,
"{
\n
"
);
if
(
ifaces
)
write_proxy_iface_name_format
(
stmts
,
" (const CInterfaceStubVtbl*)&_%sStubVtbl,
\n
"
);
LIST_FOR_EACH_ENTRY
(
cur
,
ifaces
,
ifref_t
,
entry
)
if
(
cur
->
iface
->
ref
&&
cur
->
iface
->
funcs
&&
need_proxy
(
cur
->
iface
))
fprintf
(
proxy
,
" (const CInterfaceStubVtbl*)&_%sStubVtbl,
\n
"
,
cur
->
iface
->
name
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"static PCInterfaceName const _%s_InterfaceNamesList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"static PCInterfaceName const _%s_InterfaceNamesList[] =
\n
"
,
file_id
);
fprintf
(
proxy
,
"{
\n
"
);
fprintf
(
proxy
,
"{
\n
"
);
if
(
ifaces
)
write_proxy_iface_name_format
(
stmts
,
"
\"
%s
\"
,
\n
"
);
LIST_FOR_EACH_ENTRY
(
cur
,
ifaces
,
ifref_t
,
entry
)
if
(
cur
->
iface
->
ref
&&
cur
->
iface
->
funcs
&&
need_proxy
(
cur
->
iface
))
fprintf
(
proxy
,
"
\"
%s
\"
,
\n
"
,
cur
->
iface
->
name
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
" 0
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"};
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
...
@@ -692,17 +742,7 @@ void write_proxies(ifref_list_t *ifaces)
...
@@ -692,17 +742,7 @@ void write_proxies(ifref_list_t *ifaces)
fprintf
(
proxy
,
"int __stdcall _%s_IID_Lookup(const IID* pIID, int* pIndex)
\n
"
,
file_id
);
fprintf
(
proxy
,
"int __stdcall _%s_IID_Lookup(const IID* pIID, int* pIndex)
\n
"
,
file_id
);
fprintf
(
proxy
,
"{
\n
"
);
fprintf
(
proxy
,
"{
\n
"
);
c
=
0
;
c
=
0
;
if
(
ifaces
)
write_iid_lookup
(
stmts
,
file_id
,
&
c
);
LIST_FOR_EACH_ENTRY
(
cur
,
ifaces
,
ifref_t
,
entry
)
if
(
cur
->
iface
->
ref
&&
cur
->
iface
->
funcs
&&
need_proxy
(
cur
->
iface
))
{
fprintf
(
proxy
,
" if (!_%s_CHECK_IID(%d))
\n
"
,
file_id
,
c
);
fprintf
(
proxy
,
" {
\n
"
);
fprintf
(
proxy
,
" *pIndex = %d;
\n
"
,
c
);
fprintf
(
proxy
,
" return 1;
\n
"
);
fprintf
(
proxy
,
" }
\n
"
);
c
++
;
}
fprintf
(
proxy
,
" return 0;
\n
"
);
fprintf
(
proxy
,
" return 0;
\n
"
);
fprintf
(
proxy
,
"}
\n
"
);
fprintf
(
proxy
,
"}
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
fprintf
(
proxy
,
"
\n
"
);
...
...
tools/widl/server.c
View file @
df0e38c0
...
@@ -386,58 +386,69 @@ static void init_server(void)
...
@@ -386,58 +386,69 @@ static void init_server(void)
}
}
void
write_server
(
ifref_list_t
*
ifaces
)
static
void
write_server_stmts
(
const
statement_list_t
*
stmts
,
int
expr_eval_routines
,
unsigned
int
*
proc_offset
)
{
const
statement_t
*
stmt
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
{
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_server_stmts
(
stmt
->
u
.
lib
->
stmts
,
expr_eval_routines
,
proc_offset
);
else
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
{
type_t
*
iface
=
stmt
->
u
.
type
;
if
(
!
need_stub
(
iface
))
continue
;
fprintf
(
server
,
"/*****************************************************************************
\n
"
);
fprintf
(
server
,
" * %s interface
\n
"
,
iface
->
name
);
fprintf
(
server
,
" */
\n
"
);
fprintf
(
server
,
"
\n
"
);
if
(
iface
->
funcs
)
{
write_serverinterfacedecl
(
iface
);
write_stubdescdecl
(
iface
);
write_function_stubs
(
iface
,
proc_offset
);
print_server
(
"#if !defined(__RPC_WIN32__)
\n
"
);
print_server
(
"#error Invalid build platform for this stub.
\n
"
);
print_server
(
"#endif
\n
"
);
fprintf
(
server
,
"
\n
"
);
write_stubdescriptor
(
iface
,
expr_eval_routines
);
write_dispatchtable
(
iface
);
}
}
}
}
void
write_server
(
const
statement_list_t
*
stmts
)
{
{
unsigned
int
proc_offset
=
0
;
unsigned
int
proc_offset
=
0
;
int
expr_eval_routines
;
int
expr_eval_routines
;
ifref_t
*
iface
;
if
(
!
do_server
)
if
(
!
do_server
)
return
;
return
;
if
(
do_everything
&&
!
need_stub_files
(
iface
s
))
if
(
do_everything
&&
!
need_stub_files
(
stmt
s
))
return
;
return
;
init_server
();
init_server
();
if
(
!
server
)
if
(
!
server
)
return
;
return
;
write_formatstringsdecl
(
server
,
indent
,
iface
s
,
need_stub
);
write_formatstringsdecl
(
server
,
indent
,
stmt
s
,
need_stub
);
expr_eval_routines
=
write_expr_eval_routines
(
server
,
server_token
);
expr_eval_routines
=
write_expr_eval_routines
(
server
,
server_token
);
if
(
expr_eval_routines
)
if
(
expr_eval_routines
)
write_expr_eval_routine_list
(
server
,
server_token
);
write_expr_eval_routine_list
(
server
,
server_token
);
write_user_quad_list
(
server
);
write_user_quad_list
(
server
);
if
(
ifaces
)
LIST_FOR_EACH_ENTRY
(
iface
,
ifaces
,
ifref_t
,
entry
)
write_server_stmts
(
stmts
,
expr_eval_routines
,
&
proc_offset
);
{
if
(
!
need_stub
(
iface
->
iface
))
continue
;
fprintf
(
server
,
"/*****************************************************************************
\n
"
);
fprintf
(
server
,
" * %s interface
\n
"
,
iface
->
iface
->
name
);
fprintf
(
server
,
" */
\n
"
);
fprintf
(
server
,
"
\n
"
);
if
(
iface
->
iface
->
funcs
)
{
write_serverinterfacedecl
(
iface
->
iface
);
write_stubdescdecl
(
iface
->
iface
);
write_function_stubs
(
iface
->
iface
,
&
proc_offset
);
print_server
(
"#if !defined(__RPC_WIN32__)
\n
"
);
print_server
(
"#error Invalid build platform for this stub.
\n
"
);
print_server
(
"#endif
\n
"
);
fprintf
(
server
,
"
\n
"
);
write_stubdescriptor
(
iface
->
iface
,
expr_eval_routines
);
write_dispatchtable
(
iface
->
iface
);
}
}
fprintf
(
server
,
"
\n
"
);
fprintf
(
server
,
"
\n
"
);
write_procformatstring
(
server
,
iface
s
,
need_stub
);
write_procformatstring
(
server
,
stmt
s
,
need_stub
);
write_typeformatstring
(
server
,
iface
s
,
need_stub
);
write_typeformatstring
(
server
,
stmt
s
,
need_stub
);
fclose
(
server
);
fclose
(
server
);
}
}
tools/widl/typegen.c
View file @
df0e38c0
...
@@ -43,7 +43,7 @@
...
@@ -43,7 +43,7 @@
static
const
func_t
*
current_func
;
static
const
func_t
*
current_func
;
static
const
type_t
*
current_structure
;
static
const
type_t
*
current_structure
;
static
const
ifref
_t
*
current_iface
;
static
const
type
_t
*
current_iface
;
static
struct
list
expr_eval_routines
=
LIST_INIT
(
expr_eval_routines
);
static
struct
list
expr_eval_routines
=
LIST_INIT
(
expr_eval_routines
);
struct
expr_eval_routine
struct
expr_eval_routine
...
@@ -370,13 +370,13 @@ static void write_formatdesc(FILE *f, int indent, const char *str)
...
@@ -370,13 +370,13 @@ static void write_formatdesc(FILE *f, int indent, const char *str)
print_file
(
f
,
indent
,
"
\n
"
);
print_file
(
f
,
indent
,
"
\n
"
);
}
}
void
write_formatstringsdecl
(
FILE
*
f
,
int
indent
,
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
void
write_formatstringsdecl
(
FILE
*
f
,
int
indent
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
print_file
(
f
,
indent
,
"#define TYPE_FORMAT_STRING_SIZE %d
\n
"
,
print_file
(
f
,
indent
,
"#define TYPE_FORMAT_STRING_SIZE %d
\n
"
,
get_size_typeformatstring
(
iface
s
,
pred
));
get_size_typeformatstring
(
stmt
s
,
pred
));
print_file
(
f
,
indent
,
"#define PROC_FORMAT_STRING_SIZE %d
\n
"
,
print_file
(
f
,
indent
,
"#define PROC_FORMAT_STRING_SIZE %d
\n
"
,
get_size_procformatstring
(
iface
s
,
pred
));
get_size_procformatstring
(
stmt
s
,
pred
));
fprintf
(
f
,
"
\n
"
);
fprintf
(
f
,
"
\n
"
);
write_formatdesc
(
f
,
indent
,
"TYPE"
);
write_formatdesc
(
f
,
indent
,
"TYPE"
);
...
@@ -477,33 +477,23 @@ static size_t write_procformatstring_type(FILE *file, int indent,
...
@@ -477,33 +477,23 @@ static size_t write_procformatstring_type(FILE *file, int indent,
return
size
;
return
size
;
}
}
void
write_procformatstring
(
FILE
*
file
,
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
static
void
write_procformatstring_stmts
(
FILE
*
file
,
int
indent
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
const
ifref_t
*
iface
;
const
statement_t
*
stmt
;
int
indent
=
0
;
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement_t
,
entry
)
const
var_t
*
var
;
print_file
(
file
,
indent
,
"static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
\n
"
);
print_file
(
file
,
indent
,
"{
\n
"
);
indent
++
;
print_file
(
file
,
indent
,
"0,
\n
"
);
print_file
(
file
,
indent
,
"{
\n
"
);
indent
++
;
if
(
ifaces
)
LIST_FOR_EACH_ENTRY
(
iface
,
ifaces
,
const
ifref_t
,
entry
)
{
{
if
(
!
pred
(
iface
->
iface
))
if
(
stmt
->
type
==
STMT_TYPE
&&
stmt
->
u
.
type
->
type
==
RPC_FC_IP
)
continue
;
if
(
iface
->
iface
->
funcs
)
{
{
const
func_t
*
func
;
const
func_t
*
func
;
LIST_FOR_EACH_ENTRY
(
func
,
iface
->
iface
->
funcs
,
const
func_t
,
entry
)
if
(
!
pred
(
stmt
->
u
.
type
))
continue
;
if
(
stmt
->
u
.
type
->
funcs
)
LIST_FOR_EACH_ENTRY
(
func
,
stmt
->
u
.
type
->
funcs
,
const
func_t
,
entry
)
{
{
if
(
is_local
(
func
->
def
->
attrs
))
continue
;
if
(
is_local
(
func
->
def
->
attrs
))
continue
;
/* emit argument data */
/* emit argument data */
if
(
func
->
args
)
if
(
func
->
args
)
{
{
const
var_t
*
var
;
LIST_FOR_EACH_ENTRY
(
var
,
func
->
args
,
const
var_t
,
entry
)
LIST_FOR_EACH_ENTRY
(
var
,
func
->
args
,
const
var_t
,
entry
)
write_procformatstring_type
(
file
,
indent
,
var
->
name
,
var
->
type
,
var
->
attrs
,
FALSE
);
write_procformatstring_type
(
file
,
indent
,
var
->
name
,
var
->
type
,
var
->
attrs
,
FALSE
);
}
}
...
@@ -518,7 +508,23 @@ void write_procformatstring(FILE *file, const ifref_list_t *ifaces, type_pred_t
...
@@ -518,7 +508,23 @@ void write_procformatstring(FILE *file, const ifref_list_t *ifaces, type_pred_t
write_procformatstring_type
(
file
,
indent
,
"return value"
,
get_func_return_type
(
func
),
NULL
,
TRUE
);
write_procformatstring_type
(
file
,
indent
,
"return value"
,
get_func_return_type
(
func
),
NULL
,
TRUE
);
}
}
}
}
else
if
(
stmt
->
type
==
STMT_LIBRARY
)
write_procformatstring_stmts
(
file
,
indent
,
stmt
->
u
.
lib
->
stmts
,
pred
);
}
}
}
void
write_procformatstring
(
FILE
*
file
,
const
statement_list_t
*
stmts
,
type_pred_t
pred
)
{
int
indent
=
0
;
print_file
(
file
,
indent
,
"static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
\n
"
);
print_file
(
file
,
indent
,
"{
\n
"
);
indent
++
;
print_file
(
file
,
indent
,
"0,
\n
"
);
print_file
(
file
,
indent
,
"{
\n
"
);
indent
++
;
write_procformatstring_stmts
(
file
,
indent
,
stmts
,
pred
);
print_file
(
file
,
indent
,
"0x0
\n
"
);
print_file
(
file
,
indent
,
"0x0
\n
"
);
indent
--
;
indent
--
;
...
@@ -2261,22 +2267,32 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty
...
@@ -2261,22 +2267,32 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty
return
retmask
;
return
retmask
;
}
}
static
size_t
process_tfs
(
FILE
*
file
,
const
ifref_list_t
*
ifaces
,
type_pred_t
pred
)
static
size_t
process_tfs_stmts
(
FILE
*
file
,
const
statement_list_t
*
stmts
,
type_pred_t
pred
,
unsigned
int
*
typeformat_offset
)
{
{
const
var_t
*
var
;
const
var_t
*
var
;
const
ifref_t
*
iface
;
const
statement_t
*
stmt
;
unsigned
int
typeformat_offset
=
2
;
if
(
ifaces
)
LIST_FOR_EACH_ENTRY
(
iface
,
ifaces
,
const
ifref
_t
,
entry
)
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement
_t
,
entry
)
{
{
if
(
!
pred
(
iface
->
iface
))
const
type_t
*
iface
;
if
(
stmt
->
type
==
STMT_LIBRARY
)
{
process_tfs_stmts
(
file
,
stmt
->
u
.
lib
->
stmts
,
pred
,
typeformat_offset
);
continue
;
}
else
if
(
stmt
->
type
!=
STMT_TYPE
||
stmt
->
u
.
type
->
type
!=
RPC_FC_IP
)
continue
;
iface
=
stmt
->
u
.
type
;
if
(
!
pred
(
iface
))
continue
;
continue
;
if
(
iface
->
iface
->
funcs
)
if
(
iface
->
funcs
)
{
{
const
func_t
*
func
;
const
func_t
*
func
;
current_iface
=
iface
;
current_iface
=
iface
;
LIST_FOR_EACH_ENTRY
(
func
,
iface
->
iface
->
funcs
,
const
func_t
,
entry
)
LIST_FOR_EACH_ENTRY
(
func
,
iface
->
funcs
,
const
func_t
,
entry
)
{
{
if
(
is_local
(
func
->
def
->
attrs
))
continue
;
if
(
is_local
(
func
->
def
->
attrs
))
continue
;
...
@@ -2287,7 +2303,7 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr
...
@@ -2287,7 +2303,7 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr
update_tfsoff
(
get_func_return_type
(
func
),
update_tfsoff
(
get_func_return_type
(
func
),
write_typeformatstring_var
(
write_typeformatstring_var
(
file
,
2
,
NULL
,
get_func_return_type
(
func
),
file
,
2
,
NULL
,
get_func_return_type
(
func
),
&
v
,
&
typeformat_offset
),
&
v
,
typeformat_offset
),
file
);
file
);
}
}
...
@@ -2298,17 +2314,24 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr
...
@@ -2298,17 +2314,24 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr
var
->
type
,
var
->
type
,
write_typeformatstring_var
(
write_typeformatstring_var
(
file
,
2
,
func
,
var
->
type
,
var
,
file
,
2
,
func
,
var
->
type
,
var
,
&
typeformat_offset
),
typeformat_offset
),
file
);
file
);
}
}
}
}
}
}
return
typeformat_offset
+
1
;
return
*
typeformat_offset
+
1
;
}
static
size_t
process_tfs
(
FILE
*
file
,
const
statement_list_t
*
stmts
,
type_pred_t
pred
)
{
unsigned
int
typeformat_offset
=
2
;
return
process_tfs_stmts
(
file
,
stmts
,
pred
,
&
typeformat_offset
);
}
}
void
write_typeformatstring
(
FILE
*
file
,
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
void
write_typeformatstring
(
FILE
*
file
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
int
indent
=
0
;
int
indent
=
0
;
...
@@ -2321,7 +2344,7 @@ void write_typeformatstring(FILE *file, const ifref_list_t *ifaces, type_pred_t
...
@@ -2321,7 +2344,7 @@ void write_typeformatstring(FILE *file, const ifref_list_t *ifaces, type_pred_t
print_file
(
file
,
indent
,
"NdrFcShort(0x0),
\n
"
);
print_file
(
file
,
indent
,
"NdrFcShort(0x0),
\n
"
);
set_all_tfswrite
(
TRUE
);
set_all_tfswrite
(
TRUE
);
process_tfs
(
file
,
iface
s
,
pred
);
process_tfs
(
file
,
stmt
s
,
pred
);
print_file
(
file
,
indent
,
"0x0
\n
"
);
print_file
(
file
,
indent
,
"0x0
\n
"
);
indent
--
;
indent
--
;
...
@@ -2984,29 +3007,39 @@ size_t get_size_procformatstring_func(const func_t *func)
...
@@ -2984,29 +3007,39 @@ size_t get_size_procformatstring_func(const func_t *func)
return
size
;
return
size
;
}
}
size_t
get_size_procformatstring
(
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
size_t
get_size_procformatstring
(
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
const
ifref_t
*
iface
;
const
statement_t
*
stmt
;
size_t
size
=
1
;
size_t
size
=
1
;
const
func_t
*
func
;
const
func_t
*
func
;
if
(
ifaces
)
LIST_FOR_EACH_ENTRY
(
iface
,
ifaces
,
const
ifref
_t
,
entry
)
if
(
stmts
)
LIST_FOR_EACH_ENTRY
(
stmt
,
stmts
,
const
statement
_t
,
entry
)
{
{
if
(
!
pred
(
iface
->
iface
))
const
type_t
*
iface
;
if
(
stmt
->
type
==
STMT_LIBRARY
)
{
size
+=
get_size_procformatstring
(
stmt
->
u
.
lib
->
stmts
,
pred
)
-
1
;
continue
;
}
else
if
(
stmt
->
type
!=
STMT_TYPE
&&
stmt
->
u
.
type
->
type
!=
RPC_FC_IP
)
continue
;
iface
=
stmt
->
u
.
type
;
if
(
!
pred
(
iface
))
continue
;
continue
;
if
(
iface
->
iface
->
funcs
)
if
(
iface
->
funcs
)
LIST_FOR_EACH_ENTRY
(
func
,
iface
->
iface
->
funcs
,
const
func_t
,
entry
)
LIST_FOR_EACH_ENTRY
(
func
,
iface
->
funcs
,
const
func_t
,
entry
)
if
(
!
is_local
(
func
->
def
->
attrs
))
if
(
!
is_local
(
func
->
def
->
attrs
))
size
+=
get_size_procformatstring_func
(
func
);
size
+=
get_size_procformatstring_func
(
func
);
}
}
return
size
;
return
size
;
}
}
size_t
get_size_typeformatstring
(
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
)
size_t
get_size_typeformatstring
(
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
)
{
{
set_all_tfswrite
(
FALSE
);
set_all_tfswrite
(
FALSE
);
return
process_tfs
(
NULL
,
iface
s
,
pred
);
return
process_tfs
(
NULL
,
stmt
s
,
pred
);
}
}
void
declare_stub_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
)
void
declare_stub_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
)
...
...
tools/widl/typegen.h
View file @
df0e38c0
...
@@ -38,15 +38,15 @@ enum remoting_phase
...
@@ -38,15 +38,15 @@ enum remoting_phase
typedef
int
(
*
type_pred_t
)(
const
type_t
*
);
typedef
int
(
*
type_pred_t
)(
const
type_t
*
);
void
write_formatstringsdecl
(
FILE
*
f
,
int
indent
,
ifref_list_t
*
iface
s
,
type_pred_t
pred
);
void
write_formatstringsdecl
(
FILE
*
f
,
int
indent
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
);
void
write_procformatstring
(
FILE
*
file
,
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
);
void
write_procformatstring
(
FILE
*
file
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
);
void
write_typeformatstring
(
FILE
*
file
,
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
);
void
write_typeformatstring
(
FILE
*
file
,
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
);
void
print_phase_basetype
(
FILE
*
file
,
int
indent
,
enum
remoting_phase
phase
,
enum
pass
pass
,
const
var_t
*
var
,
const
char
*
varname
);
void
print_phase_basetype
(
FILE
*
file
,
int
indent
,
enum
remoting_phase
phase
,
enum
pass
pass
,
const
var_t
*
var
,
const
char
*
varname
);
void
write_remoting_arguments
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
,
enum
pass
pass
,
enum
remoting_phase
phase
);
void
write_remoting_arguments
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
,
enum
pass
pass
,
enum
remoting_phase
phase
);
size_t
get_size_procformatstring_type
(
const
char
*
name
,
const
type_t
*
type
,
const
attr_list_t
*
attrs
);
size_t
get_size_procformatstring_type
(
const
char
*
name
,
const
type_t
*
type
,
const
attr_list_t
*
attrs
);
size_t
get_size_procformatstring_func
(
const
func_t
*
func
);
size_t
get_size_procformatstring_func
(
const
func_t
*
func
);
size_t
get_size_procformatstring
(
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
);
size_t
get_size_procformatstring
(
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
);
size_t
get_size_typeformatstring
(
const
ifref_list_t
*
iface
s
,
type_pred_t
pred
);
size_t
get_size_typeformatstring
(
const
statement_list_t
*
stmt
s
,
type_pred_t
pred
);
void
assign_stub_out_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
);
void
assign_stub_out_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
);
void
declare_stub_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
);
void
declare_stub_args
(
FILE
*
file
,
int
indent
,
const
func_t
*
func
);
int
write_expr_eval_routines
(
FILE
*
file
,
const
char
*
iface
);
int
write_expr_eval_routines
(
FILE
*
file
,
const
char
*
iface
);
...
...
tools/widl/typelib.c
View file @
df0e38c0
...
@@ -232,6 +232,7 @@ unsigned short get_type_vt(type_t *t)
...
@@ -232,6 +232,7 @@ unsigned short get_type_vt(type_t *t)
case
RPC_FC_CPSTRUCT
:
case
RPC_FC_CPSTRUCT
:
case
RPC_FC_CVSTRUCT
:
case
RPC_FC_CVSTRUCT
:
case
RPC_FC_BOGUS_STRUCT
:
case
RPC_FC_BOGUS_STRUCT
:
case
RPC_FC_COCLASS
:
return
VT_USERDEFINED
;
return
VT_USERDEFINED
;
case
0
:
case
0
:
return
t
->
kind
==
TKIND_PRIMITIVE
?
VT_VOID
:
VT_USERDEFINED
;
return
t
->
kind
==
TKIND_PRIMITIVE
?
VT_VOID
:
VT_USERDEFINED
;
...
@@ -241,20 +242,13 @@ unsigned short get_type_vt(type_t *t)
...
@@ -241,20 +242,13 @@ unsigned short get_type_vt(type_t *t)
return
0
;
return
0
;
}
}
void
start_typelib
(
char
*
name
,
const
attr_list_t
*
attrs
)
void
start_typelib
(
typelib_t
*
typelib_type
)
{
{
in_typelib
++
;
in_typelib
++
;
if
(
!
do_typelib
)
return
;
if
(
!
do_typelib
)
return
;
typelib
=
xmalloc
(
sizeof
(
*
typelib
));
typelib
=
typelib_type
;
typelib
->
name
=
xstrdup
(
name
);
typelib
->
filename
=
xstrdup
(
typelib_name
);
typelib
->
filename
=
xstrdup
(
typelib_name
);
typelib
->
attrs
=
attrs
;
list_init
(
&
typelib
->
entries
);
list_init
(
&
typelib
->
importlibs
);
if
(
is_attr
(
attrs
,
ATTR_POINTERDEFAULT
))
pointer_default
=
get_attrv
(
attrs
,
ATTR_POINTERDEFAULT
);
}
}
void
end_typelib
(
void
)
void
end_typelib
(
void
)
...
@@ -263,8 +257,6 @@ void end_typelib(void)
...
@@ -263,8 +257,6 @@ void end_typelib(void)
if
(
!
typelib
)
return
;
if
(
!
typelib
)
return
;
create_msft_typelib
(
typelib
);
create_msft_typelib
(
typelib
);
pointer_default
=
RPC_FC_UP
;
return
;
}
}
void
add_typelib_entry
(
type_t
*
t
)
void
add_typelib_entry
(
type_t
*
t
)
...
...
tools/widl/typelib.h
View file @
df0e38c0
...
@@ -22,7 +22,7 @@
...
@@ -22,7 +22,7 @@
#define __WIDL_TYPELIB_H
#define __WIDL_TYPELIB_H
extern
int
in_typelib
;
extern
int
in_typelib
;
extern
void
start_typelib
(
char
*
name
,
const
attr_list_t
*
attrs
);
extern
void
start_typelib
(
typelib_t
*
typelib_type
);
extern
void
end_typelib
(
void
);
extern
void
end_typelib
(
void
);
extern
void
add_typelib_entry
(
type_t
*
t
);
extern
void
add_typelib_entry
(
type_t
*
t
);
extern
void
add_importlib
(
const
char
*
name
);
extern
void
add_importlib
(
const
char
*
name
);
...
...
tools/widl/widl.c
View file @
df0e38c0
...
@@ -279,13 +279,13 @@ static char *eat_space(char *s)
...
@@ -279,13 +279,13 @@ static char *eat_space(char *s)
return
s
;
return
s
;
}
}
void
write_dlldata
(
ifref_list_t
*
iface
s
)
void
write_dlldata
(
const
statement_list_t
*
stmt
s
)
{
{
struct
list
filenames
=
LIST_INIT
(
filenames
);
struct
list
filenames
=
LIST_INIT
(
filenames
);
filename_node_t
*
node
;
filename_node_t
*
node
;
FILE
*
dlldata
;
FILE
*
dlldata
;
if
(
!
do_dlldata
||
!
need_proxy_file
(
iface
s
))
if
(
!
do_dlldata
||
!
need_proxy_file
(
stmt
s
))
return
;
return
;
dlldata
=
fopen
(
dlldata_name
,
"r"
);
dlldata
=
fopen
(
dlldata_name
,
"r"
);
...
...
tools/widl/widl.h
View file @
df0e38c0
...
@@ -68,9 +68,9 @@ extern FILE* header;
...
@@ -68,9 +68,9 @@ extern FILE* header;
extern
FILE
*
local_stubs
;
extern
FILE
*
local_stubs
;
extern
FILE
*
idfile
;
extern
FILE
*
idfile
;
extern
void
write_proxies
(
ifref_list_t
*
iface
s
);
extern
void
write_proxies
(
const
statement_list_t
*
stmt
s
);
extern
void
write_client
(
ifref_list_t
*
iface
s
);
extern
void
write_client
(
const
statement_list_t
*
stmt
s
);
extern
void
write_server
(
ifref_list_t
*
iface
s
);
extern
void
write_server
(
const
statement_list_t
*
stmt
s
);
extern
void
write_dlldata
(
ifref_list_t
*
iface
s
);
extern
void
write_dlldata
(
const
statement_list_t
*
stmt
s
);
#endif
#endif
tools/widl/widltypes.h
View file @
df0e38c0
...
@@ -34,6 +34,7 @@ typedef GUID UUID;
...
@@ -34,6 +34,7 @@ typedef GUID UUID;
#define TRUE 1
#define TRUE 1
#define FALSE 0
#define FALSE 0
#define RPC_FC_COCLASS 0xfd
#define RPC_FC_FUNCTION 0xfe
#define RPC_FC_FUNCTION 0xfe
typedef
struct
_loc_info_t
loc_info_t
;
typedef
struct
_loc_info_t
loc_info_t
;
...
@@ -51,6 +52,7 @@ typedef struct _importinfo_t importinfo_t;
...
@@ -51,6 +52,7 @@ typedef struct _importinfo_t importinfo_t;
typedef
struct
_typelib_t
typelib_t
;
typedef
struct
_typelib_t
typelib_t
;
typedef
struct
_user_type_t
user_type_t
;
typedef
struct
_user_type_t
user_type_t
;
typedef
struct
_user_type_t
context_handle_t
;
typedef
struct
_user_type_t
context_handle_t
;
typedef
struct
_statement_t
statement_t
;
typedef
struct
list
attr_list_t
;
typedef
struct
list
attr_list_t
;
typedef
struct
list
str_list_t
;
typedef
struct
list
str_list_t
;
...
@@ -62,6 +64,7 @@ typedef struct list ifref_list_t;
...
@@ -62,6 +64,7 @@ typedef struct list ifref_list_t;
typedef
struct
list
array_dims_t
;
typedef
struct
list
array_dims_t
;
typedef
struct
list
user_type_list_t
;
typedef
struct
list
user_type_list_t
;
typedef
struct
list
context_handle_list_t
;
typedef
struct
list
context_handle_list_t
;
typedef
struct
list
statement_list_t
;
enum
attr_type
enum
attr_type
{
{
...
@@ -192,6 +195,20 @@ enum type_kind
...
@@ -192,6 +195,20 @@ enum type_kind
TKIND_MAX
TKIND_MAX
};
};
enum
statement_type
{
STMT_LIBRARY
,
STMT_INITDECL
,
STMT_EXTERN
,
STMT_TYPE
,
STMT_TYPEREF
,
STMT_MODULE
,
STMT_TYPEDEF
,
STMT_IMPORT
,
STMT_IMPORTLIB
,
STMT_CPPQUOTE
};
struct
_loc_info_t
struct
_loc_info_t
{
{
const
char
*
input_name
;
const
char
*
input_name
;
...
@@ -332,6 +349,7 @@ struct _typelib_t {
...
@@ -332,6 +349,7 @@ struct _typelib_t {
const
attr_list_t
*
attrs
;
const
attr_list_t
*
attrs
;
struct
list
entries
;
struct
list
entries
;
struct
list
importlibs
;
struct
list
importlibs
;
statement_list_t
*
stmts
;
};
};
struct
_user_type_t
{
struct
_user_type_t
{
...
@@ -339,6 +357,19 @@ struct _user_type_t {
...
@@ -339,6 +357,19 @@ struct _user_type_t {
const
char
*
name
;
const
char
*
name
;
};
};
struct
_statement_t
{
struct
list
entry
;
enum
statement_type
type
;
union
{
ifref_t
iface
;
type_t
*
type
;
const
char
*
str
;
var_t
*
var
;
typelib_t
*
lib
;
}
u
;
};
extern
unsigned
char
pointer_default
;
extern
unsigned
char
pointer_default
;
extern
user_type_list_t
user_type_list
;
extern
user_type_list_t
user_type_list
;
...
...
tools/widl/write_msft.c
View file @
df0e38c0
...
@@ -986,10 +986,11 @@ static int encode_type(
...
@@ -986,10 +986,11 @@ static int encode_type(
case
RPC_FC_ENUM16
:
case
RPC_FC_ENUM16
:
add_enum_typeinfo
(
typelib
,
type
);
add_enum_typeinfo
(
typelib
,
type
);
break
;
break
;
case
RPC_FC_COCLASS
:
add_coclass_typeinfo
(
typelib
,
type
);
break
;
case
0
:
case
0
:
if
(
type
->
kind
==
TKIND_COCLASS
)
if
(
type
->
kind
==
TKIND_DISPATCH
)
add_coclass_typeinfo
(
typelib
,
type
);
else
if
(
type
->
kind
==
TKIND_DISPATCH
)
add_dispinterface_typeinfo
(
typelib
,
type
);
add_dispinterface_typeinfo
(
typelib
,
type
);
else
else
error
(
"encode_type: VT_USERDEFINED - can't yet add typedef's on the fly
\n
"
);
error
(
"encode_type: VT_USERDEFINED - can't yet add typedef's on the fly
\n
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment