Module: wine Branch: refs/heads/master Commit: 92c568ab5d4d99e82282d38b407585c52279cfd4 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=92c568ab5d4d99e82282d38b...
Author: Robert Shearman rob@codeweavers.com Date: Thu Dec 8 12:53:58 2005 +0100
widl: Marshal and unmarshal basic types.
---
tools/widl/typegen.c | 114 +++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 99 insertions(+), 15 deletions(-)
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 @@ static int print_file(FILE *file, int in 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 @@ void write_procformatstring(FILE *file, 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 @@ void write_procformatstring(FILE *file, } 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 @@ unsigned int get_required_buffer_size(ty 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 @@ void marshall_arguments(FILE *file, int 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 @@ void unmarshall_arguments(FILE *file, in 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)