static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, DWORD rem_flags, jsstr_t *str, match_state_t *ret) { HRESULT hres; hres = regexp_execute(regexp->jsregexp, ctx, &ctx->tmp_heap, str->str, jsstr_length(str), ret); if(FAILED(hres)) return hres; if(hres == S_FALSE) { if(rem_flags & REM_RESET_INDEX) set_last_index(regexp, 0); return S_FALSE; } if(!(rem_flags & REM_NO_CTX_UPDATE) && ctx->last_match != str) { jsstr_release(ctx->last_match); ctx->last_match = jsstr_addref(str); } if(!(rem_flags & REM_NO_CTX_UPDATE)) { DWORD i, n = min(sizeof(ctx->match_parens)/sizeof(ctx->match_parens[0]), ret->paren_count); for(i=0; i < n; i++) { if(ret->parens[i].index == -1) { ctx->match_parens[i].index = 0; ctx->match_parens[i].length = 0; }else { ctx->match_parens[i].index = ret->parens[i].index; ctx->match_parens[i].length = ret->parens[i].length; } } if(n < sizeof(ctx->match_parens)/sizeof(ctx->match_parens[0])) memset(ctx->match_parens+n, 0, sizeof(ctx->match_parens) - n*sizeof(ctx->match_parens[0])); } set_last_index(regexp, ret->cp-str->str); if(!(rem_flags & REM_NO_CTX_UPDATE)) { ctx->last_match_index = ret->cp-str->str-ret->match_len; ctx->last_match_length = ret->match_len; } return S_OK; }
static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t arg, jsstr_t **input, match_state_t **result, BOOL *ret) { RegExpInstance *regexp; match_state_t *match; DWORD last_index = 0; const WCHAR *string; jsstr_t *jsstr; HRESULT hres; if(!is_vclass(jsthis, JSCLASS_REGEXP)) { FIXME("Not a RegExp\n"); return E_NOTIMPL; } regexp = regexp_from_vdisp(jsthis); hres = to_flat_string(ctx, arg, &jsstr, &string); if(FAILED(hres)) return hres; if(regexp->jsregexp->flags & REG_GLOB) { if(regexp->last_index < 0) { jsstr_release(jsstr); set_last_index(regexp, 0); *ret = FALSE; if(input) *input = jsstr_empty(); return S_OK; } last_index = regexp->last_index; } match = alloc_match_state(regexp->jsregexp, &ctx->tmp_heap, string+last_index); if(!match) { jsstr_release(jsstr); return E_OUTOFMEMORY; } hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, jsstr, &match); if(FAILED(hres)) { jsstr_release(jsstr); return hres; } *result = match; *ret = hres == S_OK; if(input) *input = jsstr; else jsstr_release(jsstr); return S_OK; }