From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 44 +++---------------------------------- dlls/msxml3/comment.c | 44 +++---------------------------------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 24 ++++++++++++++++++++ dlls/msxml3/text.c | 44 +++---------------------------------- 5 files changed, 34 insertions(+), 123 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 93cd4b1a262..a32322e9b93 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -482,51 +482,13 @@ static HRESULT WINAPI domcdata_appendData(IXMLDOMCDATASection *iface, BSTR p) return node_append_data(cdata->node, p); } -static HRESULT WINAPI domcdata_insertData( - IXMLDOMCDATASection *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domcdata_insertData(IXMLDOMCDATASection *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMCDATASection_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMCDATASection_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(cdata->node, offset, p); } static HRESULT WINAPI domcdata_deleteData(IXMLDOMCDATASection *iface, LONG offset, LONG count) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index dd7d672d657..801919e2542 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -490,51 +490,13 @@ static HRESULT WINAPI domcomment_appendData(IXMLDOMComment *iface, BSTR p) return node_append_data(comment->node, p); } -static HRESULT WINAPI domcomment_insertData( - IXMLDOMComment *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domcomment_insertData(IXMLDOMComment *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMComment_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMComment_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(comment->node, offset, p); } static HRESULT WINAPI domcomment_deleteData(IXMLDOMComment *iface, LONG offset, LONG count) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 391e1810060..1d61bd4e181 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -333,6 +333,7 @@ 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 HRESULT node_get_data_length(struct domnode *, LONG *); +extern HRESULT node_insert_data(struct domnode *, LONG, BSTR); extern UINT get_codepage_for_encoding(const WCHAR *encoding); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index cdc6a242a47..773506f44cb 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4696,6 +4696,30 @@ HRESULT node_substring_data(struct domnode *node, LONG offset, LONG count, BSTR return *p ? S_OK : E_OUTOFMEMORY; } +HRESULT node_insert_data(struct domnode *node, LONG offset, BSTR data) +{ + LONG length = SysStringLen(node->data); + LONG data_length = SysStringLen(data); + BSTR str; + + if (data_length == 0) + return S_OK; + + if (offset < 0 || length < offset) + return E_INVALIDARG; + + if (!(str = SysAllocStringLen(NULL, length + data_length))) return E_OUTOFMEMORY; + memcpy(str, node->data, offset * sizeof(WCHAR)); + memcpy(str + offset, data, data_length * sizeof(WCHAR)); + memcpy(str + offset + data_length, node->data + offset, (length - offset) * sizeof(WCHAR)); + str[length + data_length] = 0; + + SysFreeString(node->data); + node->data = str; + + return S_OK; +} + HRESULT node_get_data_length(struct domnode *node, LONG *length) { if (!length) diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index b81de239ef4..e89f4934640 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -556,51 +556,13 @@ static HRESULT WINAPI domtext_appendData(IXMLDOMText *iface, BSTR p) return node_append_data(text->node, p); } -static HRESULT WINAPI domtext_insertData( - IXMLDOMText *iface, - LONG offset, BSTR p) +static HRESULT WINAPI domtext_insertData(IXMLDOMText *iface, LONG offset, BSTR p) { - HRESULT hr; - BSTR data; - LONG p_len; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %s.\n", iface, offset, debugstr_w(p)); - /* If have a NULL or empty string, don't do anything. */ - if((p_len = SysStringLen(p)) == 0) - return S_OK; - - if(offset < 0) - { - return E_INVALIDARG; - } - - hr = IXMLDOMText_get_data(iface, &data); - if(hr == S_OK) - { - LONG len = SysStringLen(data); - BSTR str; - - if(len < offset) - { - SysFreeString(data); - return E_INVALIDARG; - } - - str = SysAllocStringLen(NULL, len + p_len); - /* start part, supplied string and end part */ - memcpy(str, data, offset*sizeof(WCHAR)); - memcpy(&str[offset], p, p_len*sizeof(WCHAR)); - memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR)); - str[len+p_len] = 0; - - hr = IXMLDOMText_put_data(iface, str); - - SysFreeString(str); - SysFreeString(data); - } - - return hr; + return node_insert_data(text->node, offset, p); } static HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, LONG offset, LONG count) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679