From 98b5a1c6e81601435838d676d91abc7a7b5c74f2 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 14 Oct 2009 14:42:30 +0200 Subject: [PATCH] jscript: Separate flags parsing from regexp creating. --- dlls/jscript/jscript.h | 3 ++- dlls/jscript/lex.c | 12 ++++++---- dlls/jscript/regexp.c | 51 ++++++++++++++++++++++-------------------- dlls/jscript/string.c | 2 +- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index cde1e1bf67c..af1c1c343c7 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -225,7 +225,7 @@ HRESULT throw_uri_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_math(script_ctx_t*,DispatchEx**); HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**); -HRESULT create_regexp_str(script_ctx_t*,const WCHAR*,DWORD,const WCHAR*,DWORD,DispatchEx**); +HRESULT create_regexp(script_ctx_t*,const WCHAR *,int,DWORD,DispatchEx**); HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**); HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,DispatchEx**); HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**); @@ -319,6 +319,7 @@ typedef struct { HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,BOOL,const WCHAR*,DWORD,const WCHAR**,match_result_t**, DWORD*,DWORD*,match_result_t*); HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*); +HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*); static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) { diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c index cd53bd91fce..efb1782b0fc 100644 --- a/dlls/jscript/lex.c +++ b/dlls/jscript/lex.c @@ -766,10 +766,10 @@ static void add_object_literal(parser_ctx_t *ctx, DispatchEx *obj) literal_t *parse_regexp(parser_ctx_t *ctx) { - const WCHAR *re, *flags; + const WCHAR *re, *flags_ptr; + DWORD re_len, flags; DispatchEx *regexp; literal_t *ret; - DWORD re_len; HRESULT hres; TRACE("\n"); @@ -790,11 +790,15 @@ literal_t *parse_regexp(parser_ctx_t *ctx) re_len = ctx->ptr-re; - flags = ++ctx->ptr; + flags_ptr = ++ctx->ptr; while(ctx->ptr < ctx->end && isalnumW(*ctx->ptr)) ctx->ptr++; - hres = create_regexp_str(ctx->script, re, re_len, flags, ctx->ptr-flags, ®exp); + hres = parse_regexp_flags(flags_ptr, ctx->ptr-flags_ptr, &flags); + if(FAILED(hres)) + return NULL; + + hres = create_regexp(ctx->script, re, re_len, flags, ®exp); if(FAILED(hres)) return NULL; diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index fa5672fd5bb..6c4af840e3a 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -3737,7 +3737,7 @@ static HRESULT alloc_regexp(script_ctx_t *ctx, DispatchEx *object_prototype, Reg return S_OK; } -static HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD flags, DispatchEx **ret) +HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD flags, DispatchEx **ret) { RegExpInstance *regexp; HRESULT hres; @@ -3773,6 +3773,7 @@ static HRESULT regexp_constructor(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *re const WCHAR *opt = emptyW, *src; DispatchEx *ret; VARIANT *arg; + DWORD flags; HRESULT hres; if(!arg_cnt(dp)) { @@ -3820,7 +3821,11 @@ static HRESULT regexp_constructor(script_ctx_t *ctx, DISPPARAMS *dp, VARIANT *re opt = V_BSTR(arg); } - hres = create_regexp_str(ctx, src, -1, opt, strlenW(opt), &ret); + hres = parse_regexp_flags(opt, strlenW(opt), &flags); + if(FAILED(hres)) + return hres; + + hres = create_regexp(ctx, src, -1, flags, &ret); if(FAILED(hres)) return hres; @@ -3892,33 +3897,31 @@ HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, Di return hres; } -HRESULT create_regexp_str(script_ctx_t *ctx, const WCHAR *exp, DWORD exp_len, const WCHAR *opt, - DWORD opt_len, DispatchEx **ret) +HRESULT parse_regexp_flags(const WCHAR *str, DWORD str_len, DWORD *ret) { const WCHAR *p; DWORD flags = 0; - if(opt) { - for (p = opt; p < opt+opt_len; p++) { - switch (*p) { - case 'g': - flags |= JSREG_GLOB; - break; - case 'i': - flags |= JSREG_FOLD; - break; - case 'm': - flags |= JSREG_MULTILINE; - break; - case 'y': - flags |= JSREG_STICKY; - break; - default: - WARN("wrong flag %c\n", *p); - return E_FAIL; - } + for (p = str; p < str+str_len; p++) { + switch (*p) { + case 'g': + flags |= JSREG_GLOB; + break; + case 'i': + flags |= JSREG_FOLD; + break; + case 'm': + flags |= JSREG_MULTILINE; + break; + case 'y': + flags |= JSREG_STICKY; + break; + default: + WARN("wrong flag %c\n", *p); + return E_FAIL; } } - return create_regexp(ctx, exp, exp_len, flags, ret); + *ret = flags; + return S_OK; } diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index b78de0b8d9c..2e48d5be7fe 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -656,7 +656,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP if(FAILED(hres)) return hres; - hres = create_regexp_str(ctx, match_str, SysStringLen(match_str), NULL, 0, ®exp); + hres = create_regexp(ctx, match_str, SysStringLen(match_str), 0, ®exp); SysFreeString(match_str); if(FAILED(hres)) return hres;