[v2 PATCH] vbscript: Implement StrComp()

Nikolay Sivov nsivov at codeweavers.com
Fri Nov 4 08:32:24 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

v2: more tests, using return_short() now

 dlls/vbscript/global.c      | 37 ++++++++++++++++++++++++++++++++++---
 dlls/vbscript/tests/api.vbs | 20 ++++++++++++++++++++
 2 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 129d6ce..a1ffa50 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -1027,10 +1027,41 @@ static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI
     return E_NOTIMPL;
 }
 
-static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    BSTR left, right;
+    int mode, ret;
+    HRESULT hres;
+    short val;
+
+    TRACE("(%s %s ...)\n", debugstr_variant(args), debugstr_variant(args+1));
+
+    assert(args_cnt == 2 || args_cnt == 3);
+
+    if(V_VT(args) != VT_BSTR || V_VT(args+1) != VT_BSTR) {
+        FIXME("args[0] = %s, args[1] = %s\n", debugstr_variant(args), debugstr_variant(args+1));
+        return E_NOTIMPL;
+    }
+
+    if (args_cnt == 3) {
+        hres = to_int(args+2, &mode);
+        if(FAILED(hres))
+            return hres;
+
+        if (mode != 0 && mode != 1) {
+            FIXME("unknown compare mode = %d\n", mode);
+            return E_FAIL;
+        }
+    }
+    else
+        mode = 0;
+
+    left = V_BSTR(args);
+    right = V_BSTR(args+1);
+
+    ret = mode ? strcmpiW(left, right) : strcmpW(left, right);
+    val = ret < 0 ? -1 : (ret > 0 ? 1 : 0);
+    return return_short(res, val);
 }
 
 static HRESULT Global_LCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 2a365c7..91d34ce 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -440,6 +440,26 @@ TestLCase 0.123, doubleAsString(0.123)
 TestLCase Empty, ""
 Call ok(getVT(LCase(Null)) = "VT_NULL", "getVT(LCase(Null)) = " & getVT(LCase(Null)))
 
+Sub TestStrComp(str_left, str_right, mode, ex)
+    x = StrComp(str_left, str_right, mode)
+    Call ok(x = ex, "StrComp(" & str_left & ", " & str_right & ", " & mode & ") = " & x & " expected " & ex)
+End Sub
+
+TestStrComp "ABC",  "abc",  0, -1
+TestStrComp "abc",  "ABC",  0,  1
+TestStrComp "ABC",  "ABC",  0,  0
+TestStrComp "ABC",  "abc",  0, -1
+TestStrComp "abc",  "ABC",  0,  1
+TestStrComp "ABC",  "ABC",  0,  0
+TestStrComp "ABCD", "ABC",  0,  1
+TestStrComp "ABC",  "ABCD", 0, -1
+TestStrComp "ABC",  "abc",  1,  0
+TestStrComp "ABC",  "ABC",  1,  0
+TestStrComp "ABCD", "ABC",  1,  1
+TestStrComp "ABC",  "ABCD", 1, -1
+TestStrComp "ABC",  "ABCD", "0", -1
+TestStrComp "ABC",  "ABCD", "1", -1
+
 Call ok(Len("abc") = 3, "Len(abc) = " & Len("abc"))
 Call ok(Len("") = 0, "Len() = " & Len(""))
 Call ok(Len(1) = 1, "Len(1) = " & Len(1))
-- 
2.10.1




More information about the wine-patches mailing list