#include #include #include #include int asprintf(char **restrict sp, const char *restrict fmt, ...) { int ret; va_list argp; va_start(argp, fmt); ret = vasprintf(sp, fmt, argp); va_end(argp); return ret; } int vasprintf(char **restrict sp, const char *restrict fmt, va_list ap) { va_list ap2; va_copy(ap2, ap); int ret = vsnprintf(NULL, 0, fmt, ap2); va_end(ap2); if (ret < 0) return ret; *sp = malloc(ret+1); if (*sp == NULL) return -1; return vsnprintf(*sp, ret+1, fmt, ap); }