Annotation of embedaddon/miniupnpd/miniupnpc/src/win32_snprintf.h, revision 1.1.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>