diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d1dc686..bbcf8d89 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ option(BUILD_EXAMPLES "Build the examples" OFF) option(NO_ITUNES_HACKS "Disable workarounds for iTunes bugs" OFF) -set(TAGLIB_TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") +set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") ## the following are directories where stuff will be installed to set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") @@ -81,6 +81,7 @@ if(NOT WIN32 AND NOT BUILD_FRAMEWORK) endif() include_directories(${CMAKE_CURRENT_BINARY_DIR}) +configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) if(WITH_ASF) set(TAGLIB_WITH_ASF TRUE) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index bda45fe1..b2dcd9b5 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -31,10 +31,12 @@ endif() # Determine the CPU byte order. -test_big_endian(TAGLIB_BIG_ENDIAN) +test_big_endian(IS_BIG_ENDIAN) -if(NOT TAGLIB_BIG_ENDIAN) - set(TAGLIB_LITTLE_ENDIAN 1) +if(NOT IS_BIG_ENDIAN) + set(SYSTEM_BYTEORDER 1) +else() + set(SYSTEM_BYTEORDER 2) endif() # Determine if your compiler supports std::wstring. @@ -127,23 +129,23 @@ check_cxx_source_compiles(" __builtin_bswap16(0); return 0; } -" TAGLIB_HAVE_GCC_BYTESWAP_16) +" HAVE_GCC_BYTESWAP_16) check_cxx_source_compiles(" int main() { __builtin_bswap32(0); return 0; } -" TAGLIB_HAVE_GCC_BYTESWAP_32) +" HAVE_GCC_BYTESWAP_32) check_cxx_source_compiles(" int main() { __builtin_bswap64(0); return 0; } -" TAGLIB_HAVE_GCC_BYTESWAP_64) +" HAVE_GCC_BYTESWAP_64) -if(NOT TAGLIB_HAVE_GCC_BYTESWAP_16 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_32 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_64) +if(NOT HAVE_GCC_BYTESWAP_16 OR NOT HAVE_GCC_BYTESWAP_32 OR NOT HAVE_GCC_BYTESWAP_64) check_cxx_source_compiles(" #include int main() { @@ -152,9 +154,9 @@ if(NOT TAGLIB_HAVE_GCC_BYTESWAP_16 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_32 OR NOT TAG __bswap_64(0); return 0; } - " TAGLIB_HAVE_GLIBC_BYTESWAP) + " HAVE_GLIBC_BYTESWAP) - if(NOT TAGLIB_HAVE_GLIBC_BYTESWAP) + if(NOT HAVE_GLIBC_BYTESWAP) check_cxx_source_compiles(" #include int main() { @@ -163,9 +165,9 @@ if(NOT TAGLIB_HAVE_GCC_BYTESWAP_16 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_32 OR NOT TAG _byteswap_uint64(0); return 0; } - " TAGLIB_HAVE_MSC_BYTESWAP) + " HAVE_MSC_BYTESWAP) - if(NOT TAGLIB_HAVE_MSC_BYTESWAP) + if(NOT HAVE_MSC_BYTESWAP) check_cxx_source_compiles(" #include int main() { @@ -174,9 +176,9 @@ if(NOT TAGLIB_HAVE_GCC_BYTESWAP_16 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_32 OR NOT TAG OSSwapInt64(0); return 0; } - " TAGLIB_HAVE_MAC_BYTESWAP) + " HAVE_MAC_BYTESWAP) - if(NOT TAGLIB_HAVE_MAC_BYTESWAP) + if(NOT HAVE_MAC_BYTESWAP) check_cxx_source_compiles(" #include int main() { @@ -185,7 +187,7 @@ if(NOT TAGLIB_HAVE_GCC_BYTESWAP_16 OR NOT TAGLIB_HAVE_GCC_BYTESWAP_32 OR NOT TAG swap64(0); return 0; } - " TAGLIB_HAVE_OPENBSD_BYTESWAP) + " HAVE_OPENBSD_BYTESWAP) endif() endif() endif() @@ -199,15 +201,15 @@ check_cxx_source_compiles(" std::codecvt_utf8_utf16 x; return 0; } -" TAGLIB_HAVE_STD_CODECVT) +" HAVE_STD_CODECVT) # Check for libz using the cmake supplied FindZLIB.cmake find_package(ZLIB) if(ZLIB_FOUND) - set(TAGLIB_HAVE_ZLIB 1) + set(HAVE_ZLIB 1) else() - set(TAGLIB_HAVE_ZLIB 0) + set(HAVE_ZLIB 0) endif() diff --git a/config.h.cmake b/config.h.cmake new file mode 100644 index 00000000..155fea66 --- /dev/null +++ b/config.h.cmake @@ -0,0 +1,22 @@ +/* config.h. Generated by cmake from config.h.cmake */ + +/* Indicates the endianness of your target system */ +/* 1 if little-endian, 2 if big-endiann. */ +#cmakedefine SYSTEM_BYTEORDER ${SYSTEM_BYTEORDER} + +/* Defined if your compiler supports some byte swap functions */ +#cmakedefine HAVE_GCC_BYTESWAP_16 1 +#cmakedefine HAVE_GCC_BYTESWAP_32 1 +#cmakedefine HAVE_GCC_BYTESWAP_64 1 +#cmakedefine HAVE_GLIBC_BYTESWAP 1 +#cmakedefine HAVE_MSC_BYTESWAP 1 +#cmakedefine HAVE_MAC_BYTESWAP 1 +#cmakedefine HAVE_OPENBSD_BYTESWAP 1 + +/* Defined if your compiler supports codecvt */ +#cmakedefine HAVE_STD_CODECVT 1 + +/* Defined if you have libz */ +#cmakedefine HAVE_ZLIB 1 + +#cmakedefine TESTS_DIR "@TESTS_DIR@" diff --git a/taglib/mpeg/id3v2/id3v2frame.cpp b/taglib/mpeg/id3v2/id3v2frame.cpp index e79c47e3..424ac2d2 100644 --- a/taglib/mpeg/id3v2/id3v2frame.cpp +++ b/taglib/mpeg/id3v2/id3v2frame.cpp @@ -23,9 +23,10 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ +#include "config.h" #include "taglib_config.h" -#if TAGLIB_HAVE_ZLIB +#if HAVE_ZLIB #include #endif @@ -248,7 +249,7 @@ ByteVector Frame::fieldData(const ByteVector &frameData) const frameDataOffset += 4; } -#if TAGLIB_HAVE_ZLIB +#if HAVE_ZLIB if(d->header->compression() && !d->header->encryption()) { diff --git a/taglib/mpeg/id3v2/id3v2framefactory.cpp b/taglib/mpeg/id3v2/id3v2framefactory.cpp index d5a173c7..3138f90a 100644 --- a/taglib/mpeg/id3v2/id3v2framefactory.cpp +++ b/taglib/mpeg/id3v2/id3v2framefactory.cpp @@ -23,6 +23,7 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ +#include "config.h" #include "taglib_config.h" #include @@ -133,7 +134,7 @@ Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader) // TagLib doesn't mess with encrypted frames, so just treat them // as unknown frames. -#if !defined(TAGLIB_HAVE_ZLIB) || TAGLIB_HAVE_ZLIB == 0 +#if !defined(HAVE_ZLIB) || HAVE_ZLIB == 0 if(header->compression()) { debug("Compressed frames are currently not supported."); return new UnknownFrame(data, header); diff --git a/taglib/taglib_config.h.cmake b/taglib/taglib_config.h.cmake index ce8c6112..633fad28 100644 --- a/taglib/taglib_config.h.cmake +++ b/taglib/taglib_config.h.cmake @@ -1,9 +1,5 @@ /* taglib_config.h. Generated by cmake from taglib_config.h.cmake */ -/* Indicates the endianness of your target system */ -#cmakedefine TAGLIB_LITTLE_ENDIAN 1 -#cmakedefine TAGLIB_BIG_ENDIAN 1 - /* Defined if your compiler supports std::wstring */ #cmakedefine TAGLIB_HAVE_STD_WSTRING 1 @@ -15,22 +11,6 @@ #cmakedefine TAGLIB_HAVE_WIN_ATOMIC 1 #cmakedefine TAGLIB_HAVE_IA64_ATOMIC 1 -/* Defined if your compiler supports some byte swap functions */ -#cmakedefine TAGLIB_HAVE_GCC_BYTESWAP_16 1 -#cmakedefine TAGLIB_HAVE_GCC_BYTESWAP_32 1 -#cmakedefine TAGLIB_HAVE_GCC_BYTESWAP_64 1 -#cmakedefine TAGLIB_HAVE_GLIBC_BYTESWAP 1 -#cmakedefine TAGLIB_HAVE_MSC_BYTESWAP 1 -#cmakedefine TAGLIB_HAVE_MAC_BYTESWAP 1 -#cmakedefine TAGLIB_HAVE_OPENBSD_BYTESWAP 1 - -/* Defined if your compiler supports codecvt */ -#cmakedefine TAGLIB_HAVE_STD_CODECVT 1 - -/* Defined if you have libz */ -#cmakedefine TAGLIB_HAVE_ZLIB 1 - #define TAGLIB_WITH_ASF 1 #define TAGLIB_WITH_MP4 1 -#cmakedefine TAGLIB_TESTS_DIR "@TESTS_DIR@" diff --git a/taglib/toolkit/taglib.h b/taglib/toolkit/taglib.h index 044d5eda..a80c02e4 100755 --- a/taglib/toolkit/taglib.h +++ b/taglib/toolkit/taglib.h @@ -86,54 +86,6 @@ # define TAGLIB_ATOMIC_DEC(x) (--x) #endif -// Optimized byte swap functions. - -#if defined(TAGLIB_HAVE_MSC_BYTESWAP) -# include -#elif defined(TAGLIB_HAVE_GLIBC_BYTESWAP) -# include -#elif defined(TAGLIB_HAVE_MAC_BYTESWAP) -# include -#elif defined(TAGLIB_HAVE_OPENBSD_BYTESWAP) -# include -#endif - -#if defined(TAGLIB_HAVE_GCC_BYTESWAP_16) -# define TAGLIB_BYTESWAP_16(x) __builtin_bswap16(x) -#elif defined(TAGLIB_HAVE_MSC_BYTESWAP) -# define TAGLIB_BYTESWAP_16(x) _byteswap_ushort(x) -#elif defined(TAGLIB_HAVE_GLIBC_BYTESWAP) -# define TAGLIB_BYTESWAP_16(x) __bswap_16(x) -#elif defined(TAGLIB_HAVE_MAC_BYTESWAP) -# define TAGLIB_BYTESWAP_16(x) OSSwapInt16(x) -#elif defined(TAGLIB_HAVE_OPENBSD_BYTESWAP) -# define TAGLIB_BYTESWAP_16(x) swap16(x) -#endif - -#if defined(TAGLIB_HAVE_GCC_BYTESWAP_32) -# define TAGLIB_BYTESWAP_32(x) __builtin_bswap32(x) -#elif defined(TAGLIB_HAVE_MSC_BYTESWAP) -# define TAGLIB_BYTESWAP_32(x) _byteswap_ulong(x) -#elif defined(TAGLIB_HAVE_GLIBC_BYTESWAP) -# define TAGLIB_BYTESWAP_32(x) __bswap_32(x) -#elif defined(TAGLIB_HAVE_MAC_BYTESWAP) -# define TAGLIB_BYTESWAP_32(x) OSSwapInt32(x) -#elif defined(TAGLIB_HAVE_OPENBSD_BYTESWAP) -# define TAGLIB_BYTESWAP_32(x) swap32(x) -#endif - -#if defined(TAGLIB_HAVE_GCC_BYTESWAP_64) -# define TAGLIB_BYTESWAP_64(x) __builtin_bswap64(x) -#elif defined(TAGLIB_HAVE_MSC_BYTESWAP) -# define TAGLIB_BYTESWAP_64(x) _byteswap_uint64(x) -#elif defined(TAGLIB_HAVE_GLIBC_BYTESWAP) -# define TAGLIB_BYTESWAP_64(x) __bswap_64(x) -#elif defined(TAGLIB_HAVE_MAC_BYTESWAP) -# define TAGLIB_BYTESWAP_64(x) OSSwapInt64(x) -#elif defined(TAGLIB_HAVE_OPENBSD_BYTESWAP) -# define TAGLIB_BYTESWAP_64(x) swap64(x) -#endif - //! A namespace for all TagLib related classes and functions /*! diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index 06f38b6e..adada716 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -23,9 +23,22 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ +#include "config.h" + #include #include #include + +#if defined(HAVE_MSC_BYTESWAP) +# include +#elif defined(HAVE_GLIBC_BYTESWAP) +# include +#elif defined(HAVE_MAC_BYTESWAP) +# include +#elif defined(HAVE_OPENBSD_BYTESWAP) +# include +#endif + #include #include @@ -185,9 +198,25 @@ T byteSwap(T x) template <> ushort byteSwap(ushort x) { -#ifdef TAGLIB_BYTESWAP_16 +#if defined(HAVE_GCC_BYTESWAP_16) - return TAGLIB_BYTESWAP_16(x); + return __builtin_bswap16(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_ushort(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_16(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt16(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap16(x); #else @@ -199,9 +228,25 @@ ushort byteSwap(ushort x) template <> uint byteSwap(uint x) { -#ifdef TAGLIB_BYTESWAP_32 +#if defined(HAVE_GCC_BYTESWAP_32) - return TAGLIB_BYTESWAP_32(x); + return __builtin_bswap32(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_ulong(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_32(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt32(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap32(x); #else @@ -216,9 +261,25 @@ uint byteSwap(uint x) template <> ulonglong byteSwap(ulonglong x) { -#ifdef TAGLIB_BYTESWAP_64 +#if defined(HAVE_GCC_BYTESWAP_64) - return TAGLIB_BYTESWAP_64(x); + return __builtin_bswap64(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_uint64(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_64(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt64(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap64(x); #else @@ -246,7 +307,7 @@ T toNumber(const ByteVector &v, size_t offset, bool mostSignificantByteFirst) T tmp; ::memcpy(&tmp, v.data() + offset, sizeof(T)); -#ifdef TAGLIB_LITTLE_ENDIAN +#if SYSTEM_BYTEORDER == 1 const bool swap = mostSignificantByteFirst; #else const bool swap != mostSignificantByteFirst; @@ -279,7 +340,7 @@ ByteVector fromNumber(T value, bool mostSignificantByteFirst) { const size_t size = sizeof(T); -#ifdef TAGLIB_LITTLE_ENDIAN +#if SYSTEM_BYTEORDER == 1 const bool swap = mostSignificantByteFirst; #else const bool swap != mostSignificantByteFirst; diff --git a/taglib/toolkit/tstring.cpp b/taglib/toolkit/tstring.cpp index 7d5535e7..acf4847f 100644 --- a/taglib/toolkit/tstring.cpp +++ b/taglib/toolkit/tstring.cpp @@ -25,6 +25,8 @@ // This class assumes that std::basic_string has a contiguous and null-terminated buffer. +#include "config.h" + #include "tstring.h" #include "tdebug.h" #include "tstringlist.h" @@ -32,7 +34,17 @@ #include #include -#ifdef TAGLIB_HAVE_STD_CODECVT +#if defined(HAVE_MSC_BYTESWAP) +# include +#elif defined(HAVE_GLIBC_BYTESWAP) +# include +#elif defined(HAVE_MAC_BYTESWAP) +# include +#elif defined(HAVE_OPENBSD_BYTESWAP) +# include +#endif + +#ifdef HAVE_STD_CODECVT # include #else # include "unicode.h" @@ -42,13 +54,29 @@ namespace { inline TagLib::ushort byteSwap(TagLib::ushort x) { -#ifdef TAGLIB_BYTESWAP_16 +#if defined(HAVE_GCC_BYTESWAP_16) - return TAGLIB_BYTESWAP_16(x); + return __builtin_bswap16(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_ushort(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_16(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt16(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap16(x); #else - return((x >> 8) & 0xff) | ((x & 0xff) << 8); + return ((x >> 8) & 0xff) | ((x & 0xff) << 8); #endif } @@ -60,7 +88,7 @@ namespace void UTF16toUTF8(const wchar_t *src, size_t srcLength, char *dst, size_t dstLength) { -#ifdef TAGLIB_HAVE_STD_CODECVT +#ifdef HAVE_STD_CODECVT typedef std::codecvt_utf8_utf16 utf8_utf16_t; @@ -106,7 +134,7 @@ namespace void UTF8toUTF16(const char *src, size_t srcLength, wchar_t *dst, size_t dstLength) { -#ifdef TAGLIB_HAVE_STD_CODECVT +#ifdef HAVE_STD_CODECVT typedef std::codecvt_utf8_utf16 utf8_utf16_t; @@ -840,7 +868,7 @@ void String::copyFromUTF16(const char *s, size_t length, Type t) } } -#ifdef TAGLIB_LITTLE_ENDIAN +#if SYSTEM_BYTEORDER == 1 const String::Type String::WCharByteOrder = String::UTF16LE; diff --git a/tests/utils.h b/tests/utils.h index 3af9b2f6..a2d997eb 100644 --- a/tests/utils.h +++ b/tests/utils.h @@ -1,4 +1,4 @@ -#include "taglib_config.h" +#include "config.h" #ifdef _WIN32 #include @@ -17,7 +17,7 @@ using namespace std; inline string testFilePath(const string &filename) { - return string(TAGLIB_TESTS_DIR "data/") + filename; + return string(TESTS_DIR "data/") + filename; } #define TEST_FILE_PATH_C(f) testFilePath(f).c_str()