diff --git a/inc/thorvg.h b/inc/thorvg.h index 18b87ef3..8905ba40 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -18,7 +18,7 @@ #include #ifdef TVG_BUILD - #ifdef _MSC_VER + #if defined(_MSC_VER) && !defined(__clang__) #define TVG_EXPORT __declspec(dllexport) #define TVG_DEPRECATED __declspec(deprecated) #else diff --git a/src/lib/sw_engine/tvgSwMath.cpp b/src/lib/sw_engine/tvgSwMath.cpp index e39eeb0b..55c563fe 100644 --- a/src/lib/sw_engine/tvgSwMath.cpp +++ b/src/lib/sw_engine/tvgSwMath.cpp @@ -28,7 +28,7 @@ /************************************************************************/ //clz: count leading zero’s -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #include static uint32_t __inline _clz(uint32_t value) { diff --git a/src/lib/tvgCommon.h b/src/lib/tvgCommon.h index a2256803..c970b930 100644 --- a/src/lib/tvgCommon.h +++ b/src/lib/tvgCommon.h @@ -48,6 +48,11 @@ using namespace tvg; #define TVG_FALLTHROUGH #endif +#ifdef __clang__ + #define strncpy strncpy_s + #define strdup _strdup +#endif + //TVG class identifier values #define TVG_CLASS_ID_UNDEFINED 0 #define TVG_CLASS_ID_SHAPE 1 @@ -68,4 +73,4 @@ enum class FileType { Tvg = 0, Svg, Raw, Png, Jpg, Unknown }; uint16_t THORVG_VERSION_NUMBER(); -#endif //_TVG_COMMON_H_ \ No newline at end of file +#endif //_TVG_COMMON_H_ diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 4c979661..74cbdb24 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -31,6 +31,20 @@ #include #endif +static FILE* _fopen(const char* filename, const char* mode) +{ +#ifdef __clang__ + FILE *fp; + auto err = fopen_s(&fp, filename, mode); + if (err != 0) return nullptr; + return fp; +#else + auto fp = fopen(filename, mode); + if (!fp) return nullptr; + return fp; +#endif +} + #define SIZE(A) sizeof(A) /************************************************************************/ @@ -181,7 +195,7 @@ bool TvgSaver::saveEncoding(const std::string& path) memcpy(uncompressed, &compressedSizeBits, TVG_HEADER_COMPRESSED_SIZE_BITS); //Good optimization, flush to file. - auto fp = fopen(path.c_str(), "w+"); + auto fp = _fopen(path.c_str(), "w+"); if (!fp) goto fail; //write header @@ -204,7 +218,7 @@ fail: bool TvgSaver::flushTo(const std::string& path) { - auto fp = fopen(path.c_str(), "w+"); + auto fp = _fopen(path.c_str(), "w+"); if (!fp) return false; if (fwrite(buffer.data, SIZE(uint8_t), buffer.count, fp) == 0) {