[WIDL 1/2] Fix format string size calculation

Eric Kohl eric.kohl at t-online.de
Sun Mar 19 07:15:08 CST 2006


ChangeLog:
Eric Kohl <eric.kohl at t-online.de>
- Move proc format string size calculation from client.c and server.c to 
typegen.c.
- Implement type format string size calculation.
-------------- next part --------------
Index: tools/widl/client.c
===================================================================
RCS file: /home/wine/wine/tools/widl/client.c,v
retrieving revision 1.25
diff -u -r1.25 client.c
--- tools/widl/client.c	18 Mar 2006 18:52:37 -0000	1.25
+++ tools/widl/client.c	19 Mar 2006 02:17:50 -0000
@@ -1,7 +1,7 @@
 /*
  * IDL Compiler
  *
- * Copyright 2005 Eric Kohl
+ * Copyright 2005-2006 Eric Kohl
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -384,35 +384,11 @@

 static void write_formatstringsdecl(type_t *iface)
 {
-    int byte_count = 1;
+    print_client("#define TYPE_FORMAT_STRING_SIZE %d\n",
+                 get_size_typeformatstring(iface));

-    print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
-
-    /* determine the proc format string size */
-    if (iface->funcs)
-    {
-        func_t *func = iface->funcs;
-        while (NEXT_LINK(func)) func = NEXT_LINK(func);
-        while (func)
-        {
-            /* argument list size */
-            if (func->args)
-            {
-                var_t *var = func->args;
-                while (NEXT_LINK(var)) var = NEXT_LINK(var);
-                while (var)
-                {
-                    byte_count += 2; /* FIXME: determine real size */
-                    var = PREV_LINK(var);
-                }
-            }
-
-            /* return value size */
-            byte_count += 2; /* FIXME: determine real size */
-            func = PREV_LINK(func);
-        }
-    }
-    print_client("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count);
+    print_client("#define PROC_FORMAT_STRING_SIZE %d\n",
+                 get_size_procformatstring(iface));

     fprintf(client, "\n");
     write_formatdesc("TYPE");
Index: tools/widl/server.c
===================================================================
RCS file: /home/wine/wine/tools/widl/server.c,v
retrieving revision 1.28
diff -u -r1.28 server.c
--- tools/widl/server.c	18 Mar 2006 18:52:38 -0000	1.28
+++ tools/widl/server.c	19 Mar 2006 02:17:54 -0000
@@ -1,7 +1,7 @@
 /*
  * IDL Compiler
  *
- * Copyright 2005 Eric Kohl
+ * Copyright 2005-2006 Eric Kohl
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -472,35 +472,11 @@

 static void write_formatstringsdecl(type_t *iface)
 {
-    int byte_count = 1;
-
-    print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
+    print_server("#define TYPE_FORMAT_STRING_SIZE %d\n",
+                 get_size_typeformatstring(iface));

-    /* determine the proc format string size */
-    if (iface->funcs)
-    {
-        func_t *func = iface->funcs;
-        while (NEXT_LINK(func)) func = NEXT_LINK(func);
-        while (func)
-        {
-            /* argument list size */
-            if (func->args)
-            {
-                var_t *var = func->args;
-                while (NEXT_LINK(var)) var = NEXT_LINK(var);
-                while (var)
-                {
-                    byte_count += 2; /* FIXME: determine real size */
-                    var = PREV_LINK(var);
-                }
-            }
-
-            /* return value size */
-            byte_count += 2; /* FIXME: determine real size */
-            func = PREV_LINK(func);
-        }
-    }
-    print_server("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count);
+    print_server("#define PROC_FORMAT_STRING_SIZE %d\n",
+                 get_size_procformatstring(iface));

     fprintf(server, "\n");
     write_formatdesc("TYPE");
Index: tools/widl/typegen.c
===================================================================
RCS file: /home/wine/wine/tools/widl/typegen.c,v
retrieving revision 1.63
diff -u -r1.63 typegen.c
--- tools/widl/typegen.c	22 Feb 2006 21:31:54 -0000	1.63
+++ tools/widl/typegen.c	19 Mar 2006 02:17:57 -0000
@@ -1,7 +1,7 @@
 /*
  * Format String Generator for IDL Compiler
  *
- * Copyright 2005 Eric Kohl
+ * Copyright 2005-2006 Eric Kohl
  * Copyright 2005-2006 Robert Shearman
  *
  * This library is free software; you can redistribute it and/or
@@ -1580,6 +1580,68 @@
     return type_offset;
 }

+size_t get_size_procformatstring(const type_t *iface)
+{
+    size_t size = 1;
+    func_t *func;
+    var_t *var;
+
+    if (iface->funcs)
+    {
+        func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        while (func)
+        {
+            /* argument list size */
+            if (func->args)
+            {
+                var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    size += get_size_procformatstring_var(var);
+                    var = PREV_LINK(var);
+                }
+            }
+
+            /* return value size */
+            size += 2; /* FIXME: determine real size */
+            func = PREV_LINK(func);
+        }
+    }
+    return size;
+}
+
+size_t get_size_typeformatstring(const type_t *iface)
+{
+    size_t size = 3;
+    func_t *func;
+    var_t *var;
+
+    if (iface->funcs)
+    {
+        func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        while (func)
+        {
+            /* argument list size */
+            if (func->args)
+            {
+                var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    size += get_size_typeformatstring_var(var);
+                    var = PREV_LINK(var);
+                }
+            }
+
+            func = PREV_LINK(func);
+        }
+    }
+    return size;
+}
+
 static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
                               const var_t *fields, const char *structvar)
 {
Index: tools/widl/typegen.h
===================================================================
RCS file: /home/wine/wine/tools/widl/typegen.h,v
retrieving revision 1.10
diff -u -r1.10 typegen.h
--- tools/widl/typegen.h	7 Feb 2006 12:09:51 -0000	1.10
+++ tools/widl/typegen.h	19 Mar 2006 02:17:57 -0000
@@ -1,7 +1,7 @@
 /*
  * Format String Generator for IDL Compiler
  *
- * Copyright 2005 Eric Kohl
+ * Copyright 2005-2006 Eric Kohl
  * Copyright 2005 Robert Shearman
  *
  * This library is free software; you can redistribute it and/or
@@ -41,5 +41,7 @@
 void write_remoting_arguments(FILE *file, int indent, const func_t *func, unsigned int *type_offset, enum pass pass, enum remoting_phase phase);
 size_t get_size_procformatstring_var(const var_t *var);
 size_t get_size_typeformatstring_var(const var_t *var);
+size_t get_size_procformatstring(const type_t *iface);
+size_t get_size_typeformatstring(const type_t *iface);
 int write_expr_eval_routines(FILE *file, const char *iface);
 void write_expr_eval_routine_list(FILE *file, const char *iface);


More information about the wine-patches mailing list