From: Arun Thomas Date: Sun, 11 Jul 2010 13:46:58 +0000 (+0000) Subject: Import asprintf() and vasprintf() X-Git-Tag: v3.1.8~263 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/index.html?a=commitdiff_plain;h=1cee6fe95eb99d1b0e266dadcae76e89f739e5db;p=minix.git Import asprintf() and vasprintf() Ported from libnbcompat by Gautam Tirumala --- 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; +}