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, &regexp);
+    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, &regexp);
     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, &regexp);
+        hres = create_regexp(ctx, match_str, SysStringLen(match_str), 0, &regexp);
         SysFreeString(match_str);
         if(FAILED(hres))
             return hres;




More information about the wine-cvs mailing list