From cd9cfacca47f2d548ae4d8eac2daf45250e16533 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 26 Aug 2008 20:24:25 +0000 Subject: [PATCH] Fix for MinGW, although not complete -- doesn't have _vscprintf(). --- src/libCom/osi/os/WIN32/osdStdio.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/libCom/osi/os/WIN32/osdStdio.c b/src/libCom/osi/os/WIN32/osdStdio.c index d60495aae..602651f8b 100644 --- a/src/libCom/osi/os/WIN32/osdStdio.c +++ b/src/libCom/osi/os/WIN32/osdStdio.c @@ -17,13 +17,27 @@ int epicsShareAPI epicsVsnprintf(char *str, size_t len, const char *fmt, va_list ap) { - int needed = _vscprintf(fmt, ap); int retval = _vsnprintf(str, len, fmt, ap); +#ifdef _MSC_VER + int needed = _vscprintf(fmt, ap); + if ((int) len < needed + 1) { str[len - 1] = 0; return needed; } +#else + /* Unfortunately MINGW doesn't provide _vscprintf and their + * _vsnprintf follows MS' broken return value semantics. + */ + if (retval == -1) { + if (len) + str[len - 1] = 0; + return len; + } else if (retval == (int) len) { + str[--retval] = 0; + } +#endif return retval; }