#include "varattrs.h"
/*
+ * If we're compiling with Visual Studio, make sure we have at least
+ * VS 2015 or later, so we have sufficient C99 support.
+ *
* XXX - verify that we have at least C99 support on UN*Xes?
*
* What about MinGW or various DOS toolchains? We're currently assuming
*/
/*
+ * Include <inttypes.h> to get the integer types and PRi[doux]64 values
+ * defined.
+ *
* If the compiler is MSVC, we require VS 2015 or newer, so we
* have <inttypes.h> - and support for %zu in the formatted
* printing functions.
/*
* Suppress definition of intN_t in bittypes.h, which might be included
* by <pcap/pcap.h> in older versions of WinPcap.
- * (Yes, HAVE_U_INTn_T, as the definition guards are UN*X-oriented, and
- * we check for u_intN_t in the UN*X configure script.)
+ * (Yes, HAVE_U_INTn_T, as the definition guards are UN*X-oriented.)
*/
#define HAVE_U_INT8_T
#define HAVE_U_INT16_T
#define HAVE_U_INT32_T
#define HAVE_U_INT64_T
-
- /*
- * These may be defined by <inttypes.h>. If not, define them
- * ourselves.
- *
- * XXX - given the assumptions above, will they ever *not* be
- * defined by <inttypes.h>?
- *
- * XXX - for MSVC, we always want the _MSC_EXTENSIONS versions.
- * What about other compilers? If, as the MinGW Web site says MinGW
- * does, the other compilers just use Microsoft's run-time library,
- * then they should probably use the _MSC_EXTENSIONS even if the
- * compiler doesn't define _MSC_EXTENSIONS.
- */
- #ifndef PRId64
- #ifdef _MSC_EXTENSIONS
- #define PRId64 "I64d"
- #else
- #define PRId64 "lld"
- #endif
- #endif /* PRId64 */
-
- #ifndef PRIo64
- #ifdef _MSC_EXTENSIONS
- #define PRIo64 "I64o"
- #else
- #define PRIo64 "llo"
- #endif
- #endif /* PRIo64 */
-
- #ifndef PRIx64
- #ifdef _MSC_EXTENSIONS
- #define PRIx64 "I64x"
- #else
- #define PRIx64 "llx"
- #endif
- #endif
-
- #ifndef PRIu64
- #ifdef _MSC_EXTENSIONS
- #define PRIu64 "I64u"
- #else
- #define PRIu64 "llu"
- #endif
- #endif
#endif
#endif /* HAVE_PCAP_PCAP_INTTYPES_H */
#define strtoint64_t strtoll
/*
- * Microsoft's documentation doesn't speak of LL as a valid
- * suffix for 64-bit integers, so we'll just use i64.
- *
- * XXX - is that still the case as of VS 2015?
+ * And we have LL as a suffix for constants, so use that.
*/
- #define INT64_T_CONSTANT(constant) (constant##i64)
+ #define INT64_T_CONSTANT(constant) (constant##LL)
#else
/*
* Non-Microsoft compiler.
*/
#include "funcattrs.h"
-/*
- * On Windows, snprintf(), with that name and with C99 behavior - i.e.,
- * guaranteeing that the formatted string is null-terminated - didn't
- * appear until Visual Studio 2015. Prior to that, the C runtime had
- * only _snprintf(), which *doesn't* guarantee that the string is
- * null-terminated if it is truncated due to the buffer being too
- * small. We therefore can't just define snprintf to be _snprintf
- * and define vsnprintf to be _vsnprintf, as we're relying on null-
- * termination of strings in all cases.
- *
- * Furthermore, some versions of Visual Studio prior to Visual
- * Studio 2015 had vsnprintf() (but not snprintf()!), but those
- * versions don't guarantee null termination, either.
- *
- * We assume all UN*Xes that have snprintf() and vsnprintf() provide
- * C99 behavior.
- */
-#if defined(_MSC_VER) || defined(__MINGW32__)
- #if defined(_MSC_VER) && _MSC_VER >= 1900
- /*
- * VS 2015 or newer; just use the C runtime's snprintf() and
- * vsnprintf().
- */
- #define nd_snprintf snprintf
- #define nd_vsnprintf vsnprintf
- #else /* defined(_MSC_VER) && _MSC_VER >= 1900 */
- /*
- * VS prior to 2015, or MingGW; assume we have _snprintf_s() and
- * _vsnprintf_s(), which guarantee null termination.
- */
- #define nd_snprintf(buf, buflen, ...) \
- _snprintf_s(buf, buflen, _TRUNCATE, __VA_ARGS__)
- #define nd_vsnprintf(buf, buflen, fmt, ap) \
- _vsnprintf_s(buf, buflen, _TRUNCATE, fmt, ap)
- #endif /* defined(_MSC_VER) && _MSC_VER >= 1900 */
-#else /* defined(_MSC_VER) || defined(__MINGW32__) */
- /*
- * Some other compiler, which we assume to be a UN*X compiler.
- * Use the system's snprintf() if we have it, otherwise use
- * our own implementation
- */
- #ifdef HAVE_SNPRINTF
- #define nd_snprintf snprintf
- #else /* HAVE_SNPRINTF */
- int nd_snprintf (char *str, size_t sz, FORMAT_STRING(const char *format), ...)
- PRINTFLIKE(3, 4);
- #endif /* HAVE_SNPRINTF */
-
- #ifdef HAVE_VSNPRINTF
- #define nd_vsnprintf vsnprintf
- #else /* HAVE_VSNPRINTF */
- int nd_vsnprintf (char *str, size_t sz, FORMAT_STRING(const char *format),
- va_list ap) PRINTFLIKE(3, 0);
- #endif /* HAVE_VSNPRINTF */
-#endif /* defined(_MSC_VER) || defined(__MINGW32__) */
-
/*
* fopen() read and write modes for text files and binary files.
*/