From fa29bb9741135a8bb8049c9bcd30f4c51a83c4bb Mon Sep 17 00:00:00 2001 From: David Daniel Date: Mon, 9 Aug 2004 15:03:52 +0000 Subject: [PATCH] Adding an asprintf implementation for portability. Should add a (v)snprintf implementation later. This commit was SVN r1971. --- src/util/asprintf.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/util/asprintf.c diff --git a/src/util/asprintf.c b/src/util/asprintf.c new file mode 100644 index 0000000000..b7f1f6bad5 --- /dev/null +++ b/src/util/asprintf.c @@ -0,0 +1,51 @@ +/* + * $HEADER$ + */ + +/* + * Simple implementation of asprintf based on vsnprintf. + * + * Assumes that vsnprintf returns the required number of characters when + * supplied with a null buffer (as specified in C99). + */ + +#include +#include +#include +#include + +/* + * Need to implement ompi_vsnprintf for platforms that don't have a + * working vsnprintf. + * + * For now, assume a working vsnprintf... + */ + +#define ompi_vsnprintf vsnprintf + +int ompi_asprintf(char **ptr, const char *fmt, ...) +{ + int length; + size_t size; + va_list ap; + + /* find the required size */ + va_start(ap, fmt); + length = ompi_vsnprintf(NULL, (size_t) 0, fmt, ap); + size = (size_t) length + 1; + va_end(ap); + + /* allocate a buffer */ + *ptr = (char *) malloc(size); + if (*ptr == NULL) { + errno = ENOMEM; + return -1; + } + + /* fill the buffer */ + va_start(ap, fmt); + length = ompi_vsnprintf(*ptr, size, fmt, ap); + va_end(ap); + + return length; +}