diff options
-rw-r--r-- | common/scummsys.h | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/common/scummsys.h b/common/scummsys.h index b6d5263791..a425befecf 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -40,26 +40,42 @@ #if defined(WIN32) #ifdef _MSC_VER - // vnsprintf was introduced with Visual Studio 2008. The 2003 edition - // only included a function called _vsnprintf. We do not officially - // support MSVC 2003 anymore, but it should not hurt to still have - // this around here. - #if (_MSC_VER < 1500) - #define vsnprintf _vsnprintf - #endif + + // FIXME: The placement of the workaround functions for MSVC below + // require us to include stdio.h and stdarg.h for MSVC here. This + // is not exactly nice... + // We should think of a better way of doing this. + #include <stdio.h> + #include <stdarg.h> + + // MSVC's vsnprintf is either non-existant (2003) or bugged since it + // does not always include a terminating NULL (2005+). To work around + // that we fix up the _vsnprintf included. Note that the return value + // will still not match C99's specs! + inline int vsnprintf_msvc(char *str, size_t size, const char *format, va_list args) { + // We do not pass size - 1 here, to ensure we would get the same + // return value as when we would use _vsnprintf directly, since + // for example Common::String::format relies on this. + int retValue = _vsnprintf(str, size, format, args); + str[size - 1] = 0; + return retValue; + } + + #define vsnprintf vsnprintf_msvc + // Visual Studio does not include snprintf in its standard C library. // Instead it includes a function called _snprintf with somewhat // similar semantics. The minor difference is that the return value in // case the formatted string exceeds the buffer size is different. // A much more dangerous one is that _snprintf does not always include - // a terminating null (Whoops!). - // - // FIXME: Provide a proper snprintf function for MSVC. It should at - // least always include a terminating null! - // - // See here for more details: - // http://msdn.microsoft.com/en-us/library/2ts7cx93%28v=VS.100%29.aspx - #define snprintf _snprintf + // a terminating null (Whoops!). Instead we map to our fixed vsnprintf. + inline int snprintf(char *str, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int len = vsnprintf(str, size, format, args); + va_end(args); + return len; + } #endif #if !defined(_WIN32_WCE) |