From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 37 +++---------------------------------- dlls/msxml3/comment.c | 33 ++------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 23 +++++++++++++++++++++++ dlls/msxml3/text.c | 37 +++---------------------------------- 5 files changed, 32 insertions(+), 99 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index d11fcf2925d..e298fe5964a 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -477,44 +477,13 @@ static HRESULT WINAPI domcdata_get_length( return S_OK; } -static HRESULT WINAPI domcdata_substringData( - IXMLDOMCDATASection *iface, - LONG offset, LONG count, BSTR *p) +static HRESULT WINAPI domcdata_substringData(IXMLDOMCDATASection *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMCDATASection_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(cdata->node, offset, count, p); } static HRESULT WINAPI domcdata_appendData(IXMLDOMCDATASection *iface, BSTR p) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 26a48d1b014..6cf8ed096d2 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -485,40 +485,11 @@ static HRESULT WINAPI domcomment_get_length(IXMLDOMComment *iface, LONG *len) static HRESULT WINAPI domcomment_substringData(IXMLDOMComment *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMComment_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(comment->node, offset, count, p); } static HRESULT WINAPI domcomment_appendData(IXMLDOMComment *iface, BSTR p) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 1df1c409903..ec45afeabc2 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -331,6 +331,7 @@ extern HRESULT node_validate(struct domnode *, IXMLDOMNode *, IXMLDOMParseError extern void node_move_children(struct domnode *dst, struct domnode *src); extern HRESULT node_split_text(struct domnode *, LONG, IXMLDOMText **); extern HRESULT node_delete_data(struct domnode *, LONG, LONG); +extern HRESULT node_substring_data(struct domnode *, LONG, LONG, BSTR *); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index b8c00d8f293..48d1ccf3333 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4672,3 +4672,26 @@ HRESULT node_delete_data(struct domnode *node, LONG offset, LONG count) return S_OK; } + +HRESULT node_substring_data(struct domnode *node, LONG offset, LONG count, BSTR *p) +{ + LONG length = SysStringLen(node->data); + + if (!p) + return E_INVALIDARG; + + *p = NULL; + + if (offset < 0 || count < 0) + return E_INVALIDARG; + + if (count == 0 || offset >= length) + return S_FALSE; + + if (offset + count > length) + *p = SysAllocString(node->data + offset); + else + *p = SysAllocStringLen(node->data + offset, count); + + return *p ? S_OK : E_OUTOFMEMORY; +} diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index 8fdefb5c539..b5602bfbae9 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -543,44 +543,13 @@ static HRESULT WINAPI domtext_get_length(IXMLDOMText *iface, LONG *len) return S_OK; } -static HRESULT WINAPI domtext_substringData( - IXMLDOMText *iface, - LONG offset, LONG count, BSTR *p) +static HRESULT WINAPI domtext_substringData(IXMLDOMText *iface, LONG offset, LONG count, BSTR *p) { - HRESULT hr; - BSTR data; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %ld, %p.\n", iface, offset, count, p); - if(!p) - return E_INVALIDARG; - - *p = NULL; - if(offset < 0 || count < 0) - return E_INVALIDARG; - - if(count == 0) - return S_FALSE; - - hr = IXMLDOMText_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - - if(offset < len) - { - if(offset + count > len) - *p = SysAllocString(&data[offset]); - else - *p = SysAllocStringLen(&data[offset], count); - } - else - hr = S_FALSE; - - SysFreeString(data); - } - - return hr; + return node_substring_data(text->node, offset, count, p); } static HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR p) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679