static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { BSTR ret, str; const WCHAR *ptr; DWORD len = 0; HRESULT hres; TRACE("\n"); if(!arg_cnt(dp)) { if(retv) { ret = SysAllocString(undefinedW); if(!ret) return E_OUTOFMEMORY; V_VT(retv) = VT_BSTR; V_BSTR(retv) = ret; } return S_OK; } hres = to_string(ctx, get_arg(dp, 0), ei, &str); if(FAILED(hres)) return hres; for(ptr=str; *ptr; ptr++) { if(*ptr > 0xff) len += 6; else if(is_ecma_nonblank(*ptr)) len++; else len += 3; } ret = SysAllocStringLen(NULL, len); if(!ret) { SysFreeString(str); return E_OUTOFMEMORY; } len = 0; for(ptr=str; *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(is_ecma_nonblank(*ptr))
static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *ret_str, *str; const WCHAR *ptr; DWORD len = 0; WCHAR *ret; HRESULT hres; TRACE("\n"); if(!argc) { if(r) *r = jsval_string(jsstr_undefined()); return S_OK; } hres = to_string(ctx, argv[0], &str); if(FAILED(hres)) return hres; for(ptr = str->str; *ptr; ptr++) { if(*ptr > 0xff) len += 6; else if(is_ecma_nonblank(*ptr)) len++; else len += 3; } ret_str = jsstr_alloc_buf(len); if(!ret_str) { jsstr_release(str); return E_OUTOFMEMORY; } len = 0; ret = ret_str->str; for(ptr = str->str; *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(is_ecma_nonblank(*ptr))