From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/cdata.c | 13 +++---------- dlls/msxml3/comment.c | 13 +++---------- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 11 +++++++++++ dlls/msxml3/text.c | 13 +++---------- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index a32322e9b93..15b493fd1d5 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -500,20 +500,13 @@ static HRESULT WINAPI domcdata_deleteData(IXMLDOMCDATASection *iface, LONG offse return node_delete_data(cdata->node, offset, count); } -static HRESULT WINAPI domcdata_replaceData( - IXMLDOMCDATASection *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domcdata_replaceData(IXMLDOMCDATASection *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domcdata *cdata = impl_from_IXMLDOMCDATASection(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMCDATASection_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMCDATASection_insertData(iface, offset, p); - - return hr; + return node_replace_data(cdata->node, offset, count, p); } static HRESULT WINAPI domcdata_splitText(IXMLDOMCDATASection *iface, LONG offset, IXMLDOMText **node) diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 801919e2542..08c577febbf 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -508,20 +508,13 @@ static HRESULT WINAPI domcomment_deleteData(IXMLDOMComment *iface, LONG offset, return node_delete_data(comment->node, offset, count); } -static HRESULT WINAPI domcomment_replaceData( - IXMLDOMComment *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domcomment_replaceData(IXMLDOMComment *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domcomment *comment = impl_from_IXMLDOMComment(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMComment_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMComment_insertData(iface, offset, p); - - return hr; + return node_replace_data(comment->node, offset, count, p); } static const struct IXMLDOMCommentVtbl domcomment_vtbl = diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 1d61bd4e181..804d52ec49e 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -334,6 +334,7 @@ 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 HRESULT node_replace_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 773506f44cb..4d68d44e0b2 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4720,6 +4720,17 @@ HRESULT node_insert_data(struct domnode *node, LONG offset, BSTR data) return S_OK; } +/* TODO: might be worth it to unroll to avoid intermediate allocations */ +HRESULT node_replace_data(struct domnode *node, LONG offset, LONG count, BSTR data) +{ + HRESULT hr; + + if (FAILED(hr = node_delete_data(node, offset, count))) + return hr; + + return node_insert_data(node, offset, data); +} + 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 e89f4934640..f8375c94bcf 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -574,20 +574,13 @@ static HRESULT WINAPI domtext_deleteData(IXMLDOMText *iface, LONG offset, LONG c return node_delete_data(text->node, offset, count); } -static HRESULT WINAPI domtext_replaceData( - IXMLDOMText *iface, - LONG offset, LONG count, BSTR p) +static HRESULT WINAPI domtext_replaceData(IXMLDOMText *iface, LONG offset, LONG count, BSTR p) { - HRESULT hr; + domtext *text = impl_from_IXMLDOMText(iface); TRACE("%p, %ld, %ld, %s.\n", iface, offset, count, debugstr_w(p)); - hr = IXMLDOMText_deleteData(iface, offset, count); - - if (hr == S_OK) - hr = IXMLDOMText_insertData(iface, offset, p); - - return hr; + return node_replace_data(text->node, offset, count, p); } static HRESULT WINAPI domtext_splitText(IXMLDOMText *iface, LONG offset, IXMLDOMText **node) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10679