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;
break;
}
+ heap_free(match_result);
SysFreeString(val_str);
if(SUCCEEDED(hres) && retv) {
if(SUCCEEDED(hres))
hres = jsdisp_call_value(func, DISPATCH_METHOD, &dp, &var, ei, caller);
- for(i=0; i < parens_cnt+1; i++) {
+ for(i=0; i < parens_cnt+3; i++) {
if(i != parens_cnt+1)
SysFreeString(V_BSTR(get_arg(&dp,i)));
}
DispatchEx *rep_func = NULL, *regexp = NULL;
match_result_t *parens = NULL, match, **parens_ptr = &parens;
strbuf_t ret = {NULL,0,0};
- BOOL gcheck = FALSE;
+ DWORD re_flags = 0;
VARIANT *arg_var;
HRESULT hres = S_OK;
while(1) {
if(regexp) {
- hres = regexp_match_next(ctx, regexp, gcheck, str, length, &cp, parens_ptr,
+ hres = regexp_match_next(ctx, regexp, re_flags, str, length, &cp, parens_ptr,
&parens_size, &parens_cnt, &match);
- gcheck = TRUE;
+ re_flags = REM_CHECK_GLOBAL;
if(hres == S_FALSE) {
hres = S_OK;
}
idx = ptr2[1] - '0';
- if(isdigitW(ptr[3]) && idx*10 + (ptr[2]-'0') <= parens_cnt) {
+ if(isdigitW(ptr2[2]) && idx*10 + (ptr2[2]-'0') <= parens_cnt) {
idx = idx*10 + (ptr[2]-'0');
ptr = ptr2+3;
}else if(idx && idx <= parens_cnt) {
static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ DispatchEx *regexp = NULL;
+ const WCHAR *str, *cp;
+ match_result_t match;
+ VARIANT *arg;
+ DWORD length;
+ BSTR val_str;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ if(!arg_cnt(dp)) {
+ if(retv)
+ V_VT(retv) = VT_NULL;
+ SysFreeString(val_str);
+ return S_OK;
+ }
+
+ arg = get_arg(dp,0);
+ if(V_VT(arg) == VT_DISPATCH) {
+ regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg));
+ if(regexp) {
+ if(!is_class(regexp, JSCLASS_REGEXP)) {
+ jsdisp_release(regexp);
+ regexp = NULL;
+ }
+ }
+ }
+
+ if(!regexp) {
+ hres = create_regexp_var(ctx, arg, NULL, ®exp);
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
+ return hres;
+ }
+ }
+
+ cp = str;
+ hres = regexp_match_next(ctx, regexp, REM_RESET_INDEX, str, length, &cp, NULL, NULL, NULL, &match);
+ SysFreeString(val_str);
+ jsdisp_release(regexp);
+ if(FAILED(hres))
+ return hres;
+
+ if(retv) {
+ V_VT(retv) = VT_I4;
+ V_I4(retv) = hres == S_OK ? match.str-str : -1;
+ }
+ return S_OK;
}
/* ECMA-262 3rd Edition 15.5.4.13 */
match_result_t *match_result = NULL;
DWORD length, match_cnt, i, match_len = 0;
const WCHAR *str, *ptr, *ptr2;
+ BOOL use_regexp = FALSE;
VARIANT *arg, var;
DispatchEx *array;
BSTR val_str, match_str = NULL;
regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg));
if(regexp) {
if(is_class(regexp, JSCLASS_REGEXP)) {
+ use_regexp = TRUE;
hres = regexp_match(ctx, regexp, str, length, TRUE, &match_result, &match_cnt);
jsdisp_release(regexp);
if(FAILED(hres)) {
if(SUCCEEDED(hres)) {
ptr = str;
for(i=0;; i++) {
- if(match_result) {
+ if(use_regexp) {
if(i == match_cnt)
break;
ptr2 = match_result[i].str;
if(FAILED(hres))
break;
- if(match_result)
+ if(use_regexp)
ptr = match_result[i].str + match_result[i].len;
else if(match_str)
ptr = ptr2 + match_len;
}
}
- if(SUCCEEDED(hres) && (match_str || match_result)) {
+ if(SUCCEEDED(hres) && (match_str || use_regexp)) {
DWORD len = (str+length) - ptr;
if(len || match_str) {
return hres;
hres = create_builtin_function(ctx, StringConstr_value, StringW, &StringConstr_info,
- PROPF_CONSTR, &string->dispex, ret);
+ PROPF_CONSTR|1, &string->dispex, ret);
jsdisp_release(&string->dispex);
return hres;