Piotr Caban : vbscript: Added RegExp2 flags getters and setters implementation.
Alexandre Julliard
julliard at winehq.org
Tue Feb 19 13:33:04 CST 2013
Module: wine
Branch: master
Commit: 2270f14e1b7bbdfc3d8ce1ea0b10c2603e36b283
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2270f14e1b7bbdfc3d8ce1ea0b10c2603e36b283
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Feb 19 12:40:12 2013 +0100
vbscript: Added RegExp2 flags getters and setters implementation.
---
dlls/vbscript/regexp.c | 18 +++++++++++++
dlls/vbscript/regexp.h | 1 +
dlls/vbscript/vbregexp.c | 64 +++++++++++++++++++++++++++++++++++++--------
3 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/dlls/vbscript/regexp.c b/dlls/vbscript/regexp.c
index 0bd59ac..c74ded5 100644
--- a/dlls/vbscript/regexp.c
+++ b/dlls/vbscript/regexp.c
@@ -3286,3 +3286,21 @@ out:
heap_pool_clear(mark);
return re;
}
+
+HRESULT regexp_set_flags(regexp_t **regexp, void *cx, heap_pool_t *pool, WORD flags)
+{
+ if(((*regexp)->flags & REG_FOLD) != (flags & REG_FOLD)) {
+ regexp_t *new_regexp = regexp_new(cx, pool, (*regexp)->source,
+ (*regexp)->source_len, flags, FALSE);
+
+ if(!new_regexp)
+ return E_FAIL;
+
+ regexp_destroy(*regexp);
+ *regexp = new_regexp;
+ }else {
+ (*regexp)->flags = flags;
+ }
+
+ return S_OK;
+}
diff --git a/dlls/vbscript/regexp.h b/dlls/vbscript/regexp.h
index de86aa2..5ceb8a0 100644
--- a/dlls/vbscript/regexp.h
+++ b/dlls/vbscript/regexp.h
@@ -65,6 +65,7 @@ regexp_t* regexp_new(void*, heap_pool_t*, const WCHAR*, DWORD, WORD, BOOL) DECLS
void regexp_destroy(regexp_t*) DECLSPEC_HIDDEN;
HRESULT regexp_execute(regexp_t*, void*, heap_pool_t*, const WCHAR*,
DWORD, match_state_t*) DECLSPEC_HIDDEN;
+HRESULT regexp_set_flags(regexp_t**, void*, heap_pool_t*, WORD) DECLSPEC_HIDDEN;
static inline match_state_t* alloc_match_state(regexp_t *regexp,
heap_pool_t *pool, const WCHAR *pos)
diff --git a/dlls/vbscript/vbregexp.c b/dlls/vbscript/vbregexp.c
index 39ff59d..d1fbcab 100644
--- a/dlls/vbscript/vbregexp.c
+++ b/dlls/vbscript/vbregexp.c
@@ -247,43 +247,79 @@ static HRESULT WINAPI RegExp2_put_Pattern(IRegExp2 *iface, BSTR pattern)
static HRESULT WINAPI RegExp2_get_IgnoreCase(IRegExp2 *iface, VARIANT_BOOL *pIgnoreCase)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%p)\n", This, pIgnoreCase);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, pIgnoreCase);
+
+ if(!pIgnoreCase)
+ return E_POINTER;
+
+ *pIgnoreCase = This->flags & REG_FOLD ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_put_IgnoreCase(IRegExp2 *iface, VARIANT_BOOL ignoreCase)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%s)\n", This, ignoreCase ? "true" : "false");
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s)\n", This, ignoreCase ? "true" : "false");
+
+ if(ignoreCase)
+ This->flags |= REG_FOLD;
+ else
+ This->flags &= ~REG_FOLD;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_get_Global(IRegExp2 *iface, VARIANT_BOOL *pGlobal)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%p)\n", This, pGlobal);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, pGlobal);
+
+ if(!pGlobal)
+ return E_POINTER;
+
+ *pGlobal = This->flags & REG_GLOB ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_put_Global(IRegExp2 *iface, VARIANT_BOOL global)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%s)\n", This, global ? "true" : "false");
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s)\n", This, global ? "true" : "false");
+
+ if(global)
+ This->flags |= REG_GLOB;
+ else
+ This->flags &= ~REG_GLOB;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_get_Multiline(IRegExp2 *iface, VARIANT_BOOL *pMultiline)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%p)\n", This, pMultiline);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, pMultiline);
+
+ if(!pMultiline)
+ return E_POINTER;
+
+ *pMultiline = This->flags & REG_MULTILINE ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_put_Multiline(IRegExp2 *iface, VARIANT_BOOL multiline)
{
RegExp2 *This = impl_from_IRegExp2(iface);
- FIXME("(%p)->(%s)\n", This, multiline ? "true" : "false");
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s)\n", This, multiline ? "true" : "false");
+
+ if(multiline)
+ This->flags |= REG_MULTILINE;
+ else
+ This->flags &= ~REG_MULTILINE;
+ return S_OK;
}
static HRESULT WINAPI RegExp2_Execute(IRegExp2 *iface,
@@ -313,6 +349,10 @@ static HRESULT WINAPI RegExp2_Test(IRegExp2 *iface, BSTR sourceString, VARIANT_B
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;
}
mark = heap_pool_mark(&This->pool);
More information about the wine-cvs
mailing list