X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/846e943f2bb08e28ae78ca7f2e627d089f073ba1..c2d6a5db5b15f08b9e858e3fcf1e6847aaebe26b:/netdissect-stdinc.h diff --git a/netdissect-stdinc.h b/netdissect-stdinc.h index c52e72a9..567fb8ef 100644 --- a/netdissect-stdinc.h +++ b/netdissect-stdinc.h @@ -46,6 +46,9 @@ #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 @@ -80,6 +83,9 @@ */ /* + * Include 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 - and support for %zu in the formatted * printing functions. @@ -100,58 +106,12 @@ /* * Suppress definition of intN_t in bittypes.h, which might be included * by 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 . If not, define them - * ourselves. - * - * XXX - given the assumptions above, will they ever *not* be - * defined by ? - * - * 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 */ @@ -180,12 +140,9 @@ #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. @@ -295,62 +252,6 @@ typedef char* caddr_t; */ #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. */