Michael Stefaniuc : Fix VarBstrCmp for NULL input BSTRs (MSDN is
wrong).
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 5 08:54:09 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 8ec390676890a64e4c32a060a3340fed7350d5eb
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=8ec390676890a64e4c32a060a3340fed7350d5eb
Author: Michael Stefaniuc <mstefani at redhat.de>
Date: Mon Dec 5 12:00:24 2005 +0100
Fix VarBstrCmp for NULL input BSTRs (MSDN is wrong).
---
dlls/oleaut32/tests/vartype.c | 32 ++++++++++++++++++++++++++++++++
dlls/oleaut32/vartype.c | 18 ++++++++----------
2 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index 9beaa35..d77655c 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -516,6 +516,7 @@ static HRESULT (WINAPI *pVarBoolFromUI8)
static HRESULT (WINAPI *pVarBstrFromR4)(FLOAT,LCID,ULONG,BSTR*);
static HRESULT (WINAPI *pVarBstrFromDate)(DATE,LCID,ULONG,BSTR*);
static HRESULT (WINAPI *pVarBstrFromDec)(DECIMAL*,LCID,ULONG,BSTR*);
+static HRESULT (WINAPI *pVarBstrCmp)(BSTR,BSTR,LCID,ULONG);
static HRESULT (WINAPI *pVarCmp)(LPVARIANT,LPVARIANT,LCID,ULONG);
@@ -4960,6 +4961,36 @@ static void test_VarBstrFromDec(void)
#undef BSTR_DEC
#undef BSTR_DEC64
+#define _VARBSTRCMP(left,right,lcid,flags,result) \
+ hres = pVarBstrCmp(left,right,lcid,flags); \
+ ok(hres == result, "VarBstrCmp: expected " #result ", got hres=0x%lx\n", hres)
+#define VARBSTRCMP(left,right,result) \
+ _VARBSTRCMP(left,right,lcid,0,result)
+
+static void test_VarBstrCmp(void)
+{
+ LCID lcid;
+ HRESULT hres;
+ static const WCHAR sz[] = {'W','u','r','s','c','h','t','\0'};
+ static const WCHAR szempty[] = {'\0'};
+ BSTR bstr, bstrempty;
+
+ CHECKPTR(VarBstrCmp);
+
+ lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+ bstr = SysAllocString(sz);
+ bstrempty = SysAllocString(szempty);
+
+ /* NULL handling. Yepp, MSDN is totaly wrong here */
+ VARBSTRCMP(NULL,NULL,VARCMP_EQ);
+ VARBSTRCMP(bstr,NULL,VARCMP_GT);
+ VARBSTRCMP(NULL,bstr,VARCMP_LT);
+
+ /* NULL and empty string comparisions */
+ VARBSTRCMP(bstrempty,NULL,VARCMP_EQ);
+ VARBSTRCMP(NULL,bstrempty,VARCMP_EQ);
+}
+
/* Get the internal representation of a BSTR */
static inline LPINTERNAL_BSTR Get(const BSTR lpszString)
{
@@ -5968,6 +5999,7 @@ START_TEST(vartype)
test_VarBstrFromR4();
test_VarBstrFromDate();
test_VarBstrFromDec();
+ test_VarBstrCmp();
test_SysStringLen();
test_SysStringByteLen();
test_SysAllocString();
diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c
index 2075827..1214752 100644
--- a/dlls/oleaut32/vartype.c
+++ b/dlls/oleaut32/vartype.c
@@ -6599,23 +6599,21 @@ HRESULT WINAPI VarBstrCat(BSTR pbstrLeft
* RETURNS
* VARCMP_LT, VARCMP_EQ or VARCMP_GT indicating that pbstrLeft is less
* than, equal to or greater than pbstrRight respectively.
- * VARCMP_NULL is returned if either string is NULL, unless both are NULL
- * in which case VARCMP_EQ is returned.
+ *
+ * NOTES
+ * VARCMP_NULL is NOT returned if either string is NULL unlike MSDN
+ * states. A NULL BSTR pointer is equivalent to an empty string.
*/
HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFlags)
{
- if (!pbstrLeft)
+ if (!pbstrLeft || !*pbstrLeft)
{
if (!pbstrRight || !*pbstrRight)
return VARCMP_EQ;
- return VARCMP_NULL;
- }
- else if (!pbstrRight)
- {
- if (!*pbstrLeft)
- return VARCMP_EQ;
- return VARCMP_NULL;
+ return VARCMP_LT;
}
+ else if (!pbstrRight || !*pbstrRight)
+ return VARCMP_GT;
return CompareStringW(lcid, dwFlags, pbstrLeft, -1, pbstrRight, -1) - 1;
}
More information about the wine-cvs
mailing list