Jacek Caban : widl: Split write_value for string and int values.
Alexandre Julliard
julliard at winehq.org
Fri Aug 24 13:59:16 CDT 2018
Module: wine
Branch: master
Commit: 68c43a5ad9106c165b5cd5513f8600bdfd82fa82
URL: https://source.winehq.org/git/wine.git/?a=commit;h=68c43a5ad9106c165b5cd5513f8600bdfd82fa82
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Aug 24 12:11:43 2018 +0200
widl: Split write_value for string and int values.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/widl/write_msft.c | 49 +++++++++++++++++++++++++------------------------
1 file changed, 25 insertions(+), 24 deletions(-)
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index b1f467d..98a788c 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -1158,7 +1158,7 @@ static unsigned int get_ulong_val(unsigned int val, int vt)
return val;
}
-static void write_value(msft_typelib_t* typelib, int *out, int vt, const void *value)
+static void write_int_value(msft_typelib_t *typelib, int *out, int vt, int value)
{
switch(vt) {
case VT_I2:
@@ -1176,7 +1176,7 @@ static void write_value(msft_typelib_t* typelib, int *out, int vt, const void *v
case VT_UNKNOWN:
case VT_DISPATCH:
{
- const unsigned int lv = get_ulong_val(*(const unsigned int *)value, vt);
+ const unsigned int lv = get_ulong_val(value, vt);
if((lv & 0x3ffffff) == lv) {
*out = 0x80000000;
*out |= vt << 26;
@@ -1184,33 +1184,31 @@ static void write_value(msft_typelib_t* typelib, int *out, int vt, const void *v
} else {
int offset = ctl2_alloc_segment(typelib, MSFT_SEG_CUSTDATA, 8, 0);
*((unsigned short *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset]) = vt;
- memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2], value, 4);
+ memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2], &value, 4);
*((unsigned short *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+6]) = 0x5757;
*out = offset;
}
return;
}
- case VT_BSTR:
- {
- const char *s = (const char *) value;
- int len = strlen(s), seg_len = (len + 6 + 3) & ~0x3;
- int offset = ctl2_alloc_segment(typelib, MSFT_SEG_CUSTDATA, seg_len, 0);
- *((unsigned short *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset]) = vt;
- memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2], &len, sizeof(len));
- memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+6], value, len);
- len += 6;
- while(len < seg_len) {
- *((char *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+len]) = 0x57;
- len++;
- }
- *out = offset;
- return;
- }
default:
warning("can't write value of type %d yet\n", vt);
}
- return;
+}
+
+static void write_string_value(msft_typelib_t *typelib, int *out, const char *value)
+{
+ int len = strlen(value), seg_len = (len + 6 + 3) & ~0x3;
+ int offset = ctl2_alloc_segment(typelib, MSFT_SEG_CUSTDATA, seg_len, 0);
+ *((unsigned short *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset]) = VT_BSTR;
+ memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2], &len, sizeof(len));
+ memcpy(&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+6], value, len);
+ len += 6;
+ while(len < seg_len) {
+ *((char *)&typelib->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+len]) = 0x57;
+ len++;
+ }
+ *out = offset;
}
static HRESULT set_custdata(msft_typelib_t *typelib, REFGUID guid,
@@ -1228,7 +1226,10 @@ static HRESULT set_custdata(msft_typelib_t *typelib, REFGUID guid,
guidentry.next_hash = -1;
guidoffset = ctl2_alloc_guid(typelib, &guidentry);
- write_value(typelib, &data_out, vt, value);
+ if(vt == VT_BSTR)
+ write_string_value(typelib, &data_out, value);
+ else
+ write_int_value(typelib, &data_out, vt, *(int*)value);
custoffset = ctl2_alloc_segment(typelib, MSFT_SEG_CUSTDATAGUID, 12, 0);
@@ -1499,12 +1500,12 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
{
if (vt != VT_BSTR) error("string default value applied to non-string type\n");
chat("default value '%s'\n", expr->u.sval);
- write_value(typeinfo->typelib, defaultdata, vt, expr->u.sval);
+ write_string_value(typeinfo->typelib, defaultdata, expr->u.sval);
}
else
{
chat("default value %d\n", expr->cval);
- write_value(typeinfo->typelib, defaultdata, vt, &expr->cval);
+ write_int_value(typeinfo->typelib, defaultdata, vt, expr->cval);
}
break;
}
@@ -1723,7 +1724,7 @@ static HRESULT add_var_desc(msft_typeinfo_t *typeinfo, UINT index, var_t* var)
switch(typeinfo->typekind) {
case TKIND_ENUM:
- write_value(typeinfo->typelib, &typedata[4], VT_I4, &var->eval->cval);
+ write_int_value(typeinfo->typelib, &typedata[4], VT_I4, var->eval->cval);
var_kind = 2; /* VAR_CONST */
var_type_size += 16; /* sizeof(VARIANT) */
typeinfo->datawidth = var_datawidth;
More information about the wine-cvs
mailing list