vasprintf.c 446 B

123456789101112131415161718192021222324252627282930
  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. #ifdef _MSC_VER
  11. ap2 = ap;
  12. #else
  13. va_copy(ap2, ap);
  14. #endif
  15. len = vsnprintf(NULL, 0, fmt, ap2);
  16. if (len > 0 && (buf = malloc((buflen = (size_t) (len + 1)))) != NULL) {
  17. len = vsnprintf(buf, buflen, fmt, ap);
  18. *ret = buf;
  19. } else {
  20. *ret = NULL;
  21. len = -1;
  22. }
  23. va_end(ap2);
  24. return len;
  25. }