Charles Blacklock : oleaut32: Add VarBstrCmp binary comparison for LCID==0.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 30 13:41:09 CST 2006


Module: wine
Branch: master
Commit: 2b2ee9c7d1c8d1d1e79b06e8761b9e0a6e1e65bd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2b2ee9c7d1c8d1d1e79b06e8761b9e0a6e1e65bd

Author: Charles Blacklock <charles at diagnos.co.uk>
Date:   Thu Nov 30 15:55:14 2006 +0000

oleaut32: Add VarBstrCmp binary comparison for LCID==0.

---

 dlls/oleaut32/tests/vartype.c |   12 ++++++++++++
 dlls/oleaut32/vartype.c       |   26 ++++++++++++++++++++++----
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index 666516f..57de5ce 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -4911,6 +4911,8 @@ static void test_VarBstrCmp(void)
     static const WCHAR sz2[] = { 'A',0 };
     static const WCHAR s1[] = { 'a',0 };
     static const WCHAR s2[] = { 'a',0,'b' };
+    static const char sb1[] = {1,0,1};
+    static const char sb2[] = {1,0,2};
     BSTR bstr, bstrempty, bstr2;
 
     CHECKPTR(VarBstrCmp);
@@ -4948,6 +4950,16 @@ static void test_VarBstrCmp(void)
     SysFreeString(bstr2);
 
     SysFreeString(bstr);
+
+    /* When (LCID == 0) it should be a binary comparison
+     * so these two strings could not match.
+     */
+    bstr = SysAllocStringByteLen(sb1, sizeof(sb1));
+    bstr2 = SysAllocStringByteLen(sb2, sizeof(sb2));
+    lcid = 0;
+    VARBSTRCMP(bstr,bstr2,0,VARCMP_LT);
+    SysFreeString(bstr2);
+    SysFreeString(bstr);
 }
 
 /* Get the internal representation of a BSTR */
diff --git a/dlls/oleaut32/vartype.c b/dlls/oleaut32/vartype.c
index 57239a4..353a845 100644
--- a/dlls/oleaut32/vartype.c
+++ b/dlls/oleaut32/vartype.c
@@ -6630,10 +6630,12 @@ HRESULT WINAPI VarBstrCat(BSTR pbstrLeft
  * NOTES
  *  VARCMP_NULL is NOT returned if either string is NULL unlike MSDN
  *  states. A NULL BSTR pointer is equivalent to an empty string.
+ *  If LCID is equal to 0, a byte by byte comparison is performed.
  */
 HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFlags)
 {
     HRESULT hres;
+    int ret;
 
     TRACE("%s,%s,%d,%08x\n",
      debugstr_wn(pbstrLeft, SysStringLen(pbstrLeft)),
@@ -6648,10 +6650,26 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft
     else if (!pbstrRight || !*pbstrRight)
         return VARCMP_GT;
 
-    hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft),
-            pbstrRight, SysStringLen(pbstrRight)) - 1;
-    TRACE("%d\n", hres);
-    return hres;
+    if (lcid == 0)
+    {
+      ret = memcmp(pbstrLeft, pbstrRight, min(SysStringByteLen(pbstrLeft), SysStringByteLen(pbstrRight)));
+      if (ret < 0)
+        return VARCMP_LT;
+      if (ret > 0)
+        return VARCMP_GT;
+      if (SysStringByteLen(pbstrLeft) < SysStringByteLen(pbstrRight))
+        return VARCMP_LT;
+      if (SysStringByteLen(pbstrLeft) > SysStringByteLen(pbstrRight))
+        return VARCMP_GT;
+      return VARCMP_EQ;
+    }
+    else
+    {
+      hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft),
+              pbstrRight, SysStringLen(pbstrRight)) - 1;
+      TRACE("%d\n", hres);
+      return hres;
+    }
 }
 
 /*




More information about the wine-cvs mailing list