vasprintf.c 580 B

12345678910111213141516171819202122232425262728293031
  1. #include <stdarg.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int vasprintf(char **ret, const char *fmt, va_list ap)
  5. {
  6. char *buf;
  7. int len;
  8. size_t buflen;
  9. va_list ap2;
  10. #if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)
  11. ap2 = ap;
  12. len = _vscprintf(fmt, ap2); // NOTE MS specific extension ( :-( )
  13. #else
  14. va_copy(ap2, ap);
  15. len = vsnprintf(NULL, 0, fmt, ap2);
  16. #endif
  17. if (len >= 0 && (buf = malloc ((buflen = (size_t) (len + 1)))) != NULL) {
  18. len = vsnprintf(buf, buflen, fmt, ap);
  19. *ret = buf;
  20. } else {
  21. *ret = NULL;
  22. len = -1;
  23. }
  24. va_end(ap2);
  25. return len;
  26. }