Robert Shearman : widl: Strings.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jan 24 06:45:03 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 21a90850cb2c898775cb73ecb24d8aa613752bb4
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=21a90850cb2c898775cb73ecb24d8aa613752bb4
Author: Robert Shearman <rob at codeweavers.com>
Date: Tue Jan 24 11:07:39 2006 +0100
widl: Strings.
Write out type format strings for string types.
---
include/wine/rpcfc.h | 2 ++
tools/widl/typegen.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/include/wine/rpcfc.h b/include/wine/rpcfc.h
index 466a571..f918f74 100644
--- a/include/wine/rpcfc.h
+++ b/include/wine/rpcfc.h
@@ -130,6 +130,8 @@
#define RPC_FC_STRUCTPAD2 0x3e
+#define RPC_FC_STRING_SIZED 0x44
+
#define RPC_FC_NO_REPEAT 0x46
#define RPC_FC_FIXED_REPEAT 0x47
#define RPC_FC_VARIABLE_REPEAT 0x48
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index f334d73..d1ce3ca 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -281,12 +281,67 @@ static size_t type_memsize(const type_t
return size;
}
-static size_t write_string_tfs(FILE *file, const attr_t *attr,
+static size_t write_string_tfs(FILE *file, const attr_t *attrs,
const type_t *type, const expr_t *array,
const char *name)
{
- error("write_string_tfs: Unimplemented. name: %s\n", name);
- return 0;
+ const expr_t *size_is = get_attrp(attrs, ATTR_SIZEIS);
+ int has_size = size_is && (size_is->type != EXPR_VOID);
+
+ if ((type->type != RPC_FC_CHAR) && (type->type != RPC_FC_WCHAR))
+ {
+ error("write_string_tfs: Unimplemented for type 0x%x of name: %s\n", type->type, name);
+ return 0;
+ }
+
+ if (array && array->is_const)
+ {
+ size_t typestring_size;
+
+ if (array->cval > USHRT_MAX)
+ error("array size for parameter %s exceeds %d bytes by %ld bytes\n",
+ name, USHRT_MAX, array->cval - USHRT_MAX);
+
+ if (type->type == RPC_FC_CHAR)
+ print_file(file, 2, "0x%x, /* FC_CSTRING */\n", RPC_FC_C_CSTRING);
+ else
+ print_file(file, 2, "0x%x, /* FC_WSTRING */\n", RPC_FC_C_WSTRING);
+ print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
+ typestring_size = 2;
+
+ print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", array->cval, array->cval);
+ typestring_size += 2;
+
+ return typestring_size;
+ }
+ else if (has_size)
+ {
+ size_t typestring_size;
+
+ if (type->type == RPC_FC_CHAR)
+ print_file(file, 2, "0x%x, /* FC_C_CSTRING */\n", RPC_FC_C_CSTRING);
+ else
+ print_file(file, 2, "0x%x, /* FC_C_WSTRING */\n", RPC_FC_C_WSTRING);
+ print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
+ typestring_size = 2;
+
+ return typestring_size;
+ }
+ else
+ {
+ size_t typestring_size;
+
+ if (type->type == RPC_FC_CHAR)
+ print_file(file, 2, "0x%x, /* FC_C_CSTRING */\n", RPC_FC_C_CSTRING);
+ else
+ print_file(file, 2, "0x%x, /* FC_C_WSTRING */\n", RPC_FC_C_WSTRING);
+ print_file(file, 2, "0x%x, /* FC_STRING_SIZED */\n", RPC_FC_STRING_SIZED);
+ typestring_size = 2;
+
+ /* FIXME: write out conformance descriptor */
+
+ return typestring_size;
+ }
}
static size_t write_array_tfs(FILE *file, const attr_t *attrs,
More information about the wine-cvs
mailing list