static HRESULT create_match2(DWORD pos, match_state_t **result, IMatch2 **match) { Match2 *ret; HRESULT hres; hres = init_regexp_typeinfo(Match2_tid); if(FAILED(hres)) return hres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->index = pos; hres = create_sub_matches(pos, result ? *result : NULL, &ret->sub_matches); if(FAILED(hres)) { heap_free(ret); return hres; } if(result) *result = NULL; ret->IMatch2_iface.lpVtbl = &Match2Vtbl; ret->IMatch_iface.lpVtbl = &MatchVtbl; ret->ref = 1; *match = &ret->IMatch2_iface; return hres; }
HRESULT WINAPI VBScriptRegExpFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, REFIID riid, void **ppv) { RegExp2 *ret; HRESULT hres; TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv); hres = init_regexp_typeinfo(RegExp2_tid); if(FAILED(hres)) return hres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->IRegExp2_iface.lpVtbl = &RegExp2Vtbl; ret->IRegExp_iface.lpVtbl = &RegExpVtbl; ret->ref = 1; heap_pool_init(&ret->pool); hres = IRegExp2_QueryInterface(&ret->IRegExp2_iface, riid, ppv); IRegExp2_Release(&ret->IRegExp2_iface); return hres; }
static HRESULT create_match_collection2(IMatchCollection2 **match_collection) { MatchCollection2 *ret; HRESULT hres; hres = init_regexp_typeinfo(MatchCollection2_tid); if(FAILED(hres)) return hres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->IMatchCollection2_iface.lpVtbl = &MatchCollection2Vtbl; ret->IMatchCollection_iface.lpVtbl = &MatchCollectionVtbl; ret->ref = 1; *match_collection = &ret->IMatchCollection2_iface; return S_OK; }
HRESULT create_regexp(IDispatch **ret) { RegExp2 *regexp; HRESULT hres; hres = init_regexp_typeinfo(RegExp2_tid); if(FAILED(hres)) return hres; regexp = heap_alloc_zero(sizeof(*regexp)); if(!regexp) return E_OUTOFMEMORY; regexp->IRegExp2_iface.lpVtbl = &RegExp2Vtbl; regexp->IRegExp_iface.lpVtbl = &RegExpVtbl; regexp->ref = 1; heap_pool_init(®exp->pool); *ret = (IDispatch*)®exp->IRegExp2_iface; return S_OK; }
static HRESULT create_sub_matches(DWORD pos, match_state_t *result, SubMatches **sub_matches) { SubMatches *ret; DWORD i; HRESULT hres; hres = init_regexp_typeinfo(SubMatches_tid); if(FAILED(hres)) return hres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->ISubMatches_iface.lpVtbl = &SubMatchesVtbl; ret->result = result; if(result) { ret->match = heap_alloc((result->match_len+1) * sizeof(WCHAR)); if(!ret->match) { heap_free(ret); return E_OUTOFMEMORY; } memcpy(ret->match, result->cp-result->match_len, result->match_len*sizeof(WCHAR)); ret->match[result->match_len] = 0; result->cp = NULL; for(i=0; i<result->paren_count; i++) if(result->parens[i].index != -1) result->parens[i].index -= pos; }else { ret->match = NULL; } ret->ref = 1; *sub_matches = ret; return hres; }