version 1.1, 2015/03/19 14:57:29 |
version 1.4, 2020/06/15 01:37:15 |
|
|
#include "config.h" |
/* $Id$ */ |
|
|
#if HAVE_VASPRINTF |
|
|
|
int dummy; |
|
|
|
#else |
|
|
|
/* $Id$ */ |
|
/* |
/* |
* Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
|
|
* printf(3) or completely reimplementing printf(3), i can't think |
* printf(3) or completely reimplementing printf(3), i can't think |
* of another portable solution. |
* of another portable solution. |
*/ |
*/ |
|
#include "config.h" |
|
|
#include <stdarg.h> |
#include <stdarg.h> |
#include <stdio.h> |
#include <stdio.h> |
|
|
vasprintf(char **ret, const char *format, va_list ap) |
vasprintf(char **ret, const char *format, va_list ap) |
{ |
{ |
char buf[2]; |
char buf[2]; |
|
va_list ap2; |
int sz; |
int sz; |
|
|
if ((sz = vsnprintf(buf, sizeof(buf), format, ap)) != -1 && |
va_copy(ap2, ap); |
(*ret = malloc(sz + 1)) != NULL) { |
sz = vsnprintf(buf, sizeof(buf), format, ap2); |
|
va_end(ap2); |
|
|
|
if (sz != -1 && (*ret = malloc(sz + 1)) != NULL) { |
if (vsnprintf(*ret, sz + 1, format, ap) == sz) |
if (vsnprintf(*ret, sz + 1, format, ap) == sz) |
return(sz); |
return sz; |
free(*ret); |
free(*ret); |
} |
} |
*ret = NULL; |
*ret = NULL; |
return(-1); |
return -1; |
} |
} |
|
|
#endif |
|