Annotation of embedaddon/miniupnpc/src/win32_snprintf.h, revision 1.1
1.1 ! misho 1: /* vim: tabstop=4 shiftwidth=4 noexpandtab
! 2: * MiniUPnP project
! 3: * http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
! 4: * (c) 2020 Pali Rohár
! 5: * This software is subject to the conditions detailed
! 6: * in the LICENCE file provided within the distribution */
! 7:
! 8: #ifndef WIN32_SNPRINTF_H
! 9: #define WIN32_SNPRINTF_H
! 10:
! 11: #ifdef _WIN32
! 12:
! 13: #include <stdio.h>
! 14:
! 15: /* snprintf is supported by:
! 16: * - Visual Studio 2015 or new
! 17: * - mingw32 with iso c ext
! 18: * - mingw-w64 with ansi stdio
! 19: * - mingw-w64 6.0.0 or new with ucrt
! 20: * - mingw-w64 8.0.0 or new with iso c ext
! 21: */
! 22: #if ( \
! 23: (defined(_MSC_VER) && _MSC_VER < 1900) /* Visual Studio older than 2015 */ || \
! 24: (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) && defined(__NO_ISOCEXT)) /* mingw32 without iso c ext */ || \
! 25: (defined(__MINGW64_VERSION_MAJOR) && /* mingw-w64 not ... */ !( \
! 26: (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO != 0)) /* ... with ansi stdio */ || \
! 27: (__MINGW64_VERSION_MAJOR >= 6 && defined(_UCRT)) /* ... at least 6.0.0 with ucrt */ || \
! 28: (__MINGW64_VERSION_MAJOR >= 8 && !defined(__NO_ISOCEXT)) /* ... at least 8.0.0 with iso c ext */ || \
! 29: 0) || \
! 30: 0)
! 31:
! 32: /* _scprintf is supported by:
! 33: * - Visual Studio 2002 or new
! 34: * - msvcr70.dll or new
! 35: * - msvcrt.dll on Windows XP or new
! 36: */
! 37: #if ( \
! 38: (defined(_MSC_VER) && _MSC_VER < 1300) /* Visual Studio older than 2002 */ || \
! 39: (defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x700) /* msvcrt older than 7.0 */ || \
! 40: 0)
! 41: #define CHECK_SCPRINTF 0
! 42: #define IF_SCPRINTF(expr) 0
! 43: #define ELSE_SCPRINTF(expr) expr
! 44: #else
! 45: #define CHECK_SCPRINTF 1
! 46: #define IF_SCPRINTF(expr) expr
! 47: #define ELSE_SCPRINTF(expr) 0
! 48: #endif
! 49:
! 50: /* Emulation of snprintf for win32 */
! 51: #define snprintf(buf, size, fmt, ...) ( \
! 52: (((size) != 0 && (buf) != NULL) ? ( /* _snprintf does not work with NULL buffer */ \
! 53: _snprintf((buf), (size), (fmt), __VA_ARGS__), /* _snprintf returns -1 on overflow, so ignore its value */ \
! 54: (((char *)buf)[(size_t)(size)-1] = 0), /* _snprintf does not fill nul byte on overflow */ \
! 55: 0) : 0), \
! 56: (CHECK_SCPRINTF ? IF_SCPRINTF( \
! 57: _scprintf((fmt), __VA_ARGS__) /* calculate return value for snprintf via _scprintf */ \
! 58: ) : ELSE_SCPRINTF( \
! 59: ((size) != 0 && (buf) != NULL) ? \
! 60: strlen((buf)) /* return just length of buffer */ \
! 61: : \
! 62: 1 /* no buffer, impossible to calculate, return just non-zero number */ \
! 63: ) \
! 64: ) \
! 65: )
! 66:
! 67: #endif
! 68:
! 69: #endif /* _WIN32 */
! 70:
! 71: #endif /* WIN32_SNPRINTF_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>