Improve error messages.
Don't start counting the type_offset for each new fuction. It is a global offset.
Use only basic types in type- and proc-strings (e.g. unsigned long -> long).
Modified: trunk/reactos/tools/widl/ChangeLog
Modified: trunk/reactos/tools/widl/client.c
Modified: trunk/reactos/tools/widl/server.c

Modified: trunk/reactos/tools/widl/ChangeLog
--- trunk/reactos/tools/widl/ChangeLog	2005-03-20 12:30:06 UTC (rev 14217)
+++ trunk/reactos/tools/widl/ChangeLog	2005-03-20 13:06:11 UTC (rev 14218)
@@ -1,5 +1,15 @@
 ChangeLog
 
+2005-03-20 ekohl
+
+   tools/widl/client.c
+   tools/widl/server.c
+
+Improve error messages.
+Don't start counting the type_offset for each new fuction. It is a global offset.
+Use only basic types in type- and proc-strings (e.g. unsigned long -> long).
+
+
 2005-03-13 ekohl
 
    tools/widl/server.c
@@ -23,7 +33,6 @@
 -Wall -Werror and fix warnings
 
 
-
 2005-03-13 ekohl
 
    tools/widl/client.c

Modified: trunk/reactos/tools/widl/client.c
--- trunk/reactos/tools/widl/client.c	2005-03-20 12:30:06 UTC (rev 14217)
+++ trunk/reactos/tools/widl/client.c	2005-03-20 13:06:11 UTC (rev 14218)
@@ -56,6 +56,25 @@
 }
 
 
+static unsigned char
+get_base_type(unsigned char type)
+{
+
+    switch (type)
+    {
+    case RPC_FC_USHORT:
+        type = RPC_FC_SHORT;
+        break;
+
+    case RPC_FC_ULONG:
+        type = RPC_FC_LONG;
+        break;
+    }
+
+  return type;
+}
+
+
 static void write_procformatstring(type_t *iface)
 {
     func_t *func = iface->funcs;
@@ -92,11 +111,12 @@
                     if (is_base_type(var->type))
                     {
                         print_client("0x4e,    /* FC_IN_PARAM_BASETYPE */\n");
-                        print_client("0x%02x,    /* FC_<type> */\n", var->type->type);
+                        print_client("0x%02x,    /* FC_<type> */\n", get_base_type(var->type->type));
                     }
                     else
                     {
-                        error("Unknown/unsupported type\n");
+                        error("%s:%d Unknown/unsupported type 0x%x\n",
+                              __FUNCTION__,__LINE__, var->type->type);
                         return;
                     }
                 }
@@ -120,7 +140,8 @@
                     }
                     else
                     {
-                        error("Unknown/unsupported type\n");
+                        error("%s:%d Unknown/unsupported type 0x%x\n",
+                              __FUNCTION__,__LINE__, var->type->type);
                         return;
                     }
                 }
@@ -139,11 +160,12 @@
         else if (is_base_type(var->type))
         {
             print_client("0x53,    /* FC_RETURN_PARAM_BASETYPE */\n");
-            print_client("0x%02x,    /* FC_<type> */\n", var->type->type);
+            print_client("0x%02x,    /* FC_<type> */\n", get_base_type(var->type->type));
         }
         else
         {
-            error("Unknown/unsupported type\n");
+            error("%s:%d Unknown/unsupported type 0x%x\n",
+                  __FUNCTION__,__LINE__, var->type->type);
             return;
         }
 
@@ -214,7 +236,7 @@
                             }
                         }
                         else
-                            print_client("0x%02x,          /* FC_<type> */\n", var->type->type);
+                            print_client("0x%02x,          /* FC_<type> */\n", get_base_type(var->type->type));
                         print_client("0x5c,          /* FC_PAD */\n");
                     }
                 }
@@ -237,7 +259,7 @@
 }
 
 
-static void print_message_buffer_size(func_t *func)
+static void print_message_buffer_size(func_t *func, unsigned int *type_offset)
 {
     unsigned int alignment;
     int size;
@@ -247,7 +269,7 @@
     int string_attr;
     int nothing_printed = 1;
     var_t *var;
-    unsigned int type_offset = 2;
+    unsigned int local_type_offset = *type_offset;
 
     print_client("_StubMsg.BufferLength =");
     if (func->args)
@@ -318,7 +340,8 @@
                     break;
 
                 default:
-                    error("Unknown/unsupported type!");
+                    error("%s:%d Unknown/unsupported type 0x%x\n",
+                          __FUNCTION__,__LINE__, var->type->type);
                     return;
                 }
 
@@ -354,30 +377,28 @@
             if (!out_attr && !in_attr)
                 in_attr = 1;
 
-            if (!in_attr)
-                continue;
+            if (in_attr)
+            {
+                if (var->ptr_level == 1 &&
+                    string_attr &&
+                    (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
+                {
+                    print_client("NdrConformantStringBufferSize(\n");
+                    indent++;
+                    print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                    print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
+                    print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
+                                 local_type_offset + 2);
+                    nothing_printed = 1;
+                    indent--;
+                }
+            }
 
-            if (var->ptr_level == 1 &&
-                string_attr &&
-                (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
+            /* calculate the next type offset */
+            if (var->ptr_level == 1)
             {
-                print_client("NdrConformantStringBufferSize(\n");
-                indent++;
-                print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-                print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
-                print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", type_offset + 2);
-                nothing_printed = 1;
-                indent--;
+                local_type_offset += 4;
             }
-
-           /* calculate the next type offset */
-           if (var->ptr_level == 1)
-           {
-               if (is_base_type(var->type))
-               {
-                   type_offset += 4;
-               }
-           }
         }
 
         if (nothing_printed)
@@ -386,9 +407,8 @@
 }
 
 
-static void marshall_in_arguments(func_t *func)
+static void marshall_in_arguments(func_t *func, unsigned int *type_offset)
 {
-    unsigned int type_offset = 2;
     unsigned int alignment;
     unsigned int size;
     unsigned int last_size = 0;
@@ -412,96 +432,95 @@
         if (!out_attr && !in_attr)
             in_attr = 1;
 
-        if (!in_attr)
-            continue;
-
-        if (var->ptr_level > 1)
+        if (in_attr)
         {
-            error("Function '%s' argument '%s': Pointer level %d not supported!\n",
-                  func->def->name, var->name, var->ptr_level);
-            return;
-        }
+            if (var->ptr_level > 1)
+            {
+                error("Function '%s' argument '%s': Pointer level %d not supported!\n",
+                      func->def->name, var->name, var->ptr_level);
+                return;
+            }
 
-        if (var->ptr_level == 1 &&
-            string_attr &&
-            (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
-        {
-            print_client("NdrConformantStringMarshall(\n");
-            indent++;
-            print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-            print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
-            print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", type_offset + 2);
-            indent--;
-            fprintf(client, "\n");
-        }
-        else
-        {
-            alignment = 0;
-            switch (var->type->type)
+            if (var->ptr_level == 1 &&
+                string_attr &&
+                (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
             {
-            case RPC_FC_BYTE:
-            case RPC_FC_CHAR:
-            case RPC_FC_SMALL:
-                size = 1;
+                print_client("NdrConformantStringMarshall(\n");
+                indent++;
+                print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
+                print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n", *type_offset + 2);
+                indent--;
+                fprintf(client, "\n");
+            }
+            else
+            {
                 alignment = 0;
-                break;
+                switch (var->type->type)
+                {
+                case RPC_FC_BYTE:
+                case RPC_FC_CHAR:
+                case RPC_FC_SMALL:
+                    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_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:
-                size = 4;
-                if (last_size > 0 && last_size < 4)
-                    alignment = (4 - last_size);
-                break;
+                case RPC_FC_ULONG:
+                case RPC_FC_LONG:
+                case RPC_FC_FLOAT:
+                    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;
+                case RPC_FC_HYPER:
+                case RPC_FC_DOUBLE:
+                    size = 8;
+                    if (last_size > 0 && last_size < 4)
+                        alignment = (4 - last_size);
+                    break;
 
-           case RPC_FC_IGNORE:
-                size = 0;
-                break;
+                case RPC_FC_IGNORE:
+                    size = 0;
+                    break;
 
-            default:
-                error("Unknown/unsupported type!");
-            }
+                default:
+                    error("%s:%d Unknown/unsupported type 0x%x\n",
+                          __FUNCTION__,__LINE__, var->type->type);
+                    return;
+                }
 
-            if (size != 0)
-            {
-                if (alignment != 0)
-                    print_client("_StubMsg.Buffer += %u;\n", alignment);
+                if (size != 0)
+                {
+                    if (alignment != 0)
+                        print_client("_StubMsg.Buffer += %u;\n", alignment);
 
-                print_client("*((");
-                write_type(client, var->type, NULL, var->tname);
-                fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = ");
-                if (var->ptr_level == 1)
-                    fprintf(client, "*");
-                write_name(client, var);
-                fprintf(client, ";\n");
-                fprintf(client, "\n");
+                    print_client("*((");
+                    write_type(client, var->type, NULL, var->tname);
+                    fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = ");
+                    if (var->ptr_level == 1)
+                        fprintf(client, "*");
+                    write_name(client, var);
+                    fprintf(client, ";\n");
+                    fprintf(client, "\n");
 
-                last_size = size;
+                    last_size = size;
+                }
             }
         }
 
         /* calculate the next type offset */
         if (var->ptr_level == 1)
         {
-            if (is_base_type(var->type))
-            {
-                type_offset += 4;
-            }
+            *type_offset += 4;
         }
     }
 }
@@ -574,7 +593,9 @@
                 break;
 
             default:
-                error("Unknown/unsupported type!");
+                error("%s:%d Unknown/unsupported type 0x%x\n",
+                      __FUNCTION__,__LINE__, var->type->type);
+                return;
             }
 
             if (size != 0)
@@ -625,7 +646,9 @@
             break;
 
         default:
-            error("Unknown/unsupported type!");
+            error("%s:%d Unknown/unsupported type 0x%x\n",
+                  __FUNCTION__,__LINE__, var->type->type);
+            return;
         }
 
        fprintf(client, "\n");
@@ -703,6 +726,7 @@
     var_t* explicit_handle_var;
     int method_count = 0;
     unsigned int proc_offset = 0;
+    unsigned int type_offset = 2;
 
     while (NEXT_LINK(func)) func = NEXT_LINK(func);
     while (func)
@@ -783,7 +807,7 @@
         }
 
         /* emit the message buffer size */
-        print_message_buffer_size(func);
+        print_message_buffer_size(func, &type_offset);
 
         print_client("NdrGetBuffer(\n");
         indent++;
@@ -797,7 +821,7 @@
         fprintf(client, "\n");
 
         /* marshal in arguments */
-        marshall_in_arguments(func);
+        marshall_in_arguments(func, &type_offset);
 
         /* send/recieve message */
         print_client("NdrSendReceive(\n");

Modified: trunk/reactos/tools/widl/server.c
--- trunk/reactos/tools/widl/server.c	2005-03-20 12:30:06 UTC (rev 14217)
+++ trunk/reactos/tools/widl/server.c	2005-03-20 13:06:11 UTC (rev 14218)
@@ -61,6 +61,25 @@
 }
 
 
+static unsigned char
+get_base_type(unsigned char type)
+{
+
+    switch (type)
+    {
+    case RPC_FC_USHORT:
+        type = RPC_FC_SHORT;
+        break;
+
+    case RPC_FC_ULONG:
+        type = RPC_FC_LONG;
+        break;
+    }
+
+  return type;
+}
+
+
 static void write_procformatstring(type_t *iface)
 {
     func_t *func = iface->funcs;
@@ -97,11 +116,12 @@
                     if (is_base_type(var->type))
                     {
                         print_server("0x4e,    /* FC_IN_PARAM_BASETYPE */\n");
-                        print_server("0x%02x,    /* FC_<type> */\n", var->type->type);
+                        print_server("0x%02x,    /* FC_<type> */\n", get_base_type(var->type->type));
                     }
                     else
                     {
-                        error("Unknown/unsupported type\n");
+                        error("%s:%d Unknown/unsupported type 0x%x\n",
+                              __FUNCTION__,__LINE__, var->type->type);
                         return;
                     }
                 }
@@ -125,7 +145,8 @@
                     }
                     else
                     {
-                        error("Unknown/unsupported type\n");
+                        error("%s:%d Unknown/unsupported type 0x%x\n",
+                              __FUNCTION__,__LINE__, var->type->type);
                         return;
                     }
                 }
@@ -144,11 +165,12 @@
         else if (is_base_type(var->type))
         {
             print_server("0x53,    /* FC_RETURN_PARAM_BASETYPE */\n");
-            print_server("0x%02x,    /* FC_<type> */\n", var->type->type);
+            print_server("0x%02x,    /* FC_<type> */\n", get_base_type(var->type->type));
         }
         else
         {
-            error("Unknown/unsupported type\n");
+            error("%s:%d Unknown/unsupported type 0x%x\n",
+                  __FUNCTION__,__LINE__, var->type->type);
             return;
         }
 
@@ -219,7 +241,7 @@
                             }
                         }
                         else
-                            print_server("0x%02x,          /* FC_<type> */\n", var->type->type);
+                            print_server("0x%02x,          /* FC_<type> */\n", get_base_type(var->type->type));
                         print_server("0x5c,          /* FC_PAD */\n");
                     }
                 }
@@ -299,7 +321,9 @@
                 break;
 
             default:
-                error("Unknown/unsupported type!");
+                error("%s:%d Unknown/unsupported type 0x%x\n",
+                      __FUNCTION__,__LINE__, var->type->type);
+                return;
             }
 
             if (last_size != -1)
@@ -337,7 +361,8 @@
             break;
 
         default:
-            error("Unknown/unsupported type: %s\n", func->def->type->name);
+            error("%s:%d Unknown/unsupported type 0x%x\n",
+                  __FUNCTION__,__LINE__, func->def->type->type);
             return;
         }
 
@@ -364,9 +389,6 @@
             if (!out_attr && !in_attr)
                 in_attr = 1;
 
-            if (!in_attr)
-                continue;
-
             if (var->ptr_level == 1 &&
                 string_attr &&
                 (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
@@ -411,9 +433,8 @@
 }
 
 
-static void unmarshall_in_arguments(func_t *func)
+static void unmarshall_in_arguments(func_t *func, unsigned int *type_offset)
 {
-    unsigned int type_offset = 2;
     unsigned int alignment;
     unsigned int size;
     unsigned int last_size = 0;
@@ -437,108 +458,107 @@
         if (!out_attr && !in_attr)
             in_attr = 1;
 
-        if (!in_attr)
-            continue;
-
-        if (var->ptr_level == 1 &&
-            string_attr &&
-            (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
+        if (in_attr)
         {
-            print_server("NdrConformantStringUnmarshall(\n");
-            indent++;
-            print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-            print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name);
-            print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n", type_offset + 2);
-            print_server("(unsigned char)0);\n");
-            indent--;
-            fprintf(server, "\n");
-        }
-        else
-        {
-            alignment = 0;
-            switch (var->type->type)
+            if (var->ptr_level == 1 &&
+                string_attr &&
+                (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
             {
-            case RPC_FC_BYTE:
-            case RPC_FC_CHAR:
-            case RPC_FC_SMALL:
-                size = 1;
+                print_server("NdrConformantStringUnmarshall(\n");
+                indent++;
+                print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name);
+                print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n", *type_offset + 2);
+                print_server("(unsigned char)0);\n");
+                indent--;
+                fprintf(server, "\n");
+            }
+            else
+            {
                 alignment = 0;
-                break;
+                switch (var->type->type)
+                {
+                case RPC_FC_BYTE:
+                case RPC_FC_CHAR:
+                case RPC_FC_SMALL:
+                    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_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:
-                size = 4;
-                if (last_size != 0 && last_size < 4)
-                    alignment = (4 - last_size);
-                break;
+                case RPC_FC_ULONG:
+                case RPC_FC_LONG:
+                case RPC_FC_FLOAT:
+                    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;
+                case RPC_FC_HYPER:
+                case RPC_FC_DOUBLE:
+                    size = 8;
+                    if (last_size != 0 && last_size < 4)
+                        alignment = (4 - last_size);
+                    break;
 
-            case RPC_FC_IGNORE:
-                size = 0;
-                break;
+                case RPC_FC_IGNORE:
+                    size = 0;
+                    break;
 
-            default:
-                error("Unknown/unsupported type!");
-            }
+                default:
+                    error("%s:%d Unknown/unsupported type 0x%x\n",
+                          __FUNCTION__,__LINE__, var->type->type);
+                    return;
+                }
 
-            if (size != 0)
-            {
-                if (alignment != 0)
-                    print_server("_StubMsg.Buffer += %u;\n", alignment);
+                if (size != 0)
+                {
+                    if (alignment != 0)
+                        print_server("_StubMsg.Buffer += %u;\n", alignment);
 
-                if (var->ptr_level == 0)
-                {
-                    print_server("");
-                    write_name(server, var);
-                    fprintf(server, " = *((");
-                    write_type(server, var->type, NULL, var->tname);
-                    fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n");
-                    fprintf(server, "\n");
+                    if (var->ptr_level == 0)
+                    {
+                        print_server("");
+                        write_name(server, var);
+                        fprintf(server, " = *((");
+                        write_type(server, var->type, NULL, var->tname);
+                        fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n");
+                        fprintf(server, "\n");
+                    }
+                    else if (var->ptr_level == 1)
+                    {
+                        print_server("");
+                        write_name(server, var);
+                        fprintf(server, " = (");
+                        write_type(server, var->type, NULL, var->tname);
+                        fprintf(server, " __RPC_FAR*)_StubMsg.Buffer;\n");
+                        print_server("_StubMsg.Buffer += sizeof(");
+                        write_type(server, var->type, NULL, var->tname);
+                        fprintf(server, ");\n");
+                        fprintf(server, "\n");
+                    }
+                    else
+                    {
+                        error("Pointer level %d is not supported!\n", var->ptr_level);
+                        return;
+                    }
+
+                    last_size = size;
                 }
-                else if (var->ptr_level == 1)
-                {
-                    print_server("");
-                    write_name(server, var);
-                    fprintf(server, " = (");
-                    write_type(server, var->type, NULL, var->tname);
-                    fprintf(server, " __RPC_FAR*)_StubMsg.Buffer;\n");
-                    print_server("_StubMsg.Buffer += sizeof(");
-                    write_type(server, var->type, NULL, var->tname);
-                    fprintf(server, ");\n");
-                    fprintf(server, "\n");
-                }
-                else
-                {
-                    error("Pointer level %d is not supported!\n", var->ptr_level);
-                    return;
-                }
-
-                last_size = size;
             }
         }
 
         /* calculate the next type offset */
         if (var->ptr_level == 1)
         {
-            if (is_base_type(var->type))
-            {
-                type_offset += 4;
-            }
+            *type_offset += 4;
         }
     }
 }
@@ -604,7 +624,9 @@
                 break;
 
             default:
-                error("Unknown/unsupported type!");
+                error("%s:%d Unknown/unsupported type 0x%x\n",
+                      __FUNCTION__,__LINE__, var->type->type);
+                return;
             }
 
             if (size != 0)
@@ -660,7 +682,9 @@
             break;
 
         default:
-            error("Unknown/unsupported type!");
+            error("%s:%d Unknown/unsupported type 0x%x\n",
+                  __FUNCTION__,__LINE__, var->type->type);
+            return;
         }
 
         fprintf(server, "\n");
@@ -704,6 +728,7 @@
     var_t *var;
     var_t* explicit_handle_var;
     unsigned int proc_offset = 0;
+    unsigned int type_offset = 2;
     unsigned int i;
     int in_attr;
     int out_attr;
@@ -822,7 +847,7 @@
             indent -= 2;
             fprintf(server, "\n");
 
-            unmarshall_in_arguments(func);
+            unmarshall_in_arguments(func, &type_offset);
         }
 
         print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n");