Commit 32a2477e authored by Dan Hipschman's avatar Dan Hipschman Committed by Alexandre Julliard

widl: Add a declonly argument to write_type_left.

parent 4c8c425f
...@@ -109,7 +109,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -109,7 +109,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
} }
} }
write_type_left(client, def->type); write_type_decl_left(client, def->type);
if (needs_space_after(def->type)) if (needs_space_after(def->type))
fprintf(client, " "); fprintf(client, " ");
write_prefix_name(client, prefix_client, def); write_prefix_name(client, prefix_client, def);
...@@ -130,7 +130,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -130,7 +130,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
if (!is_void(def->type)) if (!is_void(def->type))
{ {
print_client(""); print_client("");
write_type_left(client, def->type); write_type_decl_left(client, def->type);
fprintf(client, " _RetVal;\n"); fprintf(client, " _RetVal;\n");
} }
......
...@@ -156,7 +156,7 @@ static void write_field(FILE *h, var_t *v) ...@@ -156,7 +156,7 @@ static void write_field(FILE *h, var_t *v)
} }
} }
indent(h, 0); indent(h, 0);
write_type(h, v->type, TRUE, "%s", name); write_type_def_or_decl(h, v->type, TRUE, "%s", name);
fprintf(h, ";\n"); fprintf(h, ";\n");
} }
} }
...@@ -193,19 +193,19 @@ int needs_space_after(type_t *t) ...@@ -193,19 +193,19 @@ int needs_space_after(type_t *t)
|| (!is_ptr(t) && (!is_conformant_array(t) || t->declarray))); || (!is_ptr(t) && (!is_conformant_array(t) || t->declarray)));
} }
void write_type_left(FILE *h, type_t *t) void write_type_left(FILE *h, type_t *t, int declonly)
{ {
if (t->is_const) fprintf(h, "const "); if (t->is_const) fprintf(h, "const ");
if (t->kind == TKIND_ALIAS) fprintf(h, "%s", t->name); if (t->kind == TKIND_ALIAS) fprintf(h, "%s", t->name);
else if (t->declarray) write_type_left(h, t->ref); else if (t->declarray) write_type_left(h, t->ref, declonly);
else { else {
if (t->sign > 0) fprintf(h, "signed "); if (t->sign > 0) fprintf(h, "signed ");
else if (t->sign < 0) fprintf(h, "unsigned "); else if (t->sign < 0) fprintf(h, "unsigned ");
switch (t->type) { switch (t->type) {
case RPC_FC_ENUM16: case RPC_FC_ENUM16:
case RPC_FC_ENUM32: case RPC_FC_ENUM32:
if (t->defined && !t->written && !t->ignore) { if (!declonly && t->defined && !t->written && !t->ignore) {
if (t->name) fprintf(h, "enum %s {\n", t->name); if (t->name) fprintf(h, "enum %s {\n", t->name);
else fprintf(h, "enum {\n"); else fprintf(h, "enum {\n");
t->written = TRUE; t->written = TRUE;
...@@ -223,7 +223,7 @@ void write_type_left(FILE *h, type_t *t) ...@@ -223,7 +223,7 @@ void write_type_left(FILE *h, type_t *t)
case RPC_FC_PSTRUCT: case RPC_FC_PSTRUCT:
case RPC_FC_BOGUS_STRUCT: case RPC_FC_BOGUS_STRUCT:
case RPC_FC_ENCAPSULATED_UNION: case RPC_FC_ENCAPSULATED_UNION:
if (t->defined && !t->written && !t->ignore) { if (!declonly && t->defined && !t->written && !t->ignore) {
if (t->name) fprintf(h, "struct %s {\n", t->name); if (t->name) fprintf(h, "struct %s {\n", t->name);
else fprintf(h, "struct {\n"); else fprintf(h, "struct {\n");
t->written = TRUE; t->written = TRUE;
...@@ -235,7 +235,7 @@ void write_type_left(FILE *h, type_t *t) ...@@ -235,7 +235,7 @@ void write_type_left(FILE *h, type_t *t)
else fprintf(h, "struct %s", t->name); else fprintf(h, "struct %s", t->name);
break; break;
case RPC_FC_NON_ENCAPSULATED_UNION: case RPC_FC_NON_ENCAPSULATED_UNION:
if (t->defined && !t->written && !t->ignore) { if (!declonly && t->defined && !t->written && !t->ignore) {
if (t->name) fprintf(h, "union %s {\n", t->name); if (t->name) fprintf(h, "union %s {\n", t->name);
else fprintf(h, "union {\n"); else fprintf(h, "union {\n");
t->written = TRUE; t->written = TRUE;
...@@ -253,7 +253,7 @@ void write_type_left(FILE *h, type_t *t) ...@@ -253,7 +253,7 @@ void write_type_left(FILE *h, type_t *t)
case RPC_FC_CARRAY: case RPC_FC_CARRAY:
case RPC_FC_CVARRAY: case RPC_FC_CVARRAY:
case RPC_FC_BOGUS_ARRAY: case RPC_FC_BOGUS_ARRAY:
write_type_left(h, t->ref); write_type_left(h, t->ref, declonly);
fprintf(h, "%s*", needs_space_after(t->ref) ? " " : ""); fprintf(h, "%s*", needs_space_after(t->ref) ? " " : "");
break; break;
default: default:
...@@ -274,20 +274,39 @@ void write_type_right(FILE *h, type_t *t, int is_field) ...@@ -274,20 +274,39 @@ void write_type_right(FILE *h, type_t *t, int is_field)
} }
} }
void write_type(FILE *h, type_t *t, int is_field, const char *fmt, ...) void write_type_v(FILE *h, type_t *t, int is_field, int declonly,
const char *fmt, va_list args)
{ {
write_type_left(h, t); write_type_left(h, t, declonly);
if (fmt) { if (fmt) {
va_list args;
va_start(args, fmt);
if (needs_space_after(t)) if (needs_space_after(t))
fprintf(h, " "); fprintf(h, " ");
vfprintf(h, fmt, args); vfprintf(h, fmt, args);
va_end(args);
} }
write_type_right(h, t, is_field); write_type_right(h, t, is_field);
} }
void write_type_def_or_decl(FILE *f, type_t *t, int field, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
write_type_v(f, t, field, FALSE, fmt, args);
va_end(args);
}
void write_type_decl(FILE *f, type_t *t, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
write_type_v(f, t, FALSE, TRUE, fmt, args);
va_end(args);
}
void write_type_decl_left(FILE *f, type_t *t)
{
write_type_left(f, t, TRUE);
}
static int user_type_registered(const char *name) static int user_type_registered(const char *name)
{ {
user_type_t *ut; user_type_t *ut;
...@@ -373,7 +392,7 @@ void write_context_handle_rundowns(void) ...@@ -373,7 +392,7 @@ void write_context_handle_rundowns(void)
void write_typedef(type_t *type) void write_typedef(type_t *type)
{ {
fprintf(header, "typedef "); fprintf(header, "typedef ");
write_type(header, type->orig, FALSE, "%s", type->name); write_type_def_or_decl(header, type->orig, FALSE, "%s", type->name);
fprintf(header, ";\n"); fprintf(header, ";\n");
} }
...@@ -414,13 +433,13 @@ void write_expr(FILE *h, const expr_t *e, int brackets) ...@@ -414,13 +433,13 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
break; break;
case EXPR_CAST: case EXPR_CAST:
fprintf(h, "("); fprintf(h, "(");
write_type(h, e->u.tref, FALSE, NULL); write_type_decl(h, e->u.tref, NULL);
fprintf(h, ")"); fprintf(h, ")");
write_expr(h, e->ref, 1); write_expr(h, e->ref, 1);
break; break;
case EXPR_SIZEOF: case EXPR_SIZEOF:
fprintf(h, "sizeof("); fprintf(h, "sizeof(");
write_type(h, e->u.tref, FALSE, NULL); write_type_decl(h, e->u.tref, NULL);
fprintf(h, ")"); fprintf(h, ")");
break; break;
case EXPR_SHL: case EXPR_SHL:
...@@ -469,7 +488,7 @@ void write_constdef(const var_t *v) ...@@ -469,7 +488,7 @@ void write_constdef(const var_t *v)
void write_externdef(const var_t *v) void write_externdef(const var_t *v)
{ {
fprintf(header, "extern const "); fprintf(header, "extern const ");
write_type(header, v->type, FALSE, "%s", v->name); write_type_def_or_decl(header, v->type, FALSE, "%s", v->name);
fprintf(header, ";\n\n"); fprintf(header, ";\n\n");
} }
...@@ -595,7 +614,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i ...@@ -595,7 +614,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
} }
if (arg->args) if (arg->args)
{ {
write_type_left(h, arg->type); write_type_decl_left(h, arg->type);
fprintf(h, " (STDMETHODCALLTYPE *"); fprintf(h, " (STDMETHODCALLTYPE *");
write_name(h,arg); write_name(h,arg);
fprintf(h, ")("); fprintf(h, ")(");
...@@ -603,7 +622,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i ...@@ -603,7 +622,7 @@ void write_args(FILE *h, const var_list_t *args, const char *name, int method, i
fprintf(h, ")"); fprintf(h, ")");
} }
else else
write_type(h, arg->type, FALSE, "%s", arg->name); write_type_decl(h, arg->type, "%s", arg->name);
count++; count++;
} }
if (do_indent) indentation--; if (do_indent) indentation--;
...@@ -621,7 +640,7 @@ static void write_cpp_method_def(const type_t *iface) ...@@ -621,7 +640,7 @@ static void write_cpp_method_def(const type_t *iface)
if (!is_callas(def->attrs)) { if (!is_callas(def->attrs)) {
indent(header, 0); indent(header, 0);
fprintf(header, "virtual "); fprintf(header, "virtual ");
write_type_left(header, def->type); write_type_decl_left(header, def->type);
fprintf(header, " STDMETHODCALLTYPE "); fprintf(header, " STDMETHODCALLTYPE ");
write_name(header, def); write_name(header, def);
fprintf(header, "(\n"); fprintf(header, "(\n");
...@@ -646,7 +665,7 @@ static void do_write_c_method_def(const type_t *iface, const char *name) ...@@ -646,7 +665,7 @@ static void do_write_c_method_def(const type_t *iface, const char *name)
const var_t *def = cur->def; const var_t *def = cur->def;
if (!is_callas(def->attrs)) { if (!is_callas(def->attrs)) {
indent(header, 0); indent(header, 0);
write_type_left(header, def->type); write_type_decl_left(header, def->type);
fprintf(header, " (STDMETHODCALLTYPE *"); fprintf(header, " (STDMETHODCALLTYPE *");
write_name(header, def); write_name(header, def);
fprintf(header, ")(\n"); fprintf(header, ")(\n");
...@@ -679,7 +698,7 @@ static void write_method_proto(const type_t *iface) ...@@ -679,7 +698,7 @@ static void write_method_proto(const type_t *iface)
if (!is_local(def->attrs)) { if (!is_local(def->attrs)) {
/* proxy prototype */ /* proxy prototype */
write_type_left(header, def->type); write_type_decl_left(header, def->type);
fprintf(header, " CALLBACK %s_", iface->name); fprintf(header, " CALLBACK %s_", iface->name);
write_name(header, def); write_name(header, def);
fprintf(header, "_Proxy(\n"); fprintf(header, "_Proxy(\n");
...@@ -701,14 +720,14 @@ static void write_method_proto(const type_t *iface) ...@@ -701,14 +720,14 @@ static void write_method_proto(const type_t *iface)
if (&m->entry != iface->funcs) { if (&m->entry != iface->funcs) {
const var_t *mdef = m->def; const var_t *mdef = m->def;
/* proxy prototype - use local prototype */ /* proxy prototype - use local prototype */
write_type_left(header, mdef->type); write_type_decl_left(header, mdef->type);
fprintf(header, " CALLBACK %s_", iface->name); fprintf(header, " CALLBACK %s_", iface->name);
write_name(header, mdef); write_name(header, mdef);
fprintf(header, "_Proxy(\n"); fprintf(header, "_Proxy(\n");
write_args(header, m->args, iface->name, 1, TRUE); write_args(header, m->args, iface->name, 1, TRUE);
fprintf(header, ");\n"); fprintf(header, ");\n");
/* stub prototype - use remotable prototype */ /* stub prototype - use remotable prototype */
write_type_left(header, def->type); write_type_decl_left(header, def->type);
fprintf(header, " __RPC_STUB %s_", iface->name); fprintf(header, " __RPC_STUB %s_", iface->name);
write_name(header, mdef); write_name(header, mdef);
fprintf(header, "_Stub(\n"); fprintf(header, "_Stub(\n");
...@@ -727,7 +746,7 @@ static void write_function_proto(const type_t *iface, const func_t *fun, const c ...@@ -727,7 +746,7 @@ static void write_function_proto(const type_t *iface, const func_t *fun, const c
var_t *def = fun->def; var_t *def = fun->def;
/* FIXME: do we need to handle call_as? */ /* FIXME: do we need to handle call_as? */
write_type_left(header, def->type); write_type_decl_left(header, def->type);
fprintf(header, " "); fprintf(header, " ");
write_prefix_name(header, prefix, def); write_prefix_name(header, prefix, def);
fprintf(header, "(\n"); fprintf(header, "(\n");
......
...@@ -32,9 +32,11 @@ extern int is_conformant_array(const type_t *t); ...@@ -32,9 +32,11 @@ extern int is_conformant_array(const type_t *t);
extern void write_name(FILE *h, const var_t *v); extern void write_name(FILE *h, const var_t *v);
extern void write_prefix_name(FILE *h, const char *prefix, const var_t *v); extern void write_prefix_name(FILE *h, const char *prefix, const var_t *v);
extern const char* get_name(const var_t *v); extern const char* get_name(const var_t *v);
extern void write_type_left(FILE *h, type_t *t); extern void write_type_left(FILE *h, type_t *t, int declonly);
extern void write_type_right(FILE *h, type_t *t, int is_field); extern void write_type_right(FILE *h, type_t *t, int is_field);
extern void write_type(FILE *h, type_t *t, int is_field, const char *fmt, ...); extern void write_type_def_or_decl(FILE *h, type_t *t, int is_field, const char *fmt, ...);
extern void write_type_decl(FILE *f, type_t *t, const char *fmt, ...);
extern void write_type_decl_left(FILE *f, type_t *t);
extern int needs_space_after(type_t *t); extern int needs_space_after(type_t *t);
extern int is_object(const attr_list_t *list); 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);
......
...@@ -325,20 +325,20 @@ statement: ';' {} ...@@ -325,20 +325,20 @@ statement: ';' {}
| constdef ';' { if (!parse_only && do_header) { write_constdef($1); } } | constdef ';' { if (!parse_only && do_header) { write_constdef($1); } }
| cppquote {} | cppquote {}
| enumdef ';' { if (!parse_only && do_header) { | enumdef ';' { if (!parse_only && do_header) {
write_type(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 ';' { if (!parse_only && do_header) { write_externdef($1); } }
| import {} | import {}
| structdef ';' { if (!parse_only && do_header) { | structdef ';' { if (!parse_only && do_header) {
write_type(header, $1, FALSE, NULL); write_type_def_or_decl(header, $1, FALSE, NULL);
fprintf(header, ";\n\n"); fprintf(header, ";\n\n");
} }
} }
| typedef ';' {} | typedef ';' {}
| uniondef ';' { if (!parse_only && do_header) { | uniondef ';' { if (!parse_only && do_header) {
write_type(header, $1, FALSE, NULL); write_type_def_or_decl(header, $1, FALSE, NULL);
fprintf(header, ";\n\n"); fprintf(header, ";\n\n");
} }
} }
......
...@@ -255,7 +255,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, ...@@ -255,7 +255,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
int has_ret = !is_void(def->type); int has_ret = !is_void(def->type);
indent = 0; indent = 0;
write_type_left(proxy, def->type); write_type_decl_left(proxy, def->type);
print_proxy( " STDMETHODCALLTYPE %s_", iface->name); print_proxy( " STDMETHODCALLTYPE %s_", iface->name);
write_name(proxy, def); write_name(proxy, def);
print_proxy( "_Proxy(\n"); print_proxy( "_Proxy(\n");
...@@ -266,7 +266,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, ...@@ -266,7 +266,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
/* local variables */ /* local variables */
if (has_ret) { if (has_ret) {
print_proxy( "" ); print_proxy( "" );
write_type_left(proxy, def->type); write_type_decl_left(proxy, def->type);
print_proxy( " _RetVal;\n"); print_proxy( " _RetVal;\n");
} }
print_proxy( "RPC_MESSAGE _RpcMessage;\n" ); print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
......
...@@ -187,7 +187,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) ...@@ -187,7 +187,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
if (is_context_handle(var->type)) if (is_context_handle(var->type))
{ {
print_server("("); print_server("(");
write_type_left(server, var->type); write_type_decl_left(server, var->type);
fprintf(server, ")%sNDRSContextValue(%s)", is_ptr(var->type) ? "" : "*", var->name); fprintf(server, ")%sNDRSContextValue(%s)", is_ptr(var->type) ? "" : "*", var->name);
} }
else else
......
...@@ -2548,7 +2548,7 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase, ...@@ -2548,7 +2548,7 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
if (phase == PHASE_MARSHAL) if (phase == PHASE_MARSHAL)
{ {
print_file(file, indent, "*("); print_file(file, indent, "*(");
write_type(file, is_ptr(type) ? type->ref : type, FALSE, NULL); write_type_decl(file, is_ptr(type) ? type->ref : type, NULL);
if (is_ptr(type)) if (is_ptr(type))
fprintf(file, " *)_StubMsg.Buffer = *"); fprintf(file, " *)_StubMsg.Buffer = *");
else else
...@@ -2567,12 +2567,12 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase, ...@@ -2567,12 +2567,12 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
fprintf(file, " = ("); fprintf(file, " = (");
else else
fprintf(file, " = *("); fprintf(file, " = *(");
write_type(file, is_ptr(type) ? type->ref : type, FALSE, NULL); write_type_decl(file, is_ptr(type) ? type->ref : type, NULL);
fprintf(file, " *)_StubMsg.Buffer;\n"); fprintf(file, " *)_StubMsg.Buffer;\n");
} }
print_file(file, indent, "_StubMsg.Buffer += sizeof("); print_file(file, indent, "_StubMsg.Buffer += sizeof(");
write_type(file, var->type, FALSE, NULL); write_type_decl(file, var->type, NULL);
fprintf(file, ");\n"); fprintf(file, ");\n");
} }
...@@ -2930,13 +2930,13 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets, ...@@ -2930,13 +2930,13 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
break; break;
case EXPR_CAST: case EXPR_CAST:
fprintf(h, "("); fprintf(h, "(");
write_type(h, e->u.tref, FALSE, NULL); write_type_decl(h, e->u.tref, NULL);
fprintf(h, ")"); fprintf(h, ")");
write_struct_expr(h, e->ref, 1, fields, structvar); write_struct_expr(h, e->ref, 1, fields, structvar);
break; break;
case EXPR_SIZEOF: case EXPR_SIZEOF:
fprintf(h, "sizeof("); fprintf(h, "sizeof(");
write_type(h, e->u.tref, FALSE, NULL); write_type_decl(h, e->u.tref, NULL);
fprintf(h, ")"); fprintf(h, ")");
break; break;
case EXPR_SHL: case EXPR_SHL:
...@@ -2987,7 +2987,7 @@ void declare_stub_args( FILE *file, int indent, const func_t *func ) ...@@ -2987,7 +2987,7 @@ void declare_stub_args( FILE *file, int indent, const func_t *func )
if (!is_void(def->type)) if (!is_void(def->type))
{ {
print_file(file, indent, ""); print_file(file, indent, "");
write_type_left(file, def->type); write_type_decl_left(file, def->type);
fprintf(file, " _RetVal;\n"); fprintf(file, " _RetVal;\n");
} }
...@@ -3010,12 +3010,12 @@ void declare_stub_args( FILE *file, int indent, const func_t *func ) ...@@ -3010,12 +3010,12 @@ void declare_stub_args( FILE *file, int indent, const func_t *func )
if (!in_attr && !var->type->size_is && !is_string) if (!in_attr && !var->type->size_is && !is_string)
{ {
print_file(file, indent, ""); print_file(file, indent, "");
write_type(file, var->type->ref, FALSE, "_W%u", i++); write_type_decl(file, var->type->ref, "_W%u", i++);
fprintf(file, ";\n"); fprintf(file, ";\n");
} }
print_file(file, indent, ""); print_file(file, indent, "");
write_type_left(file, var->type); write_type_decl_left(file, var->type);
fprintf(file, " "); fprintf(file, " ");
if (var->type->declarray) { if (var->type->declarray) {
fprintf(file, "( *"); fprintf(file, "( *");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment