From 0e973b890161d9b50dac9784b33c9a8580223fd4 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 24 Oct 2015 22:30:21 +0200 Subject: combase: Implement WindowsConcatString. --- .../api-ms-win-core-winrt-string-l1-1-0.spec | 2 +- dlls/combase/combase.spec | 2 +- dlls/combase/string.c | 29 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec index dc67deb..fa048d8 100644 --- a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +++ b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec @@ -7,7 +7,7 @@ @ stub HSTRING_UserUnmarshal @ stub HSTRING_UserUnmarshal64 @ stub WindowsCompareStringOrdinal -@ stub WindowsConcatString +@ stdcall WindowsConcatString(ptr ptr ptr) combase.WindowsConcatString @ stdcall WindowsCreateString(wstr long ptr) combase.WindowsCreateString @ stdcall WindowsCreateStringReference(wstr long ptr ptr) combase.WindowsCreateStringReference @ stdcall WindowsDeleteString(ptr) combase.WindowsDeleteString diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec index fcd5947..6a76b2d 100644 --- a/dlls/combase/combase.spec +++ b/dlls/combase/combase.spec @@ -288,7 +288,7 @@ @ stdcall WdtpInterfacePointer_UserUnmarshal(ptr ptr ptr ptr) ole32.WdtpInterfacePointer_UserUnmarshal @ stub WdtpInterfacePointer_UserUnmarshal64 @ stub WindowsCompareStringOrdinal -@ stub WindowsConcatString +@ stdcall WindowsConcatString(ptr ptr ptr) @ stdcall WindowsCreateString(wstr long ptr) @ stdcall WindowsCreateStringReference(wstr long ptr ptr) @ stdcall WindowsDeleteString(ptr) diff --git a/dlls/combase/string.c b/dlls/combase/string.c index 49d7695..d84f940 100644 --- a/dlls/combase/string.c +++ b/dlls/combase/string.c @@ -330,6 +330,35 @@ HRESULT WINAPI WindowsSubstringWithSpecifiedLength(HSTRING str, UINT32 start, UI } /*********************************************************************** + * WindowsConcatString (combase.@) + */ +HRESULT WINAPI WindowsConcatString(HSTRING str1, HSTRING str2, HSTRING *out) +{ + struct hstring_private *priv1 = impl_from_HSTRING(str1); + struct hstring_private *priv2 = impl_from_HSTRING(str2); + struct hstring_private *priv; + + TRACE("(%p, %p, %p)\n", str1, str2, out); + + if (str1 == NULL) + return WindowsDuplicateString(str2, out); + if (str2 == NULL) + return WindowsDuplicateString(str1, out); + if (priv1->length + priv2->length == 0) + { + *out = NULL; + return S_OK; + } + + if (!alloc_string(priv1->length + priv2->length, out)) + return E_OUTOFMEMORY; + priv = impl_from_HSTRING(*out); + memcpy(priv->buffer, priv1->buffer, priv1->length * sizeof(*priv1->buffer)); + memcpy(priv->buffer + priv1->length, priv2->buffer, priv2->length * sizeof(*priv2->buffer)); + return S_OK; +} + +/*********************************************************************** * WindowsIsStringEmpty (combase.@) */ BOOL WINAPI WindowsIsStringEmpty(HSTRING str) -- 2.6.1