c99-compat.msvcrt.h: New compatibility header for some MSVCRT functions.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 12 Sep 2015 16:45:20 +0000 (12:45 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 12 Sep 2015 16:45:20 +0000 (12:45 -0400)
commit917db8c1094d9f28cc6e045d738a59b101405572
tree9a7fa7be72d9858e2735049dd66b98ded17743aa
parent4ec38100d4295b5008b040b133024fa022a822b6
c99-compat.msvcrt.h: New compatibility header for some MSVCRT functions.

This is specifically for snprintf() and vsnprintf(). Other C99 functions
that have different names in MSVC are handled by MinGW-w64's headers
with no overhead, so those remain in c++11-compat.msvc.h.

The specific issue is how _snprintf() handles truncation and NULL termination.
If the string fits the buffer exactly, _snprintf() will return size, but the
buffer will NOT be NULL-terminated. If the string is over the size of the
buffer, _snprintf() will return -1, and the buffer may or may not be blank.
(MSVCRT 2010 blanks the buffer by setting str[0] = 0; not sure about the
system MSVCRT.DLL, so I'm clearing it manually in the inline function.)

If using MinGW-w64 and __USE_MINGW_ANSI_STDIO is defined, MinGW-w64 will
provide its own snprintf() and vsnprintf() functions that are C99 compatible.
I'm not defining this, since those functions take up extra space, and we
don't strictly need full C99 compatibility.
src/c++11-compat.h
src/c++11-compat.msvc.h
src/c99-compat.msvcrt.h [new file with mode: 0644]