Robert Shearman : widl: Prepare marshall and unmarshall code generation functions for

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 26 11:46:40 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 73dff5c465224a7b4e9708c16125e8ae18097ebd
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=73dff5c465224a7b4e9708c16125e8ae18097ebd

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Dec 26 13:09:36 2005 +0100

widl: Prepare marshall and unmarshall code generation functions for
accepting pointers.

---

 tools/widl/typegen.c |  219 +++++++++++++++++++++++++++-----------------------
 1 files changed, 117 insertions(+), 102 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 5f5eb3d..87bf2ab 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -146,7 +146,7 @@ void write_procformatstring(FILE *file, 
                     var = PREV_LINK(var);
                 }
             }
-    
+
             /* emit return value data */
             var = func->def;
             if (is_void(var->type, NULL))
@@ -283,8 +283,6 @@ unsigned int get_required_buffer_size(ty
 
 void marshall_arguments(FILE *file, int indent, func_t *func)
 {
-    unsigned int alignment;
-    unsigned int size;
     unsigned int last_size = 0;
     var_t *var;
 
@@ -295,60 +293,69 @@ void marshall_arguments(FILE *file, int 
     while (NEXT_LINK(var)) var = NEXT_LINK(var);
     while (var)
     {
-        alignment = 0;
-        switch (var->type->type)
+        if (var->ptr_level == 0)
         {
-        case RPC_FC_BYTE:
-        case RPC_FC_CHAR:
-        case RPC_FC_SMALL:
-        case RPC_FC_USMALL:
-            size = 1;
-            alignment = 0;
-            break;
+            unsigned int size;
+            unsigned int alignment = 0;
+            switch (var->type->type)
+            {
+            case RPC_FC_BYTE:
+            case RPC_FC_CHAR:
+            case RPC_FC_SMALL:
+            case RPC_FC_USMALL:
+                size = 1;
+                alignment = 0;
+                break;
+
+            case RPC_FC_WCHAR:
+            case RPC_FC_USHORT:
+            case RPC_FC_SHORT:
+                size = 2;
+                if (last_size != 0 && last_size < 2)
+                    alignment = (2 - last_size);
+                break;
+
+            case RPC_FC_ULONG:
+            case RPC_FC_LONG:
+            case RPC_FC_FLOAT:
+            case RPC_FC_ERROR_STATUS_T:
+                size = 4;
+                if (last_size != 0 && last_size < 4)
+                    alignment = (4 - last_size);
+                break;
+
+            case RPC_FC_HYPER:
+            case RPC_FC_DOUBLE:
+                size = 8;
+                if (last_size != 0 && last_size < 4)
+                    alignment = (4 - last_size);
+                break;
+
+            default:
+                size = 0;
+                error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
+            }
 
-        case RPC_FC_WCHAR:
-        case RPC_FC_USHORT:
-        case RPC_FC_SHORT:
-            size = 2;
-            if (last_size != 0 && last_size < 2)
-                alignment = (2 - last_size);
-            break;
+            if (alignment != 0)
+                print_file(file, indent, "_StubMsg.Buffer += %u;\n", alignment);
 
-        case RPC_FC_ULONG:
-        case RPC_FC_LONG:
-        case RPC_FC_FLOAT:
-        case RPC_FC_ERROR_STATUS_T:
-            size = 4;
-            if (last_size != 0 && last_size < 4)
-                alignment = (4 - last_size);
-            break;
-
-        case RPC_FC_HYPER:
-        case RPC_FC_DOUBLE:
-            size = 8;
-            if (last_size != 0 && last_size < 4)
-                alignment = (4 - last_size);
-            break;
+            print_file(file, indent, "*(");
+            write_type(file, var->type, var, var->tname);
+            fprintf(file, " *)_StubMsg.Buffer = ");
+            write_name(file, var);
+            fprintf(file, ";\n");
+            fprintf(file, "_StubMsg.Buffer += sizeof(");
+            write_type(file, var->type, var, var->tname);
+            fprintf(file, ");\n");
+            fprintf(file, "\n");
 
-        default:
-            size = 0;
-            error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
+            last_size = size;
+        }
+        else
+        {
+            error("marshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
+            last_size = 0;
         }
-
-        if (alignment != 0)
-            print_file(file, indent, "_StubMsg.Buffer += %u;\n", alignment);
-
-        print_file(file, indent, "*(");
-        write_type(file, var->type, var, var->tname);
-        fprintf(file, " *)_StubMsg.Buffer = ");
-        write_name(file, var);
-        fprintf(file, ";\n");
-        fprintf(file, "_StubMsg.Buffer += sizeof(");
-        write_type(file, var->type, var, var->tname);
-        fprintf(file, ");\n");
-        fprintf(file, "\n");
-
-        last_size = size;
 
         var = PREV_LINK(var);
     }
@@ -356,8 +363,6 @@ void marshall_arguments(FILE *file, int 
 
 void unmarshall_arguments(FILE *file, int indent, func_t *func)
 {
-    unsigned int alignment;
-    unsigned int size;
     unsigned int last_size = 0;
     var_t *var;
 
@@ -368,60 +373,70 @@ void unmarshall_arguments(FILE *file, in
     while (NEXT_LINK(var)) var = NEXT_LINK(var);
     while (var)
     {
-        alignment = 0;
-        switch (var->type->type)
+        if (var->ptr_level == 0)
         {
-        case RPC_FC_BYTE:
-        case RPC_FC_CHAR:
-        case RPC_FC_SMALL:
-        case RPC_FC_USMALL:
-            size = 1;
-            alignment = 0;
-            break;
+            unsigned int size;
+            unsigned int alignment = 0;
 
-        case RPC_FC_WCHAR:
-        case RPC_FC_USHORT:
-        case RPC_FC_SHORT:
-            size = 2;
-            if (last_size != 0 && last_size < 2)
-                alignment = (2 - last_size);
-            break;
+            switch (var->type->type)
+            {
+            case RPC_FC_BYTE:
+            case RPC_FC_CHAR:
+            case RPC_FC_SMALL:
+            case RPC_FC_USMALL:
+                size = 1;
+                alignment = 0;
+                break;
+
+            case RPC_FC_WCHAR:
+            case RPC_FC_USHORT:
+            case RPC_FC_SHORT:
+                size = 2;
+                if (last_size != 0 && last_size < 2)
+                    alignment = (2 - last_size);
+                break;
+
+            case RPC_FC_ULONG:
+            case RPC_FC_LONG:
+            case RPC_FC_FLOAT:
+            case RPC_FC_ERROR_STATUS_T:
+                size = 4;
+                if (last_size != 0 && last_size < 4)
+                    alignment = (4 - last_size);
+                break;
+
+            case RPC_FC_HYPER:
+            case RPC_FC_DOUBLE:
+                size = 8;
+                if (last_size != 0 && last_size < 4)
+                    alignment = (4 - last_size);
+                break;
+
+            default:
+                size = 0;
+                error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
+            }
 
-        case RPC_FC_ULONG:
-        case RPC_FC_LONG:
-        case RPC_FC_FLOAT:
-        case RPC_FC_ERROR_STATUS_T:
-            size = 4;
-            if (last_size != 0 && last_size < 4)
-                alignment = (4 - last_size);
-            break;
+            if (alignment != 0)
+                print_file(file, indent, "_StubMsg.Buffer += %u;\n", alignment);
 
-        case RPC_FC_HYPER:
-        case RPC_FC_DOUBLE:
-            size = 8;
-            if (last_size != 0 && last_size < 4)
-                alignment = (4 - last_size);
-            break;
+            print_file(file, indent, "");
+            write_name(file, var);
+            fprintf(file, " = *(");
+            write_type(file, var->type, var, var->tname);
+            fprintf(file, " *)_StubMsg.Buffer;\n");
+            fprintf(file, "_StubMsg.Buffer += sizeof(");
+            write_type(file, var->type, var, var->tname);
+            fprintf(file, ");\n");
+            fprintf(file, "\n");
 
-        default:
-            size = 0;
-            error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
+            last_size = size;
+        }
+        else
+        {
+            error("unmarshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
+            last_size = 0;
         }
-
-        if (alignment != 0)
-            print_file(file, indent, "_StubMsg.Buffer += %u;\n", alignment);
-
-        print_file(file, indent, "");
-        write_name(file, var);
-        fprintf(file, " = *(");
-        write_type(file, var->type, var, var->tname);
-        fprintf(file, " *)_StubMsg.Buffer;\n");
-        fprintf(file, "_StubMsg.Buffer += sizeof(");
-        write_type(file, var->type, var, var->tname);
-        fprintf(file, ");\n");
-        fprintf(file, "\n");
-
-        last_size = size;
 
         var = PREV_LINK(var);
     }




More information about the wine-cvs mailing list