oleaut32: Fix some corner cases in VarBstrCmp.
This commit is contained in:
parent
68dba4eff3
commit
25c2e283d8
|
@ -4983,6 +4983,8 @@ static void test_VarBstrCmp(void)
|
||||||
static const WCHAR s2[] = { 'a',0,'b' };
|
static const WCHAR s2[] = { 'a',0,'b' };
|
||||||
static const char sb1[] = {1,0,1};
|
static const char sb1[] = {1,0,1};
|
||||||
static const char sb2[] = {1,0,2};
|
static const char sb2[] = {1,0,2};
|
||||||
|
static const char sbchr0[] = {0,0};
|
||||||
|
static const char sbchr00[] = {0,0,0};
|
||||||
BSTR bstr, bstrempty, bstr2;
|
BSTR bstr, bstrempty, bstr2;
|
||||||
|
|
||||||
CHECKPTR(VarBstrCmp);
|
CHECKPTR(VarBstrCmp);
|
||||||
|
@ -5021,6 +5023,15 @@ static void test_VarBstrCmp(void)
|
||||||
|
|
||||||
SysFreeString(bstr);
|
SysFreeString(bstr);
|
||||||
|
|
||||||
|
bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0));
|
||||||
|
bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00));
|
||||||
|
VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT);
|
||||||
|
VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT);
|
||||||
|
VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT);
|
||||||
|
VARBSTRCMP(bstr2,bstr,0,VARCMP_EQ);
|
||||||
|
SysFreeString(bstr2);
|
||||||
|
SysFreeString(bstr);
|
||||||
|
|
||||||
/* When (LCID == 0) it should be a binary comparison
|
/* When (LCID == 0) it should be a binary comparison
|
||||||
* so these two strings could not match.
|
* so these two strings could not match.
|
||||||
*/
|
*/
|
||||||
|
@ -5030,6 +5041,15 @@ static void test_VarBstrCmp(void)
|
||||||
VARBSTRCMP(bstr,bstr2,0,VARCMP_LT);
|
VARBSTRCMP(bstr,bstr2,0,VARCMP_LT);
|
||||||
SysFreeString(bstr2);
|
SysFreeString(bstr2);
|
||||||
SysFreeString(bstr);
|
SysFreeString(bstr);
|
||||||
|
|
||||||
|
bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0));
|
||||||
|
bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00));
|
||||||
|
VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT);
|
||||||
|
VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT);
|
||||||
|
VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT);
|
||||||
|
VARBSTRCMP(bstr2,bstr,0,VARCMP_GT);
|
||||||
|
SysFreeString(bstr2);
|
||||||
|
SysFreeString(bstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the internal representation of a BSTR */
|
/* Get the internal representation of a BSTR */
|
||||||
|
|
|
@ -6957,9 +6957,8 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
|
||||||
|
|
||||||
if (!pbstrLeft || !*pbstrLeft)
|
if (!pbstrLeft || !*pbstrLeft)
|
||||||
{
|
{
|
||||||
if (!pbstrRight || !*pbstrRight)
|
if (pbstrRight && *pbstrRight)
|
||||||
return VARCMP_EQ;
|
return VARCMP_LT;
|
||||||
return VARCMP_LT;
|
|
||||||
}
|
}
|
||||||
else if (!pbstrRight || !*pbstrRight)
|
else if (!pbstrRight || !*pbstrRight)
|
||||||
return VARCMP_GT;
|
return VARCMP_GT;
|
||||||
|
@ -6981,8 +6980,17 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft),
|
unsigned int lenLeft = SysStringLen(pbstrLeft);
|
||||||
pbstrRight, SysStringLen(pbstrRight)) - 1;
|
unsigned int lenRight = SysStringLen(pbstrRight);
|
||||||
|
|
||||||
|
if (lenLeft == 0 || lenRight == 0)
|
||||||
|
{
|
||||||
|
if (lenLeft == 0 && lenRight == 0) return VARCMP_EQ;
|
||||||
|
return lenLeft < lenRight ? VARCMP_LT : VARCMP_GT;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = CompareStringW(lcid, dwFlags, pbstrLeft, lenLeft,
|
||||||
|
pbstrRight, lenRight) - 1;
|
||||||
TRACE("%d\n", hres);
|
TRACE("%d\n", hres);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue