Piotr Caban : jscript: Fix implementation of Global.escape.
Alexandre Julliard
julliard at winehq.org
Thu Oct 8 08:57:13 CDT 2009
Module: wine
Branch: master
Commit: 38dbc74a0afc1379c1f3766f9153557808334a8b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=38dbc74a0afc1379c1f3766f9153557808334a8b
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Wed Oct 7 22:11:43 2009 +0200
jscript: Fix implementation of Global.escape.
---
dlls/jscript/global.c | 40 ++++++++++++++++++++--------------------
1 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 5fd8114..ef86f26 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -301,8 +301,7 @@ static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
{
BSTR ret, str;
const WCHAR *ptr;
- DWORD len = 0, i, size;
- char buf[4];
+ DWORD len = 0;
HRESULT hres;
TRACE("\n");
@@ -325,17 +324,13 @@ static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
return hres;
for(ptr=str; *ptr; ptr++) {
- if(isalnumW(*ptr) || *ptr=='*' || *ptr=='@' || *ptr=='-' || *ptr=='_'
- || *ptr=='+' || *ptr=='.' || *ptr=='/')
+ if(*ptr > 0xff)
+ len += 6;
+ else if(isalnum((char)*ptr) || *ptr=='*' || *ptr=='@' || *ptr=='-'
+ || *ptr=='_' || *ptr=='+' || *ptr=='.' || *ptr=='/')
len++;
- else {
- size = WideCharToMultiByte(CP_UTF8, 0, ptr, 1, NULL, 0, NULL, NULL)*3;
- if(!size) {
- FIXME("throw Error\n");
- return E_FAIL;
- }
- len += size;
- }
+ else
+ len += 3;
}
ret = SysAllocStringLen(NULL, len);
@@ -344,16 +339,21 @@ static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
len = 0;
for(ptr=str; *ptr; ptr++) {
- if(isalnumW(*ptr) || *ptr=='*' || *ptr=='@' || *ptr=='-' || *ptr=='_'
- || *ptr=='+' || *ptr=='.' || *ptr=='/')
+ if(*ptr > 0xff) {
+ ret[len++] = '%';
+ ret[len++] = 'u';
+ ret[len++] = int_to_char(*ptr >> 12);
+ ret[len++] = int_to_char((*ptr >> 8) & 0xf);
+ ret[len++] = int_to_char((*ptr >> 4) & 0xf);
+ ret[len++] = int_to_char(*ptr & 0xf);
+ }
+ else if(isalnum((char)*ptr) || *ptr=='*' || *ptr=='@' || *ptr=='-'
+ || *ptr=='_' || *ptr=='+' || *ptr=='.' || *ptr=='/')
ret[len++] = *ptr;
else {
- size = WideCharToMultiByte(CP_UTF8, 0, ptr, 1, buf, sizeof(buf), NULL, NULL);
- for(i=0; i<size; i++) {
- ret[len++] = '%';
- ret[len++] = int_to_char(buf[i] >> 4);
- ret[len++] = int_to_char(buf[i] & 0xf);
- }
+ ret[len++] = '%';
+ ret[len++] = int_to_char(*ptr >> 4);
+ ret[len++] = int_to_char(*ptr & 0xf);
}
}
More information about the wine-cvs
mailing list