aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-06-23 12:47:35 +0200
committerMax Kellermann <max@duempel.org>2015-06-23 13:20:11 +0200
commitaecfcaa8a2b646f6a2503ba5b2b647c89d53e405 (patch)
treef31092206740253f6a84e66df1bd2c2a71ec3660
parent61a3028788186c36708234b03a8eca8d5e009515 (diff)
downloadmpd-aecfcaa8a2b646f6a2503ba5b2b647c89d53e405.tar.gz
mpd-aecfcaa8a2b646f6a2503ba5b2b647c89d53e405.tar.xz
mpd-aecfcaa8a2b646f6a2503ba5b2b647c89d53e405.zip
lib/icu/Win32: wrappers for WideCharToMultiByte(), MultiByteToWideChar()
-rw-r--r--Makefile.am5
-rw-r--r--src/fs/Charset.cxx36
-rw-r--r--src/lib/icu/Win32.cxx60
-rw-r--r--src/lib/icu/Win32.hxx38
4 files changed, 111 insertions, 28 deletions
diff --git a/Makefile.am b/Makefile.am
index aaa480b6d..cae777814 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -479,6 +479,11 @@ libicu_a_SOURCES += \
src/lib/icu/Init.cxx src/lib/icu/Init.hxx
endif
+if HAVE_WINDOWS
+libicu_a_SOURCES += \
+ src/lib/icu/Win32.cxx src/lib/icu/Win32.hxx
+endif
+
libicu_a_CPPFLAGS = $(AM_CPPFLAGS) \
$(ICU_CFLAGS)
diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx
index 186670ff8..b478959d0 100644
--- a/src/fs/Charset.cxx
+++ b/src/fs/Charset.cxx
@@ -24,8 +24,10 @@
#include "Log.hxx"
#include "lib/icu/Converter.hxx"
#include "util/Error.hxx"
+#include "util/AllocatedString.hxx"
#ifdef WIN32
+#include "lib/icu/Win32.hxx"
#include <windows.h>
#endif
@@ -102,22 +104,11 @@ PathToUTF8(PathTraitsFS::const_pointer path_fs)
#endif
#ifdef WIN32
- int length = WideCharToMultiByte(CP_UTF8, 0, path_fs, -1, nullptr, 0,
- nullptr, nullptr);
- if (length <= 0)
+ const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs);
+ if (buffer.IsNull())
return PathTraitsUTF8::string();
- char *buffer = new char[length];
- length = WideCharToMultiByte(CP_UTF8, 0, path_fs, -1, buffer, length,
- nullptr, nullptr);
- if (length <= 0) {
- delete[] buffer;
- return PathTraitsUTF8::string();
- }
-
- PathTraitsUTF8::string result(buffer);
- delete[] buffer;
- return FixSeparators(std::move(result));
+ return FixSeparators(PathTraitsUTF8::string(buffer.c_str()));
#else
#ifdef HAVE_FS_CHARSET
if (fs_converter == nullptr)
@@ -141,22 +132,11 @@ PathFromUTF8(PathTraitsUTF8::const_pointer path_utf8)
#endif
#ifdef WIN32
- int length = MultiByteToWideChar(CP_UTF8, 0, path_utf8, -1,
- nullptr, 0);
- if (length <= 0)
- return PathTraitsFS::string();
-
- wchar_t *buffer = new wchar_t[length];
- length = MultiByteToWideChar(CP_UTF8, 0, path_utf8, -1,
- buffer, length);
- if (length <= 0) {
- delete[] buffer;
+ const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8);
+ if (buffer.IsNull())
return PathTraitsFS::string();
- }
- PathTraitsFS::string result(buffer);
- delete[] buffer;
- return std::move(result);
+ return PathTraitsFS::string(buffer.c_str());
#else
if (fs_converter == nullptr)
return path_utf8;
diff --git a/src/lib/icu/Win32.cxx b/src/lib/icu/Win32.cxx
new file mode 100644
index 000000000..6f190c924
--- /dev/null
+++ b/src/lib/icu/Win32.cxx
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
+ * http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+#include "Win32.hxx"
+#include "util/AllocatedString.hxx"
+
+#include <windows.h>
+
+AllocatedString<char>
+WideCharToMultiByte(unsigned code_page, const wchar_t *src)
+{
+ int length = WideCharToMultiByte(code_page, 0, src, -1, nullptr, 0,
+ nullptr, nullptr);
+ if (length <= 0)
+ return nullptr;
+
+ char *buffer = new char[length];
+ length = WideCharToMultiByte(code_page, 0, src, -1, buffer, length,
+ nullptr, nullptr);
+ if (length <= 0) {
+ delete[] buffer;
+ return nullptr;
+ }
+
+ return AllocatedString<char>::Donate(buffer);
+}
+
+AllocatedString<wchar_t>
+MultiByteToWideChar(unsigned code_page, const char *src)
+{
+ int length = MultiByteToWideChar(code_page, 0, src, -1, nullptr, 0);
+ if (length <= 0)
+ return nullptr;
+
+ wchar_t *buffer = new wchar_t[length];
+ length = MultiByteToWideChar(code_page, 0, src, -1, buffer, length);
+ if (length <= 0) {
+ delete[] buffer;
+ return nullptr;
+ }
+
+ return AllocatedString<wchar_t>::Donate(buffer);
+}
diff --git a/src/lib/icu/Win32.hxx b/src/lib/icu/Win32.hxx
new file mode 100644
index 000000000..253fe169a
--- /dev/null
+++ b/src/lib/icu/Win32.hxx
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
+ * http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPD_ICU_WIN32_HXX
+#define MPD_ICU_WIN32_HXX
+
+#include "check.h"
+#include "Compiler.h"
+
+#include <wchar.h>
+
+template<typename T> class AllocatedString;
+
+gcc_pure gcc_nonnull_all
+AllocatedString<char>
+WideCharToMultiByte(unsigned code_page, const wchar_t *src);
+
+gcc_pure gcc_nonnull_all
+AllocatedString<wchar_t>
+MultiByteToWideChar(unsigned code_page, const char *src);
+
+#endif