Alexandre Julliard : widl: Take array dimensions into account when computing buffer size.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 6 15:23:08 CST 2007


Module: wine
Branch: master
Commit: 3bfa88dc49a5044a7426590667279a35c6ce2dae
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3bfa88dc49a5044a7426590667279a35c6ce2dae

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb  6 15:55:49 2007 +0100

widl: Take array dimensions into account when computing buffer size.

---

 tools/widl/typegen.c |   26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index c1e26ab..938764f 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -1543,8 +1543,10 @@ static unsigned int get_required_buffer_
     const type_t *type, int ptr_level, const array_dims_t *array,
     const char *name, unsigned int *alignment)
 {
+    size_t size = 0;
+
     *alignment = 0;
-    if (ptr_level == 0 && !array)
+    if (ptr_level == 0)
     {
         switch (type->type)
         {
@@ -1553,25 +1555,29 @@ static unsigned int get_required_buffer_
         case RPC_FC_USMALL:
         case RPC_FC_SMALL:
             *alignment = 4;
-            return 1;
+            size = 1;
+            break;
 
         case RPC_FC_WCHAR:
         case RPC_FC_USHORT:
         case RPC_FC_SHORT:
             *alignment = 4;
-            return 2;
+            size = 2;
+            break;
 
         case RPC_FC_ULONG:
         case RPC_FC_LONG:
         case RPC_FC_FLOAT:
         case RPC_FC_ERROR_STATUS_T:
             *alignment = 4;
-            return 4;
+            size = 4;
+            break;
 
         case RPC_FC_HYPER:
         case RPC_FC_DOUBLE:
             *alignment = 8;
-            return 8;
+            size = 8;
+            break;
 
         case RPC_FC_IGNORE:
         case RPC_FC_BIND_PRIMITIVE:
@@ -1579,7 +1585,6 @@ static unsigned int get_required_buffer_
 
         case RPC_FC_STRUCT:
         {
-            size_t size = 0;
             const var_t *field;
             if (!type->fields) return 0;
             LIST_FOR_EACH_ENTRY( field, type->fields, const var_t, entry )
@@ -1589,20 +1594,21 @@ static unsigned int get_required_buffer_
                     field->type, field->ptr_level, field->array, field->name,
                     &alignment);
             }
-            return size;
+            break;
         }
 
         case RPC_FC_RP:
             if (is_base_type( type->ref->type ) || type->ref->type == RPC_FC_STRUCT)
-                return get_required_buffer_size_type( type->ref, 0, NULL, name, alignment );
-            return 0;
+                size = get_required_buffer_size_type( type->ref, 0, NULL, name, alignment );
+            break;
 
         default:
             error("get_required_buffer_size: Unknown/unsupported type: %s (0x%02x)\n", name, type->type);
             return 0;
         }
+        if (array) size *= get_array_size( array );
     }
-    return 0;
+    return size;
 }
 
 static unsigned int get_required_buffer_size(const var_t *var, unsigned int *alignment, enum pass pass)




More information about the wine-cvs mailing list