static int local_vsnprintf(char *str, size_t size, const char *fmt, va_list va) { int rc; #if defined _MSC_VER if (size == 0) return 1024; rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va); if (rc < 0) rc = size - 1; #elif defined __MINGW32__ rc = __mingw_vsnprintf (str, size, fmt, va); #else rc = vsnprintf (str, size, fmt, va); #endif return rc; }
#define __CRT__NO_INLINE #include <stdio.h> #include <stdlib.h> #include <stdarg.h> int __mingw_asprintf(char ** __restrict__ ret, const char * __restrict__ format, ...) { va_list ap; int len; va_start(ap,format); /* Get Length */ len = __mingw_vsnprintf(NULL,0,format,ap); if (len < 0) goto _end; /* +1 for \0 terminator. */ *ret = malloc(len + 1); /* Check malloc fail*/ if (!*ret) { len = -1; goto _end; } /* Write String */ __mingw_vsnprintf(*ret,len+1,format,ap); /* Terminate explicitly */ (*ret)[len] = '\0'; _end: va_end(ap); return len; }