Jacek Caban : jscript: Separate flags parsing from regexp creating.
Alexandre Julliard
julliard at winehq.org
Wed Oct 14 09:02:02 CDT 2009
Module: wine
Branch: master
Commit: 98b5a1c6e81601435838d676d91abc7a7b5c74f2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=98b5a1c6e81601435838d676d91abc7a7b5c74f2
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Oct 14 14:42:30 2009 +0200
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 cde1e1b..af1c1c3 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 cd53bd9..efb1782 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 fa5672f..6c4af84 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 b78de0b..2e48d5b 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;
More information about the wine-cvs
mailing list