Move MSVC welfare (v)snprintf() functions to utils.c.

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3363 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
Meep-Eep
2009-11-28 19:44:10 +00:00
parent 4c4a80c64b
commit ef66877a29
2 changed files with 37 additions and 34 deletions
-33
View File
@@ -169,38 +169,5 @@ typedef unsigned short mode_t;
int readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result); int readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result);
#endif #endif
// String formatting
#ifdef _MSC_VER
# include <stdarg.h>
# include <stdio.h>
// MSVC does not have snprintf() and vsnprintf(). It does have a _snprintf()
// and _vsnprintf(), but these do not terminate a truncated string as
// the C standard prescribes.
static inline int
snprintf(char *str, size_t size, const char *format, ...)
{
int result;
va_list args;
va_start (args, format);
result = _vsnprintf (str, size, format, args);
if (str != NULL && size != 0)
str[size - 1] = '\0';
va_end (args);
return result;
}
static inline int
vsnprintf(char *str, size_t size, const char *format, va_list args)
{
int result = _vsnprintf (str, size, format, args);
if (str != NULL && size != 0)
str[size - 1] = '\0';
return result;
}
#endif /* _MSC_VER */
#endif /* _UIOPORT_H */ #endif /* _UIOPORT_H */
+37 -1
View File
@@ -21,6 +21,9 @@
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#include <stdio.h> #include <stdio.h>
#ifdef _MSC_VER
# include <stdarg.h>
#endif /* _MSC_VER */
#include "iointrn.h" #include "iointrn.h"
#include "ioaux.h" #include "ioaux.h"
@@ -364,6 +367,39 @@ uio_StdioAccessHandle_free(uio_StdioAccessHandle *handle) {
uio_free(handle); uio_free(handle);
} }
#ifdef _MSC_VER
# include <stdarg.h>
#if 0 /* Unneeded for now */
// MSVC does not have snprintf(). It does have a _snprintf(), but it does
// not \0-terminate a truncated string as the C standard prescribes.
static inline int
snprintf(char *str, size_t size, const char *format, ...)
{
int result;
va_list args;
va_start (args, format);
result = _vsnprintf (str, size, format, args);
if (str != NULL && size != 0)
str[size - 1] = '\0';
va_end (args);
return result;
}
#endif
// MSVC does not have vsnprintf(). It does have a _vsnprintf(), but it does
// not \0-terminate a truncated string as the C standard prescribes.
static inline int
vsnprintf(char *str, size_t size, const char *format, va_list args)
{
int result = _vsnprintf (str, size, format, args);
if (str != NULL && size != 0)
str[size - 1] = '\0';
return result;
}
#endif /* _MSC_VER */
// The result should be freed using uio_free(). // The result should be freed using uio_free().
// NB. POSIX allows errno to be set for vsprintf(), but does not require it: // NB. POSIX allows errno to be set for vsprintf(), but does not require it:
// "The value of errno may be set to nonzero by a library function call // "The value of errno may be set to nonzero by a library function call
@@ -391,7 +427,7 @@ uio_vasprintf(const char *format, va_list args) {
for (;;) { for (;;) {
int printResult = vsnprintf(buf, bufSize, format, args); int printResult = vsnprintf(buf, bufSize, format, args);
if (printResult < 0) { if (printResult < 0) {
// This means the buffer was not small enough, but vsnprintf() // This means the buffer was not large enough, but vsnprintf()
// does not give us any clue on how large it should be. // does not give us any clue on how large it should be.
// Note that this does not happen with a C'99 compliant // Note that this does not happen with a C'99 compliant
// vsnprintf(), but it will happen on MS Windows, and on // vsnprintf(), but it will happen on MS Windows, and on