Piotr Caban : jscript: Move code operating on JSRegExp out of do_regexp_match_next function.

Alexandre Julliard julliard at winehq.org
Fri Feb 15 11:19:16 CST 2013


Module: wine
Branch: master
Commit: deca5e1aca54e8ed3948a3c53604aa48ab176add
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=deca5e1aca54e8ed3948a3c53604aa48ab176add

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Feb 15 14:04:59 2013 +0100

jscript: Move code operating on JSRegExp out of do_regexp_match_next function.

---

 dlls/jscript/regexp.c |   67 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 24 deletions(-)

diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c
index db04e9b..ea25c64 100644
--- a/dlls/jscript/regexp.c
+++ b/dlls/jscript/regexp.c
@@ -3202,6 +3202,42 @@ bad:
     return NULL;
 }
 
+static HRESULT MatchRegExpNext(JSRegExp *jsregexp, const WCHAR *str, DWORD str_len,
+        const WCHAR **cp, heap_pool_t *pool, REMatchState **result, DWORD *matchlen)
+{
+    REMatchState *x, *res;
+    REGlobalData gData;
+
+    gData.cpbegin = str;
+    gData.cpend = str+str_len;
+    gData.start = *cp-str;
+    gData.skipped = 0;
+    gData.pool = pool;
+
+    x = InitMatch(NULL, &gData, jsregexp, gData.cpend - gData.cpbegin);
+    if(!x) {
+        WARN("InitMatch failed\n");
+        return E_FAIL;
+    }
+
+    x->cp = *cp;
+    res = MatchRegExp(&gData, x);
+    if(!gData.ok) {
+        WARN("MatchRegExp failed\n");
+        return E_FAIL;
+    }
+
+    *result = res;
+    if(!res) {
+        *matchlen = 0;
+        return S_FALSE;
+    }
+
+    *matchlen = (res->cp-*cp) - gData.skipped;
+    *cp = res->cp;
+    return S_OK;
+}
+
 static void
 js_DestroyRegExp(JSRegExp *re)
 {
@@ -3327,30 +3363,15 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
         jsstr_t *str, const WCHAR **cp, match_result_t **parens, DWORD *parens_size,
         DWORD *parens_cnt, match_result_t *ret)
 {
-    REMatchState *x, *result;
-    REGlobalData gData;
+    REMatchState *result;
     DWORD matchlen;
+    HRESULT hres;
 
-    gData.cpbegin = str->str;
-    gData.cpend = str->str + jsstr_length(str);
-    gData.start = *cp-str->str;
-    gData.skipped = 0;
-    gData.pool = &ctx->tmp_heap;
-
-    x = InitMatch(NULL, &gData, regexp->jsregexp, gData.cpend - gData.cpbegin);
-    if(!x) {
-        WARN("InitMatch failed\n");
-        return E_FAIL;
-    }
-
-    x->cp = *cp;
-    result = MatchRegExp(&gData, x);
-    if(!gData.ok) {
-        WARN("MatchRegExp failed\n");
-        return E_FAIL;
-    }
-
-    if(!result) {
+    hres = MatchRegExpNext(regexp->jsregexp, str->str, jsstr_length(str),
+            cp, &ctx->tmp_heap, &result, &matchlen);
+    if(FAILED(hres))
+        return hres;
+    if(hres == S_FALSE) {
         if(rem_flags & REM_RESET_INDEX)
             set_last_index(regexp, 0);
         return S_FALSE;
@@ -3410,8 +3431,6 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
             memset(ctx->match_parens+n, 0, sizeof(ctx->match_parens) - n*sizeof(ctx->match_parens[0]));
     }
 
-    matchlen = (result->cp-*cp) - gData.skipped;
-    *cp = result->cp;
     ret->str = result->cp-matchlen;
     ret->len = matchlen;
     set_last_index(regexp, result->cp-str->str);




More information about the wine-cvs mailing list