summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-02-03 17:31:08 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-02-03 17:31:08 +0000
commit461a420a87186bfe26e32d23768380fc97e4d275 (patch)
tree36908f83c04a3d26d3ad922d45da05f161573d7f
parent13ff49d906592afcec0c170572411693c8e26d13 (diff)
downloadpx4-nuttx-461a420a87186bfe26e32d23768380fc97e4d275.tar.gz
px4-nuttx-461a420a87186bfe26e32d23768380fc97e4d275.tar.bz2
px4-nuttx-461a420a87186bfe26e32d23768380fc97e4d275.zip
Add avsprintf()
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4365 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog3
-rw-r--r--nuttx/include/stdio.h1
-rw-r--r--nuttx/lib/stdio/Make.defs6
-rw-r--r--nuttx/lib/stdio/lib_asprintf.c59
-rw-r--r--nuttx/lib/stdio/lib_avsprintf.c146
5 files changed, 159 insertions, 56 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 2612ed4d1..cf1a6a53f 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -2442,5 +2442,6 @@
console (only a Telnet console) and SDIO is enabled. This configuration is
required because the STM3240G-EVAL board cannot simultaneously support
RS-232 and SDIO due to pin conflicts.
- * lib/string/strcasestr.c: Add strcasestr().
+ * lib/string/lib_strcasestr.c: Add strcasestr().
+ * lib/stdio/lib_avsprintf.c: Add avsprintf().
diff --git a/nuttx/include/stdio.h b/nuttx/include/stdio.h
index b6286801a..8da720c25 100644
--- a/nuttx/include/stdio.h
+++ b/nuttx/include/stdio.h
@@ -133,6 +133,7 @@ EXTERN int ungetc(int c, FAR FILE *stream);
EXTERN int vprintf(FAR const char *format, va_list ap);
EXTERN int vfprintf(FAR FILE *stream, const char *format, va_list ap);
EXTERN int vsprintf(FAR char *buf, const char *format, va_list ap);
+EXTERN int avsprintf(FAR char **ptr, const char *fmt, va_list ap);
EXTERN int vsnprintf(FAR char *buf, size_t size, const char *format, va_list ap);
EXTERN int vsscanf(char *buf, const char *s, va_list ap);
diff --git a/nuttx/lib/stdio/Make.defs b/nuttx/lib/stdio/Make.defs
index 8515c5415..7bffb2340 100644
--- a/nuttx/lib/stdio/Make.defs
+++ b/nuttx/lib/stdio/Make.defs
@@ -1,8 +1,8 @@
############################################################################
# lib/stdio/Make.defs
#
-# Copyright (C) 2011 Gregory Nutt. All rights reserved.
-# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -35,7 +35,7 @@
STDIO_SRCS = lib_fileno.c lib_printf.c lib_rawprintf.c lib_lowprintf.c \
lib_sprintf.c lib_asprintf.c lib_snprintf.c lib_libsprintf.c \
- lib_vsprintf.c lib_vsnprintf.c lib_libvsprintf.c \
+ lib_vsprintf.c lib_avsprintf.c lib_vsnprintf.c lib_libvsprintf.c \
lib_meminstream.c lib_memoutstream.c lib_lowinstream.c \
lib_lowoutstream.c lib_zeroinstream.c lib_nullinstream.c \
lib_nulloutstream.c lib_sscanf.c
diff --git a/nuttx/lib/stdio/lib_asprintf.c b/nuttx/lib/stdio/lib_asprintf.c
index 343f6dd86..84aaafa46 100644
--- a/nuttx/lib/stdio/lib_asprintf.c
+++ b/nuttx/lib/stdio/lib_asprintf.c
@@ -1,8 +1,8 @@
/****************************************************************************
* lib/stdio/lib_asprintf.c
*
- * Copyright (C) 2011 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -38,10 +38,7 @@
****************************************************************************/
#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include "lib_internal.h"
+#include <stdarg.h>
/****************************************************************************
* Pre-processor Definitions
@@ -95,56 +92,14 @@
int asprintf (FAR char **ptr, const char *fmt, ...)
{
- struct lib_outstream_s nulloutstream;
- struct lib_memoutstream_s memoutstream;
- FAR char *buf;
va_list ap;
- int nbytes;
-
- DEBUGASSERT(ptr && fmt);
-
- /* First, use a nullstream to get the size of the buffer. The number
- * of bytes returned may or may not include the null terminator.
- */
-
- lib_nulloutstream(&nulloutstream);
- va_start(ap, fmt);
- nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&nulloutstream, fmt, ap);
- va_end(ap);
+ int ret;
- /* Then allocate a buffer to hold that number of characters, adding one
- * for the null terminator.
- */
-
- buf = (FAR char *)malloc(nulloutstream.nput + 1);
- if (!buf)
- {
- return ERROR;
- }
-
- /* Initialize a memory stream to write into the allocated buffer. The
- * memory stream will reserve one byte at the end of the buffer for the
- * null terminator and will not report this in the number of output bytes.
- */
-
- lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream,
- buf, nulloutstream.nput + 1);
-
- /* Then let lib_vsprintf do it's real thing */
+ /* Let avsprintf do all of the work */
va_start(ap, fmt);
- nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, fmt, ap);
+ ret = avsprintf(ptr, fmt, ap);
va_end(ap);
- /* Return a pointer to the string to the caller. NOTE: the memstream put()
- * method has already added the NUL terminator to the end of the string (not
- * included in the nput count).
- *
- * Hmmm.. looks like the memory would be stranded if lib_vsprintf() returned
- * an error. Does that ever happen?
- */
-
- DEBUGASSERT(nbytes < 0 || nbytes == nulloutstream.nput);
- *ptr = buf;
- return nbytes;
+ return ret;
}
diff --git a/nuttx/lib/stdio/lib_avsprintf.c b/nuttx/lib/stdio/lib_avsprintf.c
new file mode 100644
index 000000000..8561b97c2
--- /dev/null
+++ b/nuttx/lib/stdio/lib_avsprintf.c
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * lib/stdio/lib_avsprintf.c
+ *
+ * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * 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.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * 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 OWNER 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#include "lib_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Constant Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Constant Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: avsprintf
+ *
+ * Description:
+ * This function is similar to vsprintf, except that it dynamically
+ * allocates a string (as with malloc) to hold the output, instead of
+ * putting the output in a buffer you allocate in advance. The ptr
+ * argument should be the address of a char * object, and a successful
+ * call to avsprintf stores a pointer to the newly allocated string at that
+ * location.
+ *
+ * Returned Value:
+ * The returned value is the number of characters allocated for the buffer,
+ * or less than zero if an error occurred. Usually this means that the buffer
+ * could not be allocated.
+ *
+ ****************************************************************************/
+
+int avsprintf(FAR char **ptr, const char *fmt, va_list ap)
+{
+ struct lib_outstream_s nulloutstream;
+ struct lib_memoutstream_s memoutstream;
+ FAR char *buf;
+ int nbytes;
+
+ DEBUGASSERT(ptr && fmt);
+
+ /* First, use a nullstream to get the size of the buffer. The number
+ * of bytes returned may or may not include the null terminator.
+ */
+
+ lib_nulloutstream(&nulloutstream);
+ nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&nulloutstream, fmt, ap);
+
+ /* Then allocate a buffer to hold that number of characters, adding one
+ * for the null terminator.
+ */
+
+ buf = (FAR char *)malloc(nulloutstream.nput + 1);
+ if (!buf)
+ {
+ return ERROR;
+ }
+
+ /* Initialize a memory stream to write into the allocated buffer. The
+ * memory stream will reserve one byte at the end of the buffer for the
+ * null terminator and will not report this in the number of output bytes.
+ */
+
+ lib_memoutstream((FAR struct lib_memoutstream_s *)&memoutstream,
+ buf, nulloutstream.nput + 1);
+
+ /* Then let lib_vsprintf do it's real thing */
+
+ nbytes = lib_vsprintf((FAR struct lib_outstream_s *)&memoutstream.public, fmt, ap);
+
+ /* Return a pointer to the string to the caller. NOTE: the memstream put()
+ * method has already added the NUL terminator to the end of the string (not
+ * included in the nput count).
+ *
+ * Hmmm.. looks like the memory would be stranded if lib_vsprintf() returned
+ * an error. Does that ever happen?
+ */
+
+ DEBUGASSERT(nbytes < 0 || nbytes == nulloutstream.nput);
+ *ptr = buf;
+ return nbytes;
+}