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