widl: Marshal and unmarshal basic types.
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 01992b0..8883b3f 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -53,6 +53,33 @@
     return r;
 }
 
+static void write_procformatstring_var(FILE *file, int indent, var_t *var)
+{
+    switch(var->type->type)
+    {
+#define CASE_BASETYPE(fctype) \
+    case RPC_##fctype: \
+        print_file(file, indent, "0x%02x,    /* " #fctype " */\n", var->type->type); \
+        break
+
+    CASE_BASETYPE(FC_BYTE);
+    CASE_BASETYPE(FC_CHAR);
+    CASE_BASETYPE(FC_WCHAR);
+    CASE_BASETYPE(FC_USHORT);
+    CASE_BASETYPE(FC_SHORT);
+    CASE_BASETYPE(FC_ULONG);
+    CASE_BASETYPE(FC_LONG);
+    CASE_BASETYPE(FC_HYPER);
+    CASE_BASETYPE(FC_IGNORE);
+    CASE_BASETYPE(FC_SMALL);
+    CASE_BASETYPE(FC_FLOAT);
+    CASE_BASETYPE(FC_DOUBLE);
+#undef CASE_BASETYPE
+    default:
+        error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
+    }
+}
+
 void write_procformatstring(FILE *file, type_t *iface)
 {
     int indent = 0;
@@ -76,12 +103,8 @@
             while (NEXT_LINK(var)) var = NEXT_LINK(var);
             while (var)
             {
-                switch(var->type->type)
-                {
-                default:
-                    error("Unknown/unsupported type\n");
-                }
-
+                print_file(file, indent, "0x4e,    /* FC_IN_PARAM_BASETYPE */\n");
+                write_procformatstring_var(file, indent, var);
                 var = PREV_LINK(var);
             }
         }
@@ -95,11 +118,8 @@
         }
         else
         {
-            switch(var->type->type)
-            {
-            default:
-                error("Unknown/unsupported type\n");
-            }
+            print_file(file, indent, "0x53,    /* FC_RETURN_PARAM_BASETYPE */\n");
+            write_procformatstring_var(file, indent, var);
         }
 
         func = PREV_LINK(func);
@@ -144,13 +164,17 @@
         case RPC_FC_SHORT:
         case RPC_FC_ULONG:
         case RPC_FC_LONG:
+        case RPC_FC_FLOAT:
+        case RPC_FC_IGNORE:
+        case RPC_FC_ERROR_STATUS_T:
             return 4;
 
-      case RPC_FC_HYPER:
+        case RPC_FC_HYPER:
+        case RPC_FC_DOUBLE:
             return 8;
 
         default:
-            error("Unknown/unsupported type: %s\n", type->name);
+            error("Unknown/unsupported type: %s (0x%02x)\n", type->name, type->type);
             return 0;
     }
 }
@@ -172,9 +196,39 @@
         alignment = 0;
         switch (var->type->type)
         {
+        case RPC_FC_BYTE:
+        case RPC_FC_CHAR:
+            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!");
+            error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
         }
 
         if (alignment != 0)
@@ -210,9 +264,39 @@
         alignment = 0;
         switch (var->type->type)
         {
+        case RPC_FC_BYTE:
+        case RPC_FC_CHAR:
+            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!");
+            error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type);
         }
 
         if (alignment != 0)