Francois Gouget : oleaut32/tests: Improve vtstr() and variantstr().
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 1 06:44:31 CDT 2007
Module: wine
Branch: master
Commit: cb029e0b30d7d8732d54a80cf5725bca0b498ea9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cb029e0b30d7d8732d54a80cf5725bca0b498ea9
Author: Francois Gouget <fgouget at free.fr>
Date: Thu May 31 16:39:43 2007 +0200
oleaut32/tests: Improve vtstr() and variantstr().
- Use a CASE() macro to simplify the vtstr() code and eliminate hard-coded variant type values.
- Update the list of known variant types.
- If a variant type is unknown, print its numerical value.
- In variantstr(), hand off all the standard cases to vtstr(), instead of (partially) duplicating its code.
---
dlls/oleaut32/tests/vartest.c | 251 +++++++++++++++++------------------------
1 files changed, 101 insertions(+), 150 deletions(-)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 389ae35..c6c2af2 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -124,109 +124,110 @@ static inline int strcmpW( const WCHAR *str1, const WCHAR *str2 )
}
/* return the string text of a given variant type */
+static char vtstr_buffer[16][256];
+static int vtstr_current=0;
static const char *vtstr(int x)
{
- switch(x) {
- case 0:
- return "VT_EMPTY";
- case 1:
- return "VT_NULL";
- case 2:
- return "VT_I2";
- case 3:
- return "VT_I4";
- case 4:
- return "VT_R4";
- case 5:
- return "VT_R8";
- case 6:
- return "VT_CY";
- case 7:
- return "VT_DATE";
- case 8:
- return "VT_BSTR";
- case 9:
- return "VT_DISPATCH";
- case 10:
- return "VT_ERROR";
- case 11:
- return "VT_BOOL";
- case 12:
- return "VT_VARIANT";
- case 13:
- return "VT_UNKNOWN";
- case 14:
- return "VT_DECIMAL";
- case 15:
- return "notdefined";
- case 16:
- return "VT_I1";
- case 17:
- return "VT_UI1";
- case 18:
- return "VT_UI2";
- case 19:
- return "VT_UI4";
- case 20:
- return "VT_I8";
- case 21:
- return "VT_UI8";
- case 22:
- return "VT_INT";
- case 23:
- return "VT_UINT";
- case 24:
- return "VT_VOID";
- case 25:
- return "VT_HRESULT";
- case 26:
- return "VT_PTR";
- case 27:
- return "VT_SAFEARRAY";
- case 28:
- return "VT_CARRAY";
- case 29:
- return "VT_USERDEFINED";
- case 30:
- return "VT_LPSTR";
- case 31:
- return "VT_LPWSTR";
- case 36:
- return "VT_RECORD";
- case 64:
- return "VT_FILETIME";
- case 65:
- return "VT_BLOB";
- case 66:
- return "VT_STREAM";
- case 67:
- return "VT_STORAGE";
- case 68:
- return "VT_STREAMED_OBJECT";
- case 69:
- return "VT_STORED_OBJECT";
- case 70:
- return "VT_BLOB_OBJECT";
- case 71:
- return "VT_CF";
- case 72:
- return "VT_CLSID";
- case 0xFFF:
- return "VT_BSTR_BLOB/VT_ILLEGALMASKED/VT_TYPEMASK";
- case 0x1000:
- return "VT_VECTOR";
- case 0x2000:
- return "VT_ARRAY";
- case 0x4000:
- return "VT_BYREF";
- case 0x8000:
- return "VT_RESERVED";
- case 0xFFFF:
- return "VT_ILLEGAL";
+ switch(x) {
+#define CASE(vt) case VT_##vt: return #vt
+ CASE(EMPTY);
+ CASE(NULL);
+ CASE(I2);
+ CASE(I4);
+ CASE(R4);
+ CASE(R8);
+ CASE(CY);
+ CASE(DATE);
+ CASE(BSTR);
+ CASE(DISPATCH);
+ CASE(ERROR);
+ CASE(BOOL);
+ CASE(VARIANT);
+ CASE(UNKNOWN);
+ CASE(DECIMAL);
+ CASE(I1);
+ CASE(UI1);
+ CASE(UI2);
+ CASE(UI4);
+ CASE(I8);
+ CASE(UI8);
+ CASE(INT);
+ CASE(UINT);
+ CASE(VOID);
+ CASE(HRESULT);
+ CASE(PTR);
+ CASE(SAFEARRAY);
+ CASE(CARRAY);
+ CASE(USERDEFINED);
+ CASE(LPSTR);
+ CASE(LPWSTR);
+ CASE(RECORD);
+ CASE(INT_PTR);
+ CASE(UINT_PTR);
+ CASE(FILETIME);
+ CASE(BLOB);
+ CASE(STREAM);
+ CASE(STORAGE);
+ CASE(STREAMED_OBJECT);
+ CASE(STORED_OBJECT);
+ CASE(BLOB_OBJECT);
+ CASE(CF);
+ CASE(CLSID);
+ CASE(VERSIONED_STREAM);
+ CASE(VECTOR);
+ CASE(ARRAY);
+ CASE(BYREF);
+ CASE(RESERVED);
+ CASE(ILLEGAL);
+#undef CASE
- default:
- return "defineme";
- }
+ case 0xfff:
+ return "VT_BSTR_BLOB/VT_ILLEGALMASKED/VT_TYPEMASK";
+
+ default:
+ vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
+ sprintf(vtstr_buffer[vtstr_current], "unknown variant type %d", x);
+ return vtstr_buffer[vtstr_current++];
+ }
+}
+
+static const char *variantstr( const VARIANT *var )
+{
+ vtstr_current %= sizeof(vtstr_buffer)/sizeof(*vtstr_buffer);
+ switch(V_VT(var))
+ {
+ case VT_I1:
+ sprintf( vtstr_buffer[vtstr_current], "VT_I1(%d)", V_I1(var) ); break;
+ case VT_I2:
+ sprintf( vtstr_buffer[vtstr_current], "VT_I2(%d)", V_I2(var) ); break;
+ case VT_I4:
+ sprintf( vtstr_buffer[vtstr_current], "VT_I4(%d)", V_I4(var) ); break;
+ case VT_INT:
+ sprintf( vtstr_buffer[vtstr_current], "VT_INT(%d)", V_INT(var) ); break;
+ case VT_I8:
+ sprintf( vtstr_buffer[vtstr_current], "VT_I8(%x%08x)", (UINT)(V_I8(var) >> 32), (UINT)V_I8(var) ); break;
+ case VT_UI8:
+ sprintf( vtstr_buffer[vtstr_current], "VT_UI8(%x%08x)", (UINT)(V_UI8(var) >> 32), (UINT)V_UI8(var) ); break;
+ case VT_R4:
+ sprintf( vtstr_buffer[vtstr_current], "VT_R4(%g)", V_R4(var) ); break;
+ case VT_R8:
+ sprintf( vtstr_buffer[vtstr_current], "VT_R8(%g)", V_R8(var) ); break;
+ case VT_UI1:
+ sprintf( vtstr_buffer[vtstr_current], "VT_UI1(%u)", V_UI1(var) ); break;
+ case VT_UI2:
+ sprintf( vtstr_buffer[vtstr_current], "VT_UI2(%u)", V_UI2(var) ); break;
+ case VT_UI4:
+ sprintf( vtstr_buffer[vtstr_current], "VT_UI4(%u)", V_UI4(var) ); break;
+ case VT_UINT:
+ sprintf( vtstr_buffer[vtstr_current], "VT_UINT(%d)", V_UINT(var) ); break;
+ case VT_CY:
+ sprintf( vtstr_buffer[vtstr_current], "VT_CY(%x%08x)", S(V_CY(var)).Hi, S(V_CY(var)).Lo ); break;
+ case VT_DATE:
+ sprintf( vtstr_buffer[vtstr_current], "VT_DATE(%g)", V_DATE(var) ); break;
+ default:
+ return vtstr(V_VT(var));
+ }
+ return vtstr_buffer[vtstr_current++];
}
static BOOL is_expected_variant( const VARIANT *result, const VARIANT *expected )
@@ -270,56 +271,6 @@ static BOOL is_expected_variant( const VARIANT *result, const VARIANT *expected
}
}
-static const char *variantstr( const VARIANT *var )
-{
- static char buffer[16][256];
- static int current;
-
- current %= 16;
- switch(V_VT(var))
- {
- case VT_EMPTY:
- return "VT_EMPTY";
- case VT_NULL:
- return "VT_NULL";
- case VT_VOID:
- return "VT_VOID";
- case VT_UNKNOWN:
- return "VT_UNKNOWN";
- case VT_I1:
- sprintf( buffer[current], "VT_I1(%d)", V_I1(var) ); break;
- case VT_I2:
- sprintf( buffer[current], "VT_I2(%d)", V_I2(var) ); break;
- case VT_I4:
- sprintf( buffer[current], "VT_I4(%d)", V_I4(var) ); break;
- case VT_INT:
- sprintf( buffer[current], "VT_INT(%d)", V_INT(var) ); break;
- case VT_I8:
- sprintf( buffer[current], "VT_I8(%x%08x)", (UINT)(V_I8(var) >> 32), (UINT)V_I8(var) ); break;
- case VT_UI8:
- sprintf( buffer[current], "VT_UI8(%x%08x)", (UINT)(V_UI8(var) >> 32), (UINT)V_UI8(var) ); break;
- case VT_R4:
- sprintf( buffer[current], "VT_R4(%g)", V_R4(var) ); break;
- case VT_R8:
- sprintf( buffer[current], "VT_R8(%g)", V_R8(var) ); break;
- case VT_UI1:
- sprintf( buffer[current], "VT_UI1(%u)", V_UI1(var) ); break;
- case VT_UI2:
- sprintf( buffer[current], "VT_UI2(%u)", V_UI2(var) ); break;
- case VT_UI4:
- sprintf( buffer[current], "VT_UI4(%u)", V_UI4(var) ); break;
- case VT_UINT:
- sprintf( buffer[current], "VT_UINT(%d)", V_UINT(var) ); break;
- case VT_CY:
- sprintf( buffer[current], "VT_CY(%x%08x)", S(V_CY(var)).Hi, S(V_CY(var)).Lo ); break;
- case VT_DATE:
- sprintf( buffer[current], "VT_DATE(%g)", V_DATE(var) ); break;
- default:
- return vtstr(V_VT(var));
- }
- return buffer[current++];
-}
-
static void test_var_call1( int line, HRESULT (WINAPI *func)(LPVARIANT,LPVARIANT),
VARIANT *arg, VARIANT *expected )
{
More information about the wine-cvs
mailing list