#include #include #include #if defined (__SVR4) && defined (__sun) #include #endif int asprintf(char **ret, const char *fmt, ...) { va_list ap; int retval; va_start(ap, fmt); retval = vasprintf(ret, fmt, ap); va_end(ap); return retval; } int vasprintf(char **ret, const char *fmt, va_list ap) { char *buf, *new_buf; size_t len; int retval; len = 128; buf = malloc(len); if (buf == NULL) { *ret = NULL; return -1; } retval = vsnprintf(buf, len, fmt, ap); if (retval < 0) { free(buf); *ret = NULL; return -1; } if (retval < len) { new_buf = realloc(buf, retval + 1); if (new_buf == NULL) *ret = buf; else *ret = new_buf; return retval; } len = (size_t)retval + 1; free(buf); buf = malloc(len); if (buf == NULL) { *ret = NULL; return -1; } retval = vsnprintf(buf, len, fmt, ap); if (retval != len - 1) { free(buf); *ret = NULL; return -1; } *ret = buf; return retval; }