Added partial support for function pointers.

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 0c5bd36..71c7737 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -446,8 +446,19 @@
       fprintf(header, ")(%s", arg ? "THIS_ " : "THIS" );
       while (arg) {
 	write_type(header, arg->type, arg, arg->tname);
-	fprintf(header, " ");
-	write_name(header,arg);
+        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, " ");
+          write_name(header,arg);
+        }
 	write_array(header, arg->array, 0);
 	arg = PREV_LINK(arg);
 	if (arg) fprintf(header, ", ");
@@ -503,35 +514,53 @@
   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;
   if (arg) {
     while (NEXT_LINK(arg))
       arg = NEXT_LINK(arg);
   }
-  if (h == header) {
-    indentation++;
-    indent(0);
-  } else fprintf(h, "    ");
+  if (do_indent)
+  {
+      if (h == header) {
+          indentation++;
+          indent(0);
+      } else fprintf(h, "    ");
+  }
   if (method == 1) {
     fprintf(h, "%s* This", name);
     count++;
   }
   while (arg) {
     if (count) {
-      fprintf(h, ",\n");
-      if (h == header) indent(0);
-      else fprintf(h, "    ");
+        if (do_indent)
+        {
+            fprintf(h, ",\n");
+            if (h == header) indent(0);
+            else fprintf(h, "    ");
+        }
+        else fprintf(h, ",");
     }
     write_type(h, arg->type, arg, arg->tname);
-    fprintf(h, " ");
-    write_name(h, arg);
+    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, " ");
+      write_name(h, arg);
+    }
     write_array(h, arg->array, 0);
     arg = PREV_LINK(arg);
     count++;
   }
-  if (h == header) indentation--;
+  if (do_indent && h == header) indentation--;
 }
 
 static void write_cpp_method_def(type_t *iface)
@@ -549,7 +578,7 @@
       fprintf(header, " STDMETHODCALLTYPE ");
       write_name(header, def);
       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, "\n");
     }
@@ -575,7 +604,7 @@
       fprintf(header, " (STDMETHODCALLTYPE *");
       write_name(header, def);
       fprintf(header, ")(\n");
-      write_args(header, cur->args, name, 1);
+      write_args(header, cur->args, name, 1, TRUE);
       fprintf(header, ");\n");
       fprintf(header, "\n");
     }
@@ -603,7 +632,7 @@
       fprintf(header, " CALLBACK %s_", iface->name);
       write_name(header, def);
       fprintf(header, "_Proxy(\n");
-      write_args(header, cur->args, iface->name, 1);
+      write_args(header, cur->args, iface->name, 1, TRUE);
       fprintf(header, ");\n");
       /* stub prototype */
       fprintf(header, "void __RPC_STUB %s_", iface->name);
@@ -625,14 +654,14 @@
         fprintf(header, " CALLBACK %s_", iface->name);
         write_name(header, mdef);
         fprintf(header, "_Proxy(\n");
-        write_args(header, m->args, iface->name, 1);
+        write_args(header, m->args, iface->name, 1, TRUE);
         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_args(header, cur->args, iface->name, 1);
+        write_args(header, cur->args, iface->name, 1, TRUE);
         fprintf(header, ");\n");
       }
       else {
@@ -655,7 +684,7 @@
     fprintf(header, " ");
     write_name(header, def);
     fprintf(header, "(\n");
-    write_args(header, cur->args, iface->name, 0);
+    write_args(header, cur->args, iface->name, 0, TRUE);
     fprintf(header, ");\n");
 
     cur = PREV_LINK(cur);
diff --git a/tools/widl/header.h b/tools/widl/header.h
index 7b85cd4..9c10b09 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -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_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_interface(type_t *iface);
 extern void write_typedef(type_t *type, var_t *names);
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 820f6db..a427e6b 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -243,6 +243,17 @@
 	| type pident array			{ $$ = $2;
 						  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; }
diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index 8e14ade..0234b03 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -69,7 +69,7 @@
   fprintf(proxy, " CALLBACK %s_", iface->name);
   write_name(proxy, def);
   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");
   /* local variables */
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 11183f9..bc7d57a 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -146,6 +146,7 @@
   int ptr_level;
   expr_t *array;
   type_t *type;
+  var_t *args;  /* for function pointers */
   char *tname;
   attr_t *attrs;
   expr_t *eval;