yet another widl patch
Ove Kaaven
ovehk at ping.uio.no
Tue Dec 3 06:45:11 CST 2002
I can now parse all the IDL in the DCOM specification, it seems.
Log:
Ove Kaaven <ovek at transgaming.com>
Parse the NOT operator, the [idempotent] attribute, and the handle_t and
error_status_t types. Improved some parsing rules to get rid of the
LINK_LAST and LINK_SAFE macros. Enclose generated .h file within an extern
"C" (for C++). Output function prototypes for regular RPC interfaces.
Fixed a couple of bugs.
Index: tools/widl/header.c
===================================================================
RCS file: /home/wine/wine/tools/widl/header.c,v
retrieving revision 1.7
diff -u -r1.7 header.c
--- tools/widl/header.c 30 Nov 2002 01:49:46 -0000 1.7
+++ tools/widl/header.c 3 Dec 2002 12:37:02 -0000
@@ -185,7 +185,7 @@
break;
case RPC_FC_HYPER:
if (t->ref) fprintf(h, t->ref->name);
- else fprintf(h, "__int64");
+ else fprintf(h, "hyper");
break;
case RPC_FC_FLOAT:
fprintf(h, "float");
@@ -206,6 +206,14 @@
}
else fprintf(h, "enum %s", t->name);
break;
+ case RPC_FC_ERROR_STATUS_T:
+ if (t->ref) fprintf(h, t->ref->name);
+ else fprintf(h, "error_status_t");
+ break;
+ case RPC_FC_BIND_PRIMITIVE:
+ if (t->ref) fprintf(h, t->ref->name);
+ else fprintf(h, "handle_t");
+ break;
case RPC_FC_STRUCT:
case RPC_FC_ENCAPSULATED_UNION:
if (t->defined && !t->written) {
@@ -283,6 +291,10 @@
fprintf(h, "-");
do_write_expr(h, e->ref, 1);
break;
+ case EXPR_NOT:
+ fprintf(h, "~");
+ do_write_expr(h, e->ref, 1);
+ break;
case EXPR_PPTR:
fprintf(h, "*");
do_write_expr(h, e->ref, 1);
@@ -350,40 +362,46 @@
/********** INTERFACES **********/
-uuid_t *get_uuid(attr_t *a)
+int is_attr(attr_t *a, enum attr_type t)
{
while (a) {
- if (a->type == ATTR_UUID) return a->u.pval;
+ if (a->type == t) return 1;
a = NEXT_LINK(a);
}
- return NULL;
+ return 0;
}
-int is_object(attr_t *a)
+void *get_attrp(attr_t *a, enum attr_type t)
{
while (a) {
- if (a->type == ATTR_OBJECT) return 1;
+ if (a->type == t) return a->u.pval;
a = NEXT_LINK(a);
}
- return 0;
+ return NULL;
}
-int is_local(attr_t *a)
+DWORD get_attrv(attr_t *a, enum attr_type t)
{
while (a) {
- if (a->type == ATTR_LOCAL) return 1;
+ if (a->type == t) return a->u.ival;
a = NEXT_LINK(a);
}
return 0;
}
+int is_object(attr_t *a)
+{
+ return is_attr(a, ATTR_OBJECT);
+}
+
+int is_local(attr_t *a)
+{
+ return is_attr(a, ATTR_LOCAL);
+}
+
var_t *is_callas(attr_t *a)
{
- while (a) {
- if (a->type == ATTR_CALLAS) return a->u.pval;
- a = NEXT_LINK(a);
- }
- return NULL;
+ return get_attrp(a, ATTR_CALLAS);
}
static void write_method_def(type_t *iface)
@@ -476,19 +494,25 @@
return idx;
}
-void write_method_args(FILE *h, var_t *arg, char *name)
+void write_args(FILE *h, var_t *arg, char *name, int method)
{
+ int count = 0;
if (arg) {
while (NEXT_LINK(arg))
arg = NEXT_LINK(arg);
}
- fprintf(h, " %s* This", name);
+ if (method) {
+ fprintf(h, " %s* This", name);
+ count++;
+ }
+ else fprintf(h, " ");
while (arg) {
- fprintf(h, ",\n ");
+ if (count) fprintf(h, ",\n ");
write_type(h, arg->type, arg, arg->tname);
fprintf(h, " ");
write_name(h,arg);
arg = PREV_LINK(arg);
+ count++;
}
}
@@ -503,9 +527,9 @@
/* proxy prototype */
write_type(header, def->type, def, def->tname);
fprintf(header, " CALLBACK %s_", iface->name);
- write_name(header,def);
+ write_name(header, def);
fprintf(header, "_Proxy(\n");
- write_method_args(header, cur->args, iface->name);
+ write_args(header, cur->args, iface->name, 1);
fprintf(header, ");\n");
/* stub prototype */
fprintf(header, "void __RPC_STUB %s_", iface->name);
@@ -527,14 +551,14 @@
fprintf(header, " CALLBACK %s_", iface->name);
write_name(header, mdef);
fprintf(header, "_Proxy(\n");
- write_method_args(header, m->args, iface->name);
+ write_args(header, m->args, iface->name, 1);
fprintf(header, ");\n");
/* stub prototype - use remotable prototype */
write_type(header, def->type, def, def->tname);
fprintf(header, " __RPC_STUB %s_", iface->name);
write_name(header, mdef);
fprintf(header, "_Stub(\n");
- write_method_args(header, cur->args, iface->name);
+ write_args(header, cur->args, iface->name, 1);
fprintf(header, ");\n");
}
else {
@@ -546,6 +570,24 @@
}
}
+static void write_function_proto(type_t *iface)
+{
+ func_t *cur = iface->funcs;
+ while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
+ while (cur) {
+ var_t *def = cur->def;
+ /* FIXME: do we need to handle call_as? */
+ write_type(header, def->type, def, def->tname);
+ fprintf(header, " ");
+ write_name(header, def);
+ fprintf(header, "(\n");
+ write_args(header, cur->args, iface->name, 0);
+ fprintf(header, ");\n");
+
+ cur = PREV_LINK(cur);
+ }
+}
+
void write_forward(type_t *iface)
{
/* C/C++ forwards should only be written for object interfaces, so if we
@@ -561,21 +603,15 @@
void write_guid(type_t *iface)
{
- uuid_t *uuid = get_uuid(iface->attrs);
+ uuid_t *uuid = get_attrp(iface->attrs, ATTR_UUID);
if (!uuid) return;
fprintf(header, "DEFINE_GUID(IID_%s, 0x%08lx, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x);\n",
iface->name, uuid->Data1, uuid->Data2, uuid->Data3, uuid->Data4[0], uuid->Data4[1],
uuid->Data4[2], uuid->Data4[3], uuid->Data4[4], uuid->Data4[5], uuid->Data4[6], uuid->Data4[7]);
}
-void write_interface(type_t *iface)
+void write_com_interface(type_t *iface)
{
- if (!is_object(iface->attrs)) {
- if (!iface->funcs) return;
- yywarning("RPC interfaces not supported yet\n");
- return;
- }
-
if (!iface->funcs) {
yywarning("%s has no methods", iface->name);
return;
@@ -605,4 +641,30 @@
if (!is_local(iface->attrs))
write_proxy(iface);
+}
+
+void write_rpc_interface(type_t *iface)
+{
+ DWORD ver = get_attrv(iface->attrs, ATTR_VERSION);
+
+ if (!iface->funcs) return;
+
+ fprintf(header, "/*****************************************************************************\n");
+ fprintf(header, " * %s interface (v%d.%d)\n", iface->name, LOWORD(ver), HIWORD(ver));
+ fprintf(header, " */\n");
+ write_guid(iface);
+ fprintf(header, "extern RPC_IF_HANDLE %s_v%d_%d_c_ifspec;\n", iface->name, LOWORD(ver), HIWORD(ver));
+ fprintf(header, "extern RPC_IF_HANDLE %s_v%d_%d_s_ifspec;\n", iface->name, LOWORD(ver), HIWORD(ver));
+ write_function_proto(iface);
+ fprintf(header, "\n");
+
+ /* FIXME: server/client code */
+}
+
+void write_interface(type_t *iface)
+{
+ if (is_object(iface->attrs))
+ write_com_interface(iface);
+ else
+ write_rpc_interface(iface);
}
Index: tools/widl/header.h
===================================================================
RCS file: /home/wine/wine/tools/widl/header.h,v
retrieving revision 1.2
diff -u -r1.2 header.h
--- tools/widl/header.h 30 Nov 2002 01:49:46 -0000 1.2
+++ tools/widl/header.h 3 Dec 2002 12:37:02 -0000
@@ -28,7 +28,7 @@
extern int is_object(attr_t *a);
extern int is_local(attr_t *a);
extern var_t *is_callas(attr_t *a);
-extern void write_method_args(FILE *h, var_t *arg, char *name);
+extern void write_args(FILE *h, var_t *arg, char *name, int obj);
extern void write_forward(type_t *iface);
extern void write_interface(type_t *iface);
extern void write_typedef(type_t *type, var_t *names);
Index: tools/widl/parser.l
===================================================================
RCS file: /home/wine/wine/tools/widl/parser.l,v
retrieving revision 1.9
diff -u -r1.9 parser.l
--- tools/widl/parser.l 30 Nov 2002 01:49:46 -0000 1.9
+++ tools/widl/parser.l 3 Dec 2002 12:37:02 -0000
@@ -80,18 +80,18 @@
uuid_t* uuid = xmalloc(sizeof(uuid_t));
char b[3];
/* it would be nice to use UuidFromStringA */
- uuid->Data1 = strtol(u, NULL, 16);
- uuid->Data2 = strtol(u+9, NULL, 16);
- uuid->Data3 = strtol(u+14, NULL, 16);
+ uuid->Data1 = strtoul(u, NULL, 16);
+ uuid->Data2 = strtoul(u+9, NULL, 16);
+ uuid->Data3 = strtoul(u+14, NULL, 16);
b[2] = 0;
- memcpy(b, u+19, 2); uuid->Data4[0] = strtol(b, NULL, 16);
- memcpy(b, u+21, 2); uuid->Data4[1] = strtol(b, NULL, 16);
- memcpy(b, u+24, 2); uuid->Data4[2] = strtol(b, NULL, 16);
- memcpy(b, u+26, 2); uuid->Data4[3] = strtol(b, NULL, 16);
- memcpy(b, u+28, 2); uuid->Data4[4] = strtol(b, NULL, 16);
- memcpy(b, u+30, 2); uuid->Data4[5] = strtol(b, NULL, 16);
- memcpy(b, u+32, 2); uuid->Data4[6] = strtol(b, NULL, 16);
- memcpy(b, u+34, 2); uuid->Data4[7] = strtol(b, NULL, 16);
+ memcpy(b, u+19, 2); uuid->Data4[0] = strtoul(b, NULL, 16);
+ memcpy(b, u+21, 2); uuid->Data4[1] = strtoul(b, NULL, 16);
+ memcpy(b, u+24, 2); uuid->Data4[2] = strtoul(b, NULL, 16);
+ memcpy(b, u+26, 2); uuid->Data4[3] = strtoul(b, NULL, 16);
+ memcpy(b, u+28, 2); uuid->Data4[4] = strtoul(b, NULL, 16);
+ memcpy(b, u+30, 2); uuid->Data4[5] = strtoul(b, NULL, 16);
+ memcpy(b, u+32, 2); uuid->Data4[6] = strtoul(b, NULL, 16);
+ memcpy(b, u+34, 2); uuid->Data4[7] = strtoul(b, NULL, 16);
return uuid;
}
@@ -188,13 +188,18 @@
{"double", tDOUBLE},
/* ... */
{"enum", tENUM},
+ {"error_status_t", tERRORSTATUST},
/* ... */
{"extern", tEXTERN},
/* ... */
{"float", tFLOAT},
/* ... */
+ {"handle_t", tHANDLET},
+/* ... */
{"hyper", tHYPER},
/* ... */
+ {"idempotent", tIDEMPOTENT},
+/* ... */
{"iid_is", tIIDIS},
/* ... */
{"import", tIMPORT},
@@ -271,7 +276,10 @@
}
}
#endif
- if (kwp) return kwp->token;
+ if (kwp) {
+ yylval.str = (char*)kwp->kw;
+ return kwp->token;
+ }
yylval.str = xstrdup(kw);
return is_type(kw) ? aKNOWNTYPE : aIDENTIFIER;
}
Index: tools/widl/parser.y
===================================================================
RCS file: /home/wine/wine/tools/widl/parser.y,v
retrieving revision 1.7
diff -u -r1.7 parser.y
--- tools/widl/parser.y 30 Nov 2002 01:49:46 -0000 1.7
+++ tools/widl/parser.y 3 Dec 2002 12:37:02 -0000
@@ -94,6 +94,8 @@
static type_t std_bool = { "boolean" };
static type_t std_int = { "int" };
+static type_t std_int64 = { "__int64" };
+static type_t std_uhyper = { "MIDL_uhyper" };
%}
%union {
@@ -122,10 +124,12 @@
%token tCONTEXTHANDLESERIALIZE tCONTROL tCPPQUOTE
%token tDEFAULT
%token tDOUBLE
-%token tENUM
+%token tENUM tERRORSTATUST
%token tEXTERN
%token tFLOAT
+%token tHANDLET
%token tHYPER
+%token tIDEMPOTENT
%token tIIDIS
%token tIMPORT tIMPORTLIB
%token tIN tINCLUDE tINLINE
@@ -158,7 +162,8 @@
%token tPOINTERTYPE
%type <attr> m_attributes attributes attrib_list attribute
-%type <expr> exprs expr_list expr array expr_const
+%type <expr> m_exprs /* exprs expr_list */ m_expr expr expr_list_const expr_const
+%type <expr> array array_list
%type <type> inherit interface interfacehdr interfacedef lib_statements
%type <type> base_type int_std
%type <type> enumdef structdef typedef uniondef
@@ -167,7 +172,7 @@
%type <var> fields field s_field cases case enums enum_list enum constdef externdef
%type <var> m_ident t_ident ident p_ident pident pident_list
%type <func> funcdef int_statements
-%type <num> pointer_type
+%type <num> pointer_type version
%left ','
%left '|'
@@ -175,6 +180,7 @@
%left '-' '+'
%left '*' '/'
%left SHL SHR
+%right '~'
%right CAST
%right PPTR
%right NEG
@@ -240,45 +246,52 @@
;
array: { $$ = NULL; }
- | '[' exprs ']' { $$ = $2; }
+ | '[' array_list ']' { $$ = $2; }
| '[' '*' ']' { $$ = make_expr(EXPR_VOID); }
;
+array_list: m_expr /* size of first dimension is optional */
+ | array_list ',' expr { LINK($3, $1); $$ = $3; }
+ | array_list ']' '[' expr { LINK($4, $1); $$ = $4; }
+ ;
+
m_attributes: { $$ = NULL; }
| attributes
;
attributes:
- m_attributes '[' attrib_list ']' { LINK_LAST($3, $1); $$ = $3; }
+ '[' attrib_list ']' { $$ = $2; }
;
attrib_list: attribute
- | attrib_list ',' attribute { LINK_SAFE($3, $1); $$ = $3; /* FIXME: don't use SAFE */ }
+ | attrib_list ',' attribute { LINK($3, $1); $$ = $3; }
+ | attrib_list ']' '[' attribute { LINK($4, $1); $$ = $4; }
;
attribute:
tASYNC { $$ = make_attr(ATTR_ASYNC); }
| tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); }
- | tCASE '(' expr_list ')' { $$ = NULL; }
- | tCONTEXTHANDLE { $$ = NULL; }
- | tCONTEXTHANDLENOSERIALIZE { $$ = NULL; }
- | tCONTEXTHANDLESERIALIZE { $$ = NULL; }
+ | tCASE '(' expr_list_const ')' { $$ = make_attrp(ATTR_CASE, $3); }
+ | tCONTEXTHANDLE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
+ | tCONTEXTHANDLENOSERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
+ | tCONTEXTHANDLESERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
| tDEFAULT { $$ = make_attr(ATTR_DEFAULT); }
+ | tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
| tIIDIS '(' ident ')' { $$ = make_attrp(ATTR_IIDIS, $3); }
| tIN { $$ = make_attr(ATTR_IN); }
- | tLENGTHIS '(' exprs ')' { $$ = NULL; }
+ | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); }
| tLOCAL { $$ = make_attr(ATTR_LOCAL); }
| tOBJECT { $$ = make_attr(ATTR_OBJECT); }
| tOLEAUTOMATION { $$ = make_attr(ATTR_OLEAUTOMATION); }
| tOUT { $$ = make_attr(ATTR_OUT); }
| tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
- | tSIZEIS '(' exprs ')' { $$ = NULL; }
+ | tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); }
| tSTRING { $$ = make_attr(ATTR_STRING); }
- | tSWITCHIS '(' expr ')' { $$ = NULL; }
- | tSWITCHTYPE '(' type ')' { $$ = NULL; }
+ | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
+ | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, type_ref($3)); }
| tUUID '(' aUUID ')' { $$ = make_attrp(ATTR_UUID, $3); }
| tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
- | tVERSION '(' version ')' { $$ = NULL; }
+ | tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
| tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, type_ref($3)); }
| pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
;
@@ -293,9 +306,9 @@
}
;
-case: tCASE expr ':' field { /* attr_t *a = NULL; */ /* FIXME */
+case: tCASE expr ':' field { attr_t *a = make_attrp(ATTR_CASE, $2);
$$ = $4; if (!$$) $$ = make_var(NULL);
- /* LINK(a, $$->attrs); $$->attrs = a; */
+ LINK(a, $$->attrs); $$->attrs = a;
}
| tDEFAULT ':' field { attr_t *a = make_attr(ATTR_DEFAULT);
$$ = $3; if (!$$) $$ = make_var(NULL);
@@ -337,6 +350,11 @@
}
;
+m_exprs: m_expr
+ | m_exprs ',' m_expr { LINK($3, $1); $$ = $3; }
+ ;
+
+/*
exprs: { $$ = make_expr(EXPR_VOID); }
| expr_list
;
@@ -344,6 +362,11 @@
expr_list: expr
| expr_list ',' expr { LINK($3, $1); $$ = $3; }
;
+*/
+
+m_expr: { $$ = make_expr(EXPR_VOID); }
+ | expr
+ ;
expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
| aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
@@ -356,6 +379,7 @@
| expr '/' expr { $$ = make_expr2(EXPR_DIV, $1, $3); }
| expr SHL expr { $$ = make_expr2(EXPR_SHL, $1, $3); }
| expr SHR expr { $$ = make_expr2(EXPR_SHR, $1, $3); }
+ | '~' expr { $$ = make_expr1(EXPR_NOT, $2); }
| '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); }
| '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); }
| '(' type ')' expr %prec CAST { $$ = make_exprt(EXPR_CAST, $2, $4); }
@@ -363,6 +387,10 @@
| '(' expr ')' { $$ = $2; }
;
+expr_list_const: expr_const
+ | expr_list_const ',' expr_const { LINK($3, $1); $$ = $3; }
+ ;
+
expr_const: expr { $$ = $1;
if (!$$->is_const) yyerror("expression is not constant\n");
}
@@ -406,6 +434,8 @@
;
ident: aIDENTIFIER { $$ = make_var($1); }
+/* some "reserved words" used in attributes are also used as field names in some MS IDL files */
+ | tVERSION { $$ = make_var($<str>1); }
;
base_type: tBYTE { $$ = make_type(RPC_FC_BYTE, NULL); }
@@ -417,12 +447,17 @@
case RPC_FC_SMALL: $$->type = RPC_FC_USMALL; break;
case RPC_FC_SHORT: $$->type = RPC_FC_USHORT; break;
case RPC_FC_LONG: $$->type = RPC_FC_ULONG; break;
+ case RPC_FC_HYPER:
+ if (!$$->ref) { $$->ref = &std_uhyper; $$->sign = 0; }
+ break;
default: break;
}
}
| tFLOAT { $$ = make_type(RPC_FC_FLOAT, NULL); }
| tDOUBLE { $$ = make_type(RPC_FC_DOUBLE, NULL); }
| tBOOLEAN { $$ = make_type(RPC_FC_BYTE, &std_bool); /* ? */ }
+ | tERRORSTATUST { $$ = make_type(RPC_FC_ERROR_STATUS_T, NULL); }
+ | tHANDLET { $$ = make_type(RPC_FC_BIND_PRIMITIVE, NULL); /* ? */ }
;
m_int:
@@ -433,7 +468,7 @@
| tSHORT m_int { $$ = make_type(RPC_FC_SHORT, NULL); }
| tLONG m_int { $$ = make_type(RPC_FC_LONG, NULL); }
| tHYPER m_int { $$ = make_type(RPC_FC_HYPER, NULL); }
- | tINT64 { $$ = make_type(RPC_FC_HYPER, NULL); }
+ | tINT64 { $$ = make_type(RPC_FC_HYPER, &std_int64); }
| tCHAR { $$ = make_type(RPC_FC_CHAR, NULL); }
;
@@ -535,8 +570,8 @@
;
version:
- aNUM {}
- | aNUM '.' aNUM {}
+ aNUM { $$ = MAKELONG($1, 0); }
+ | aNUM '.' aNUM { $$ = MAKELONG($1, $3); }
;
%%
@@ -649,6 +684,9 @@
switch (type) {
case EXPR_NEG:
e->cval = -expr->cval;
+ break;
+ case EXPR_NOT:
+ e->cval = ~expr->cval;
break;
default:
e->is_const = FALSE;
Index: tools/widl/proxy.c
===================================================================
RCS file: /home/wine/wine/tools/widl/proxy.c,v
retrieving revision 1.5
diff -u -r1.5 proxy.c
--- tools/widl/proxy.c 21 Nov 2002 00:02:38 -0000 1.5
+++ tools/widl/proxy.c 3 Dec 2002 12:37:03 -0000
@@ -69,7 +69,7 @@
fprintf(proxy, " CALLBACK %s_", iface->name);
write_name(proxy, def);
fprintf(proxy, "_Proxy(\n");
- write_method_args(proxy, cur->args, iface->name);
+ write_args(proxy, cur->args, iface->name, 1);
fprintf(proxy, ")\n");
fprintf(proxy, "{\n");
/* local variables */
@@ -304,7 +304,7 @@
{
if_list *lcur = if_first;
if_list *cur;
- char *file_id = "XXX";
+ char *file_id = proxy_token;
int c;
if (!lcur) return;
Index: tools/widl/widl.c
===================================================================
RCS file: /home/wine/wine/tools/widl/widl.c,v
retrieving revision 1.7
diff -u -r1.7 widl.c
--- tools/widl/widl.c 21 Nov 2002 00:02:38 -0000 1.7
+++ tools/widl/widl.c 3 Dec 2002 12:37:03 -0000
@@ -74,6 +74,7 @@
char *header_name;
char *header_token;
char *proxy_name;
+char *proxy_token;
char *temp_name;
int line_number = 1;
@@ -179,6 +180,7 @@
if (!proxy_name) {
proxy_name = dup_basename(input_name, ".idl");
+ proxy_token = xstrdup(proxy_name);
strcat(proxy_name, "_p.c");
}
@@ -218,10 +220,16 @@
fprintf(header, "#include \"rpcndr.h\"\n\n" );
fprintf(header, "#ifndef __WIDL_%s\n", header_token);
fprintf(header, "#define __WIDL_%s\n", header_token);
+ fprintf(header, "#ifdef __cplusplus\n");
+ fprintf(header, "extern \"C\" {\n");
+ fprintf(header, "#endif\n");
ret = yyparse();
finish_proxy();
+ fprintf(header, "#ifdef __cplusplus\n");
+ fprintf(header, "}\n");
+ fprintf(header, "#endif\n");
fprintf(header, "#endif /* __WIDL_%s */\n", header_token);
fclose(header);
fclose(yyin);
Index: tools/widl/widl.h
===================================================================
RCS file: /home/wine/wine/tools/widl/widl.h,v
retrieving revision 1.2
diff -u -r1.2 widl.h
--- tools/widl/widl.h 21 Nov 2002 00:02:38 -0000 1.2
+++ tools/widl/widl.h 3 Dec 2002 12:37:03 -0000
@@ -43,6 +43,7 @@
extern char *input_name;
extern char *header_name;
extern char *proxy_name;
+extern char *proxy_token;
extern time_t now;
extern int line_number;
Index: tools/widl/widltypes.h
===================================================================
RCS file: /home/wine/wine/tools/widl/widltypes.h,v
retrieving revision 1.6
diff -u -r1.6 widltypes.h
--- tools/widl/widltypes.h 30 Nov 2002 01:49:46 -0000 1.6
+++ tools/widl/widltypes.h 3 Dec 2002 12:37:03 -0000
@@ -37,8 +37,6 @@
type *l_prev;
#define LINK(x,y) do { x->l_next = y; if (y) y->l_prev = x; } while (0)
-#define LINK_LAST(x,y) do { if (y) { attr_t *_c = x; while (_c->l_next) _c = _c->l_next; LINK(_c, y); } } while (0)
-#define LINK_SAFE(x,y) do { if (x) LINK_LAST(x,y); else { x = y; } } while (0)
#define INIT_LINK(x) do { x->l_next = NULL; x->l_prev = NULL; } while (0)
#define NEXT_LINK(x) ((x)->l_next)
@@ -48,18 +46,26 @@
{
ATTR_ASYNC,
ATTR_CALLAS,
+ ATTR_CASE,
+ ATTR_CONTEXTHANDLE,
ATTR_DEFAULT,
+ ATTR_IDEMPOTENT,
ATTR_IIDIS,
ATTR_IN,
+ ATTR_LENGTHIS,
ATTR_LOCAL,
ATTR_OBJECT,
ATTR_OLEAUTOMATION,
ATTR_OUT,
ATTR_POINTERDEFAULT,
ATTR_POINTERTYPE,
+ ATTR_SIZEIS,
ATTR_STRING,
+ ATTR_SWITCHIS,
+ ATTR_SWITCHTYPE,
ATTR_UUID,
ATTR_V1ENUM,
+ ATTR_VERSION,
ATTR_WIREMARSHAL,
};
@@ -70,6 +76,7 @@
EXPR_HEXNUM,
EXPR_IDENTIFIER,
EXPR_NEG,
+ EXPR_NOT,
EXPR_PPTR,
EXPR_CAST,
EXPR_SIZEOF,
More information about the wine-patches
mailing list