Added partial support for function pointers.
This commit is contained in:
parent
3e1c5afdba
commit
ba5a968157
|
@ -446,8 +446,19 @@ static void write_icom_method_def(type_t *iface)
|
||||||
fprintf(header, ")(%s", arg ? "THIS_ " : "THIS" );
|
fprintf(header, ")(%s", arg ? "THIS_ " : "THIS" );
|
||||||
while (arg) {
|
while (arg) {
|
||||||
write_type(header, arg->type, arg, arg->tname);
|
write_type(header, arg->type, arg, arg->tname);
|
||||||
|
if (arg->args)
|
||||||
|
{
|
||||||
|
fprintf(header, " (STDMETHODCALLTYPE *");
|
||||||
|
write_name(header,arg);
|
||||||
|
fprintf( header,")(");
|
||||||
|
write_args(header, arg->args, NULL, 0, FALSE);
|
||||||
|
fprintf(header,")");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
fprintf(header, " ");
|
fprintf(header, " ");
|
||||||
write_name(header,arg);
|
write_name(header,arg);
|
||||||
|
}
|
||||||
write_array(header, arg->array, 0);
|
write_array(header, arg->array, 0);
|
||||||
arg = PREV_LINK(arg);
|
arg = PREV_LINK(arg);
|
||||||
if (arg) fprintf(header, ", ");
|
if (arg) fprintf(header, ", ");
|
||||||
|
@ -503,35 +514,53 @@ static int write_method_macro(type_t *iface, char *name)
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_args(FILE *h, var_t *arg, char *name, int method)
|
void write_args(FILE *h, var_t *arg, char *name, int method, int do_indent)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if (arg) {
|
if (arg) {
|
||||||
while (NEXT_LINK(arg))
|
while (NEXT_LINK(arg))
|
||||||
arg = NEXT_LINK(arg);
|
arg = NEXT_LINK(arg);
|
||||||
}
|
}
|
||||||
|
if (do_indent)
|
||||||
|
{
|
||||||
if (h == header) {
|
if (h == header) {
|
||||||
indentation++;
|
indentation++;
|
||||||
indent(0);
|
indent(0);
|
||||||
} else fprintf(h, " ");
|
} else fprintf(h, " ");
|
||||||
|
}
|
||||||
if (method == 1) {
|
if (method == 1) {
|
||||||
fprintf(h, "%s* This", name);
|
fprintf(h, "%s* This", name);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (count) {
|
if (count) {
|
||||||
|
if (do_indent)
|
||||||
|
{
|
||||||
fprintf(h, ",\n");
|
fprintf(h, ",\n");
|
||||||
if (h == header) indent(0);
|
if (h == header) indent(0);
|
||||||
else fprintf(h, " ");
|
else fprintf(h, " ");
|
||||||
}
|
}
|
||||||
|
else fprintf(h, ",");
|
||||||
|
}
|
||||||
write_type(h, arg->type, arg, arg->tname);
|
write_type(h, arg->type, arg, arg->tname);
|
||||||
|
if (arg->args)
|
||||||
|
{
|
||||||
|
fprintf(h, " (STDMETHODCALLTYPE *");
|
||||||
|
write_name(h,arg);
|
||||||
|
fprintf(h, ")(");
|
||||||
|
write_args(h, arg->args, NULL, 0, FALSE);
|
||||||
|
fprintf(h, ")");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
fprintf(h, " ");
|
fprintf(h, " ");
|
||||||
write_name(h, arg);
|
write_name(h, arg);
|
||||||
|
}
|
||||||
write_array(h, arg->array, 0);
|
write_array(h, arg->array, 0);
|
||||||
arg = PREV_LINK(arg);
|
arg = PREV_LINK(arg);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (h == header) indentation--;
|
if (do_indent && h == header) indentation--;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_cpp_method_def(type_t *iface)
|
static void write_cpp_method_def(type_t *iface)
|
||||||
|
@ -549,7 +578,7 @@ static void write_cpp_method_def(type_t *iface)
|
||||||
fprintf(header, " STDMETHODCALLTYPE ");
|
fprintf(header, " STDMETHODCALLTYPE ");
|
||||||
write_name(header, def);
|
write_name(header, def);
|
||||||
fprintf(header, "(\n");
|
fprintf(header, "(\n");
|
||||||
write_args(header, cur->args, iface->name, 2);
|
write_args(header, cur->args, iface->name, 2, TRUE);
|
||||||
fprintf(header, ") = 0;\n");
|
fprintf(header, ") = 0;\n");
|
||||||
fprintf(header, "\n");
|
fprintf(header, "\n");
|
||||||
}
|
}
|
||||||
|
@ -575,7 +604,7 @@ static void do_write_c_method_def(type_t *iface, char *name)
|
||||||
fprintf(header, " (STDMETHODCALLTYPE *");
|
fprintf(header, " (STDMETHODCALLTYPE *");
|
||||||
write_name(header, def);
|
write_name(header, def);
|
||||||
fprintf(header, ")(\n");
|
fprintf(header, ")(\n");
|
||||||
write_args(header, cur->args, name, 1);
|
write_args(header, cur->args, name, 1, TRUE);
|
||||||
fprintf(header, ");\n");
|
fprintf(header, ");\n");
|
||||||
fprintf(header, "\n");
|
fprintf(header, "\n");
|
||||||
}
|
}
|
||||||
|
@ -603,7 +632,7 @@ static void write_method_proto(type_t *iface)
|
||||||
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");
|
||||||
write_args(header, cur->args, iface->name, 1);
|
write_args(header, cur->args, iface->name, 1, TRUE);
|
||||||
fprintf(header, ");\n");
|
fprintf(header, ");\n");
|
||||||
/* stub prototype */
|
/* stub prototype */
|
||||||
fprintf(header, "void __RPC_STUB %s_", iface->name);
|
fprintf(header, "void __RPC_STUB %s_", iface->name);
|
||||||
|
@ -625,14 +654,14 @@ static void write_method_proto(type_t *iface)
|
||||||
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);
|
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(header, def->type, def, def->tname);
|
write_type(header, def->type, def, def->tname);
|
||||||
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");
|
||||||
write_args(header, cur->args, iface->name, 1);
|
write_args(header, cur->args, iface->name, 1, TRUE);
|
||||||
fprintf(header, ");\n");
|
fprintf(header, ");\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -655,7 +684,7 @@ static void write_function_proto(type_t *iface)
|
||||||
fprintf(header, " ");
|
fprintf(header, " ");
|
||||||
write_name(header, def);
|
write_name(header, def);
|
||||||
fprintf(header, "(\n");
|
fprintf(header, "(\n");
|
||||||
write_args(header, cur->args, iface->name, 0);
|
write_args(header, cur->args, iface->name, 0, TRUE);
|
||||||
fprintf(header, ");\n");
|
fprintf(header, ");\n");
|
||||||
|
|
||||||
cur = PREV_LINK(cur);
|
cur = PREV_LINK(cur);
|
||||||
|
|
|
@ -28,7 +28,7 @@ extern void write_type(FILE *h, type_t *t, var_t *v, char *n);
|
||||||
extern int is_object(attr_t *a);
|
extern int is_object(attr_t *a);
|
||||||
extern int is_local(attr_t *a);
|
extern int is_local(attr_t *a);
|
||||||
extern var_t *is_callas(attr_t *a);
|
extern var_t *is_callas(attr_t *a);
|
||||||
extern void write_args(FILE *h, var_t *arg, char *name, int obj);
|
extern void write_args(FILE *h, var_t *arg, char *name, int obj, int do_indent);
|
||||||
extern void write_forward(type_t *iface);
|
extern void write_forward(type_t *iface);
|
||||||
extern void write_interface(type_t *iface);
|
extern void write_interface(type_t *iface);
|
||||||
extern void write_typedef(type_t *type, var_t *names);
|
extern void write_typedef(type_t *type, var_t *names);
|
||||||
|
|
|
@ -243,6 +243,17 @@ arg: attributes type pident array { $$ = $3;
|
||||||
| type pident array { $$ = $2;
|
| type pident array { $$ = $2;
|
||||||
set_type($$, $1, $3);
|
set_type($$, $1, $3);
|
||||||
}
|
}
|
||||||
|
| attributes type pident '(' m_args ')' { $$ = $3;
|
||||||
|
$$->ptr_level--;
|
||||||
|
set_type($$, $2, NULL);
|
||||||
|
$$->attrs = $1;
|
||||||
|
$$->args = $5;
|
||||||
|
}
|
||||||
|
| type pident '(' m_args ')' { $$ = $2;
|
||||||
|
$$->ptr_level--;
|
||||||
|
set_type($$, $1, NULL);
|
||||||
|
$$->args = $4;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
array: { $$ = NULL; }
|
array: { $$ = NULL; }
|
||||||
|
|
|
@ -69,7 +69,7 @@ static void gen_proxy(type_t *iface, func_t *cur, int idx)
|
||||||
fprintf(proxy, " CALLBACK %s_", iface->name);
|
fprintf(proxy, " CALLBACK %s_", iface->name);
|
||||||
write_name(proxy, def);
|
write_name(proxy, def);
|
||||||
fprintf(proxy, "_Proxy(\n");
|
fprintf(proxy, "_Proxy(\n");
|
||||||
write_args(proxy, cur->args, iface->name, 1);
|
write_args(proxy, cur->args, iface->name, 1, TRUE);
|
||||||
fprintf(proxy, ")\n");
|
fprintf(proxy, ")\n");
|
||||||
fprintf(proxy, "{\n");
|
fprintf(proxy, "{\n");
|
||||||
/* local variables */
|
/* local variables */
|
||||||
|
|
|
@ -146,6 +146,7 @@ struct _var_t {
|
||||||
int ptr_level;
|
int ptr_level;
|
||||||
expr_t *array;
|
expr_t *array;
|
||||||
type_t *type;
|
type_t *type;
|
||||||
|
var_t *args; /* for function pointers */
|
||||||
char *tname;
|
char *tname;
|
||||||
attr_t *attrs;
|
attr_t *attrs;
|
||||||
expr_t *eval;
|
expr_t *eval;
|
||||||
|
|
Loading…
Reference in New Issue