Jacek Caban : vbscript: Implement String function.

Alexandre Julliard julliard at winehq.org
Tue Oct 22 16:57:01 CDT 2019


Module: wine
Branch: master
Commit: ea5dbc13292102993f0d6e0e27b265b4449be5ca
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ea5dbc13292102993f0d6e0e27b265b4449be5ca

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct 22 15:54:13 2019 +0200

vbscript: Implement String function.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/global.c      | 34 +++++++++++++++++++++++++++++++---
 dlls/vbscript/tests/api.vbs | 28 ++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 364ff0c02c..0de1559592 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -24,6 +24,7 @@
 
 #include "mshtmhst.h"
 #include "objsafe.h"
+#include "wchar.h"
 
 #include "wine/debug.h"
 
@@ -1543,10 +1544,37 @@ static HRESULT Global_Space(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt,
     return S_OK;
 }
 
-static HRESULT Global_String(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_String(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    WCHAR ch;
+    int cnt;
+    HRESULT hres;
+
+    TRACE("%s %s\n", debugstr_variant(args), debugstr_variant(args + 1));
+
+    hres = to_int(args, &cnt);
+    if(FAILED(hres))
+        return hres;
+    if(cnt < 0)
+        return E_INVALIDARG;
+
+    if(V_VT(args + 1) != VT_BSTR) {
+        FIXME("Unsupported argument %s\n", debugstr_variant(args+1));
+        return E_NOTIMPL;
+    }
+    if(!SysStringLen(V_BSTR(args + 1)))
+        return E_INVALIDARG;
+    ch = V_BSTR(args + 1)[0];
+
+    if(res) {
+        BSTR str = SysAllocStringLen(NULL, cnt);
+        if(!str)
+            return E_OUTOFMEMORY;
+        wmemset(str, ch, cnt);
+        V_VT(res) = VT_BSTR;
+        V_BSTR(res) = str;
+    }
+    return S_OK;
 }
 
 static HRESULT Global_InStr(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 49dd4959f7..5c9e219d60 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -548,6 +548,34 @@ Call ok(Space(0.5) = "", "Space(0.5) = " & Space(0.5) & """")
 Call ok(Space(1.5) = "  ", "Space(1.5) = " & Space(1.5) & """")
 Call ok(Space("1") = " ", "Space(""1"") = " & Space("1") & """")
 
+sub test_string(cnt, char, exp)
+    call ok(String(cnt, char) = exp, "String(" & cnt & ", """ & char & """ = """ & _
+                                     String(cnt, char) & """ expected """ & exp & """")
+end sub
+
+test_string 3, "x", "xxx"
+test_string 3, "xy", "xxx"
+test_string 1, "z", "z"
+test_string 0, "z", ""
+test_string "3", "xy", "xxx"
+test_string 3, Chr(3), Chr(3)&Chr(3)&Chr(3)
+
+call ok(getVT(String(0, "z")) = "VT_BSTR", "getVT(String(0,z)) = " & getVT(String(0, "z")))
+
+sub test_string_error()
+    on error resume next
+    dim x
+    x = String(-2, "x")
+    call ok(err.number = 5, "err.number = " & err.number)
+    err.clear
+    x = String(3, "")
+    call ok(err.number = 5, "err.number = " & err.number)
+    err.clear
+    x = String(0, "")
+    call ok(err.number = 5, "err.number = " & err.number)
+end sub
+call test_string_error
+
 Sub TestStrReverse(str, ex)
     Call ok(StrReverse(str) = ex, "StrReverse(" & str & ") = " & StrReverse(str))
 End Sub




More information about the wine-cvs mailing list