static ULONG WINAPI MatchCollectionEnum_Release(IEnumVARIANT *iface) { MatchCollectionEnum *This = impl_from_IMatchCollectionEnum(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { IMatchCollection2_Release(This->mc); heap_free(This); } return ref; }
static void test_RegExp(void) { IRegExp2 *regexp; IMatchCollection2 *mc; IMatch2 *match; ISubMatches *sm; IEnumVARIANT *ev; IUnknown *unk; IDispatch *disp; HRESULT hres; BSTR bstr; LONG count; VARIANT v; ULONG fetched; hres = CoCreateInstance(&CLSID_VBScriptRegExp, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void**)&unk); if(hres == REGDB_E_CLASSNOTREG) { win_skip("VBScriptRegExp is not registered\n"); return; } ok(hres == S_OK, "CoCreateInstance(CLSID_VBScriptRegExp) failed: %x\n", hres); hres = IUnknown_QueryInterface(unk, &IID_IRegExp2, (void**)®exp); if(hres == E_NOINTERFACE) { win_skip("IRegExp2 interface is not available\n"); return; } ok(hres == S_OK, "QueryInterface(IID_IRegExp2) failed: %x\n", hres); IUnknown_Release(unk); hres = IRegExp2_QueryInterface(regexp, &IID_IRegExp, (void**)&unk); ok(hres == S_OK, "QueryInterface(IID_IRegExp) returned %x\n", hres); IUnknown_Release(unk); hres = IRegExp2_QueryInterface(regexp, &IID_IDispatchEx, (void**)&unk); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDispatchEx) returned %x\n", hres); hres = IRegExp2_get_Pattern(regexp, &bstr); ok(bstr == NULL, "bstr != NULL\n"); ok(hres == S_OK, "get_Pattern returned %x, expected S_OK\n", hres); hres = IRegExp2_get_Pattern(regexp, NULL); ok(hres == E_POINTER, "get_Pattern returned %x, expected E_POINTER\n", hres); hres = IRegExp2_get_IgnoreCase(regexp, NULL); ok(hres == E_POINTER, "get_IgnoreCase returned %x, expected E_POINTER\n", hres); hres = IRegExp2_get_Global(regexp, NULL); ok(hres == E_POINTER, "get_Global returned %x, expected E_POINTER\n", hres); hres = IRegExp2_Execute(regexp, NULL, &disp); ok(hres == S_OK, "Execute returned %x, expected S_OK\n", hres); hres = IDispatch_QueryInterface(disp, &IID_IMatchCollection2, (void**)&mc); ok(hres == S_OK, "QueryInterface(IID_IMatchCollection2) returned %x\n", hres); IDispatch_Release(disp); hres = IMatchCollection2_QueryInterface(mc, &IID_IMatchCollection, (void**)&unk); ok(hres == S_OK, "QueryInterface(IID_IMatchCollection) returned %x\n", hres); IUnknown_Release(unk); hres = IMatchCollection2_get_Count(mc, NULL); ok(hres == E_POINTER, "get_Count returned %x, expected E_POINTER\n", hres); hres = IMatchCollection2_get_Count(mc, &count); ok(hres == S_OK, "get_Count returned %x, expected S_OK\n", hres); ok(count == 1, "count = %d\n", count); hres = IMatchCollection2_get_Item(mc, 1, &disp); ok(hres == E_INVALIDARG, "get_Item returned %x, expected E_INVALIDARG\n", hres); hres = IMatchCollection2_get_Item(mc, 1, NULL); ok(hres == E_POINTER, "get_Item returned %x, expected E_POINTER\n", hres); hres = IMatchCollection2_get_Item(mc, 0, &disp); ok(hres == S_OK, "get_Item returned %x, expected S_OK\n", hres); hres = IDispatch_QueryInterface(disp, &IID_IMatch2, (void**)&match); ok(hres == S_OK, "QueryInterface(IID_IMatch2) returned %x\n", hres); IDispatch_Release(disp); hres = IMatch2_QueryInterface(match, &IID_IMatch, (void**)&unk); ok(hres == S_OK, "QueryInterface(IID_IMatch) returned %x\n", hres); IUnknown_Release(unk); hres = IMatch2_get_Value(match, NULL); ok(hres == E_POINTER, "get_Value returned %x, expected E_POINTER\n", hres); hres = IMatch2_get_FirstIndex(match, NULL); ok(hres == E_POINTER, "get_FirstIndex returned %x, expected E_POINTER\n", hres); hres = IMatch2_get_Length(match, NULL); ok(hres == E_POINTER, "get_Length returned %x, expected E_POINTER\n", hres); hres = IMatch2_get_SubMatches(match, NULL); ok(hres == E_POINTER, "get_SubMatches returned %x, expected E_POINTER\n", hres); hres = IMatch2_get_SubMatches(match, &disp); ok(hres == S_OK, "get_SubMatches returned %x, expected S_OK\n", hres); IMatch2_Release(match); hres = IDispatch_QueryInterface(disp, &IID_ISubMatches, (void**)&sm); ok(hres == S_OK, "QueryInterface(IID_ISubMatches) returned %x\n", hres); IDispatch_Release(disp); hres = ISubMatches_get_Item(sm, 0, &v); ok(hres == E_INVALIDARG, "get_Item returned %x, expected E_INVALIDARG\n", hres); hres = ISubMatches_get_Item(sm, 0, NULL); ok(hres == E_POINTER, "get_Item returned %x, expected E_POINTER\n", hres); hres = ISubMatches_get_Count(sm, NULL); ok(hres == E_POINTER, "get_Count returned %x, expected E_POINTER\n", hres); ISubMatches_Release(sm); hres = IMatchCollection2_get__NewEnum(mc, &unk); ok(hres == S_OK, "get__NewEnum returned %x, expected S_OK\n", hres); hres = IUnknown_QueryInterface(unk, &IID_IEnumVARIANT, (void**)&ev); ok(hres == S_OK, "QueryInterface(IID_IEnumVARIANT) returned %x\n", hres); IUnknown_Release(unk); IMatchCollection2_Release(mc); hres = IEnumVARIANT_Skip(ev, 2); ok(hres == S_OK, "Skip returned %x\n", hres); hres = IEnumVARIANT_Next(ev, 1, &v, &fetched); ok(hres == S_FALSE, "Next returned %x, expected S_FALSE\n", hres); ok(fetched == 0, "fetched = %d\n", fetched); hres = IEnumVARIANT_Skip(ev, -1); ok(hres == S_OK, "Skip returned %x\n", hres); hres = IEnumVARIANT_Next(ev, 1, &v, &fetched); ok(hres == S_OK, "Next returned %x\n", hres); ok(fetched == 1, "fetched = %d\n", fetched); VariantClear(&v); IEnumVARIANT_Release(ev); IRegExp2_Release(regexp); }
static ULONG WINAPI MatchCollection_Release(IMatchCollection *iface) { MatchCollection2 *This = impl_from_IMatchCollection(iface); return IMatchCollection2_Release(&This->IMatchCollection2_iface); }
static HRESULT WINAPI RegExp2_Execute(IRegExp2 *iface, BSTR sourceString, IDispatch **ppMatches) { RegExp2 *This = impl_from_IRegExp2(iface); match_state_t *result; const WCHAR *pos; IMatchCollection2 *match_collection; IMatch2 *add = NULL; HRESULT hres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(sourceString), ppMatches); if(!This->pattern) { DWORD i, len = SysStringLen(sourceString); hres = create_match_collection2(&match_collection); if(FAILED(hres)) return hres; for(i=0; i<=len; i++) { hres = create_match2(i, NULL, &add); if(FAILED(hres)) break; hres = add_match(match_collection, add); if(FAILED(hres)) break; IMatch2_Release(add); if(!(This->flags & REG_GLOB)) break; } if(FAILED(hres)) { IMatchCollection2_Release(match_collection); return hres; } *ppMatches = (IDispatch*)match_collection; return S_OK; } if(!This->regexp) { This->regexp = regexp_new(NULL, &This->pool, This->pattern, strlenW(This->pattern), This->flags, FALSE); if(!This->regexp) return E_FAIL; }else { hres = regexp_set_flags(&This->regexp, NULL, &This->pool, This->flags); if(FAILED(hres)) return hres; } hres = create_match_collection2(&match_collection); if(FAILED(hres)) return hres; pos = sourceString; while(1) { result = alloc_match_state(This->regexp, NULL, pos); if(!result) { hres = E_OUTOFMEMORY; break; } hres = regexp_execute(This->regexp, NULL, &This->pool, sourceString, SysStringLen(sourceString), result); if(hres != S_OK) { heap_free(result); break; } pos = result->cp; hres = create_match2(result->cp-result->match_len-sourceString, &result, &add); heap_free(result); if(FAILED(hres)) break; hres = add_match(match_collection, add); IMatch2_Release(add); if(FAILED(hres)) break; if(!(This->flags & REG_GLOB)) break; } if(FAILED(hres)) { IMatchCollection2_Release(match_collection); return hres; } *ppMatches = (IDispatch*)match_collection; return S_OK; }