From 1cee6fe95eb99d1b0e266dadcae76e89f739e5db Mon Sep 17 00:00:00 2001 From: Arun Thomas Date: Sun, 11 Jul 2010 13:46:58 +0000 Subject: [PATCH] Import asprintf() and vasprintf() Ported from libnbcompat by Gautam Tirumala --- include/stdio.h | 5 ++ lib/libc/stdio/Makefile.inc | 1 + lib/libc/stdio/asprintf.c | 95 +++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 lib/libc/stdio/asprintf.c diff --git a/include/stdio.h b/include/stdio.h index 1f595d562..de6dc7dcd 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -152,4 +152,9 @@ _PROTOTYPE(int vsnprintf, (char *_s, size_t _n, const char *_format, _PROTOTYPE(char *fgetln, (FILE *stream, size_t *len)); #endif +#ifdef _MINIX +_PROTOTYPE(int asprintf, (char **ret, const char *fmt, ...)); +_PROTOTYPE(int vasprintf, (char **ret, const char *fmt, char *_arg)); +#endif /* _MINIX */ + #endif /* _STDIO_H */ diff --git a/lib/libc/stdio/Makefile.inc b/lib/libc/stdio/Makefile.inc index a4a0c5409..098733c89 100644 --- a/lib/libc/stdio/Makefile.inc +++ b/lib/libc/stdio/Makefile.inc @@ -2,6 +2,7 @@ .PATH: ${.CURDIR}/stdio SRCS+= \ + asprintf.c \ clearerr.c \ data.c \ doprnt.c \ diff --git a/lib/libc/stdio/asprintf.c b/lib/libc/stdio/asprintf.c new file mode 100644 index 000000000..7ca36dd97 --- /dev/null +++ b/lib/libc/stdio/asprintf.c @@ -0,0 +1,95 @@ +/* $NetBSD: asprintf.c,v 1.2 2007/07/20 00:10:06 tnn Exp $ */ + +/*- + * Copyright (c) 2007 Joerg Sonnenberger . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +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; +} -- 2.44.0