]> granicus.if.org Git - taglib/commitdiff
Replaced codecvt with Win32 API.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Wed, 6 Aug 2014 02:53:49 +0000 (11:53 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Thu, 7 Aug 2014 08:35:42 +0000 (17:35 +0900)
ConfigureChecks.cmake
config.h.cmake
taglib/CMakeLists.txt
taglib/toolkit/tstring.cpp
taglib/toolkit/unicode.h

index 23830f93d91d333004ac63b04bfe34b9b1260879..d0069f57811ec56b067856a7548800b909248aac 100644 (file)
@@ -220,16 +220,6 @@ if(NOT HAVE_SNPRINTF)
   " HAVE_SPRINTF_S)
 endif()
 
-# Determine whether your compiler supports codecvt.
-
-check_cxx_source_compiles("
-  #include <codecvt>
-  int main() { 
-    std::codecvt_utf8_utf16<wchar_t> x; 
-    return 0; 
-  }
-" HAVE_STD_CODECVT)
-
 # Check for libz using the cmake supplied FindZLIB.cmake
 
 if(NOT ZLIB_SOURCE)
index 07abffa667cba8fa9ea9f4441871c46792fb6e04..8fd8391d7a804094b3fe79b44394cedd6c0f9474 100644 (file)
@@ -17,9 +17,6 @@
 #cmakedefine   HAVE_MAC_BYTESWAP 1
 #cmakedefine   HAVE_OPENBSD_BYTESWAP 1
 
-/* Defined if your compiler supports codecvt */
-#cmakedefine   HAVE_STD_CODECVT 1
-
 /* Defined if your compiler supports some atomic operations */
 #cmakedefine   HAVE_STD_ATOMIC 1
 #cmakedefine   HAVE_BOOST_ATOMIC 1
index eebe61a5ded22295ab335ed8f7326d2447fc99ae..2eadf39131cb79498a93938a6754273722446f6a 100644 (file)
@@ -303,9 +303,14 @@ set(toolkit_SRCS
   toolkit/tpropertymap.cpp
   toolkit/trefcounter.cpp
   toolkit/tdebuglistener.cpp
-  toolkit/unicode.cpp
 )
 
+if(NOT WIN32)
+  set(unicode_SRCS
+    toolkit/unicode.cpp
+  )
+endif()
+
 if(HAVE_ZLIB_SOURCE)
   set(zlib_SRCS
     ${ZLIB_SOURCE}/adler32.c
@@ -323,13 +328,14 @@ set(tag_LIB_SRCS
   ${vorbis_SRCS} ${oggflacs_SRCS} ${mpc_SRCS} ${ape_SRCS} ${toolkit_SRCS} ${flacs_SRCS}
   ${wavpack_SRCS} ${speex_SRCS} ${trueaudio_SRCS} ${riff_SRCS} ${aiff_SRCS} ${wav_SRCS}
   ${asf_SRCS} ${mp4_SRCS} ${mod_SRCS} ${s3m_SRCS} ${it_SRCS} ${xm_SRCS} ${opus_SRCS}
+  ${unicode_SRCS} ${zlib_SRCS}
   tag.cpp
   tagunion.cpp
   fileref.cpp
   audioproperties.cpp
 )
 
-add_library(tag ${tag_LIB_SRCS} ${zlib_SRCS} ${tag_HDRS})
+add_library(tag ${tag_LIB_SRCS} ${tag_HDRS})
 
 if(ZLIB_FOUND)
   target_link_libraries(tag ${ZLIB_LIBRARIES})
@@ -348,10 +354,9 @@ if(BUILD_FRAMEWORK)
 endif()
 
 install(TARGETS tag
-       FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
-       LIBRARY DESTINATION ${LIB_INSTALL_DIR}
-       RUNTIME DESTINATION ${BIN_INSTALL_DIR}
-       ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
-       PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib
+  FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
+  LIBRARY DESTINATION ${LIB_INSTALL_DIR}
+  RUNTIME DESTINATION ${BIN_INSTALL_DIR}
+  ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
+  PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib
 )
-
index 8287244ba0f5215b2965d6a4650b96a482f55385..aae26edf1519dedfb68eb9b5a3de5c0df22aab7f 100644 (file)
 #include <cstdio>
 #include <cstring>
 
-#ifdef HAVE_STD_CODECVT
-# include <codecvt>
+#ifdef _WIN32
+# include <windows.h>
 #else
 # include "unicode.h"
 #endif
 
 namespace
 {
+  using namespace TagLib;
 
-  void UTF16toUTF8(const wchar_t *src, size_t srcLength, char *dst, size_t dstLength)
+  inline void UTF16toUTF8(
+    const wchar_t *src, size_t srcLength, char *dst, size_t dstLength)
   {
-#ifdef HAVE_STD_CODECVT
+#ifdef _WIN32
 
-    typedef std::codecvt_utf8_utf16<wchar_t> utf8_utf16_t;
-
-    using namespace TagLib;
-
-    const wchar_t *srcBegin = src;
-    const wchar_t *srcEnd   = srcBegin + srcLength;
-
-    char *dstBegin = dst;
-    char *dstEnd   = dstBegin + dstLength;
-
-    std::mbstate_t st;
-    const wchar_t *source;
-    char *target;
-    memset(&st, 0, sizeof(st));
-    std::codecvt_base::result result = utf8_utf16_t().out(
-      st, srcBegin, srcEnd, source, dstBegin, dstEnd, target);
-
-    if(result != utf8_utf16_t::ok) {
+    const int len = ::WideCharToMultiByte(
+      CP_UTF8, 0, src, srcLength, dst, dstLength, NULL, NULL);
+    if(len == 0) {
       debug("String::UTF16toUTF8() - Unicode conversion error.");
     }
 
 #else
 
     using namespace Unicode;
-    using namespace TagLib;
 
-    const Unicode::UTF16 *srcBegin = src;
-    const Unicode::UTF16 *srcEnd   = srcBegin + srcLength;
+    const UTF16 *srcBegin = src;
+    const UTF16 *srcEnd   = srcBegin + srcLength;
 
-    Unicode::UTF8 *dstBegin = reinterpret_cast<Unicode::UTF8*>(dst);
-    Unicode::UTF8 *dstEnd   = dstBegin + dstLength;
+    UTF8 *dstBegin = reinterpret_cast<UTF8*>(dst);
+    UTF8 *dstEnd   = dstBegin + dstLength;
 
-    Unicode::ConversionResult result = Unicode::ConvertUTF16toUTF8(
-      &srcBegin, srcEnd, &dstBegin, dstEnd, Unicode::lenientConversion);
+    ConversionResult result = ConvertUTF16toUTF8(
+      &srcBegin, srcEnd, &dstBegin, dstEnd, lenientConversion);
 
-    if(result != Unicode::conversionOK) {
+    if(result != conversionOK) {
       debug("String::UTF16toUTF8() - Unicode conversion error.");
     }
 
 #endif
   }
 
-  void UTF8toUTF16(const char *src, size_t srcLength, wchar_t *dst, size_t dstLength)
+  inline void UTF8toUTF16(
+    const char *src, size_t srcLength, wchar_t *dst, size_t dstLength)
   {
-#ifdef HAVE_STD_CODECVT
-
-    typedef std::codecvt_utf8_utf16<wchar_t> utf8_utf16_t;
-
-    using namespace TagLib;
-
-    const char *srcBegin = src;
-    const char *srcEnd   = srcBegin + srcLength;
-
-    wchar_t *dstBegin = dst;
-    wchar_t *dstEnd   = dstBegin + dstLength;
-
-    std::mbstate_t st;
-    const char *source;
-    wchar_t *target;
-    memset(&st, 0, sizeof(st));
-    std::codecvt_base::result result = utf8_utf16_t().in(
-      st, srcBegin, srcEnd, source, dstBegin, dstEnd, target);
+#ifdef _WIN32
 
-    if(result != utf8_utf16_t::ok) {
+    const int len = ::MultiByteToWideChar(
+      CP_UTF8, 0, src, srcLength, dst, dstLength);
+    if (len == 0) {
       debug("String::UTF8toUTF16() - Unicode conversion error.");
     }
 
 #else
 
     using namespace Unicode;
-    using namespace TagLib;
 
-    const Unicode::UTF8 *srcBegin = reinterpret_cast<const Unicode::UTF8*>(src);
-    const Unicode::UTF8 *srcEnd   = srcBegin + srcLength;
+    const UTF8 *srcBegin = reinterpret_cast<const UTF8*>(src);
+    const UTF8 *srcEnd   = srcBegin + srcLength;
 
-    Unicode::UTF16 *dstBegin = dst;
-    Unicode::UTF16 *dstEnd   = dstBegin + dstLength;
+    UTF16 *dstBegin = dst;
+    UTF16 *dstEnd   = dstBegin + dstLength;
 
-    Unicode::ConversionResult result = Unicode::ConvertUTF8toUTF16(
-      &srcBegin, srcEnd, &dstBegin, dstEnd, Unicode::lenientConversion);
+    ConversionResult result = ConvertUTF8toUTF16(
+      &srcBegin, srcEnd, &dstBegin, dstEnd, lenientConversion);
 
-    if(result != Unicode::conversionOK) {
+    if(result != conversionOK) {
       debug("String::UTF8toUTF16() - Unicode conversion error.");
     }
 
index ebf1915d8f1c0b63b64be1f468ba5ef77714a9f0..d3a869f04c0ccd9f2d6f995c164635ef4021a9ed 100644 (file)
     bit mask & shift operations.
 ------------------------------------------------------------------------ */
 
-// Workaround for when MSVC doesn't have wchar_t as a built-in type.  
-#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED)
-# include <wchar.h>
-#endif
-
 /* Some fundamental constants */
 #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
 #define UNI_MAX_BMP (UTF32)0x0000FFFF