asprintf.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2006 Nicholas Marriott <nicholas.marriott@gmail.com>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
  14. * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <stdarg.h>
  17. #include <stdio.h>
  18. #ifdef HAVE_STDINT_H
  19. #include <stdint.h>
  20. #else
  21. #include <inttypes.h>
  22. #endif
  23. #include <string.h>
  24. #include "tmux.h"
  25. int
  26. asprintf(char **ret, const char *fmt, ...)
  27. {
  28. va_list ap;
  29. int n;
  30. va_start(ap, fmt);
  31. n = vasprintf(ret, fmt, ap);
  32. va_end(ap);
  33. return (n);
  34. }
  35. int
  36. vasprintf(char **ret, const char *fmt, va_list ap)
  37. {
  38. int n;
  39. va_list ap2;
  40. va_copy(ap2, ap);
  41. if ((n = vsnprintf(NULL, 0, fmt, ap)) < 0)
  42. goto error;
  43. *ret = xmalloc(n + 1);
  44. if ((n = vsnprintf(*ret, n + 1, fmt, ap2)) < 0) {
  45. free(*ret);
  46. goto error;
  47. }
  48. va_end(ap2);
  49. return (n);
  50. error:
  51. va_end(ap2);
  52. *ret = NULL;
  53. return (-1);
  54. }