Piotr Caban : vbscript: Support multibyte characters in Global_Chr.
Module: wine Branch: master Commit: 193de805a1e0ed291d721ad13a5c8cd8494aac4e URL: http://source.winehq.org/git/wine.git/?a=commit;h=193de805a1e0ed291d721ad13a... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Mon May 19 16:44:02 2014 +0200 vbscript: Support multibyte characters in Global_Chr. --- dlls/vbscript/global.c | 26 ++++++++++++++++++++++---- dlls/vbscript/tests/api.vbs | 14 ++++++++++++-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 484158f..7c44661 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1129,9 +1129,15 @@ static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIA return E_NOTIMPL; } +/* The function supports only single-byte and double-byte character sets. It + * ignores language specified by IActiveScriptSite::GetLCID. The argument needs + * to be in range of short or unsigned short. */ static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) { - int c; + int cp, c, len = 0; + CPINFO cpi; + WCHAR ch; + char buf[2]; HRESULT hres; TRACE("%s\n", debugstr_variant(arg)); @@ -1140,14 +1146,26 @@ static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIA if(FAILED(hres)) return hres; - if(c < 0 || c >= 0x100) { + cp = GetACP(); + if(!GetCPInfo(cp, &cpi)) + cpi.MaxCharSize = 1; + + if((c!=(short)c && c!=(unsigned short)c) || + (unsigned short)c>=(cpi.MaxCharSize>1 ? 0x10000 : 0x100)) { WARN("invalid arg %d\n", c); return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); } - if(res) { - WCHAR ch = c; + if(c>>8) + buf[len++] = c>>8; + if(!len || IsDBCSLeadByteEx(cp, buf[0])) + buf[len++] = c; + if(!MultiByteToWideChar(0, 0, buf, len, &ch, 1)) { + WARN("invalid arg %d, cp %d\n", c, cp); + return E_FAIL; + } + if(res) { V_VT(res) = VT_BSTR; V_BSTR(res) = SysAllocStringLen(&ch, 1); if(!V_BSTR(res)) diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 8197d6d..d7af8e9 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -140,12 +140,22 @@ Call ok(Chr(119.5) = "x", "Chr(119.5) = " & Chr(119.5)) sub testChrError on error resume next + if isEnglishLang then + call Err.clear() + call Chr(-1) + call ok(Err.number = 5, "Err.number = " & Err.number) + + call Err.clear() + call Chr(256) + call ok(Err.number = 5, "Err.number = " & Err.number) + end if + call Err.clear() - call Chr(-1) + call Chr(65536) call ok(Err.number = 5, "Err.number = " & Err.number) call Err.clear() - call Chr(256) + call Chr(-32769) call ok(Err.number = 5, "Err.number = " & Err.number) end sub
participants (1)
-
Alexandre Julliard