From 2d6e5ff6c4450662ffc8d1d8d2f46da0155d6905 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 30 Mar 2011 22:30:49 +0000 Subject: Move more files into subdirectories under lib/ git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3444 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/lib/lib_filesem.c | 145 --------------- nuttx/lib/lib_init.c | 203 --------------------- nuttx/lib/lib_libdtoa.c | 365 -------------------------------------- nuttx/lib/lib_sem.c | 145 --------------- nuttx/lib/lib_streamsem.c | 90 ---------- nuttx/lib/misc/lib_filesem.c | 145 +++++++++++++++ nuttx/lib/misc/lib_init.c | 203 +++++++++++++++++++++ nuttx/lib/misc/lib_streamsem.c | 90 ++++++++++ nuttx/lib/stdio/lib_libdtoa.c | 365 ++++++++++++++++++++++++++++++++++++++ nuttx/lib/stdio/lib_libvsprintf.c | 2 +- 10 files changed, 804 insertions(+), 949 deletions(-) delete mode 100644 nuttx/lib/lib_filesem.c delete mode 100644 nuttx/lib/lib_init.c delete mode 100755 nuttx/lib/lib_libdtoa.c delete mode 100644 nuttx/lib/lib_sem.c delete mode 100644 nuttx/lib/lib_streamsem.c create mode 100644 nuttx/lib/misc/lib_filesem.c create mode 100644 nuttx/lib/misc/lib_init.c create mode 100644 nuttx/lib/misc/lib_streamsem.c create mode 100755 nuttx/lib/stdio/lib_libdtoa.c (limited to 'nuttx/lib') diff --git a/nuttx/lib/lib_filesem.c b/nuttx/lib/lib_filesem.c deleted file mode 100644 index 6d06b613c..000000000 --- a/nuttx/lib/lib_filesem.c +++ /dev/null @@ -1,145 +0,0 @@ -/************************************************************************ - * lib/unistd/lib_filesem.c - * - * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * 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 - -#include -#include -#include -#include -#include - -#include "lib_internal.h" - -#if CONFIG_STDIO_BUFFER_SIZE > 0 - -/************************************************************************ - * Pre-processor Definitions - ************************************************************************/ - -/************************************************************************ - * Private Data - ************************************************************************/ - -/************************************************************************ - * Global Functions - ************************************************************************/ - -/************************************************************************ - * lib_sem_initialize - ************************************************************************/ - -void lib_sem_initialize(FAR struct file_struct *stream) -{ - /* Initialize the LIB semaphore to one (to support one-at- - * a-time access to private data sets. - */ - - (void)sem_init(&stream->fs_sem, 0, 1); - - stream->fs_holder = -1; - stream->fs_counts = 0; -} - -/************************************************************************ - * lib_take_semaphore - ************************************************************************/ - -void lib_take_semaphore(FAR struct file_struct *stream) -{ - pid_t my_pid = getpid(); - - /* Do I already have the semaphore? */ - - if (stream->fs_holder == my_pid) - { - /* Yes, just increment the number of references that I have */ - - stream->fs_counts++; - } - else - { - /* Take the semaphore (perhaps waiting) */ - - while (sem_wait(&stream->fs_sem) != 0) - { - /* The only case that an error should occr here is if - * the wait was awakened by a signal. - */ - - ASSERT(*get_errno_ptr() == EINTR); - } - - /* We have it. Claim the stak and return */ - - stream->fs_holder = my_pid; - stream->fs_counts = 1; - } -} - -/************************************************************************ - * lib_give_semaphore - ************************************************************************/ - -void lib_give_semaphore(FAR struct file_struct *stream) -{ - pid_t my_pid = getpid(); - - /* I better be holding at least one reference to the semaphore */ - - ASSERT(stream->fs_holder == my_pid); - - /* Do I hold multiple references to the semphore */ - - if (stream->fs_counts > 1) - { - /* Yes, just release one count and return */ - - stream->fs_counts--; - } - else - { - /* Nope, this is the last reference I have */ - - stream->fs_holder = -1; - stream->fs_counts = 0; - ASSERT(sem_post(&stream->fs_sem) == 0); - } -} -#endif /* CONFIG_STDIO_BUFFER_SIZE */ diff --git a/nuttx/lib/lib_init.c b/nuttx/lib/lib_init.c deleted file mode 100644 index bd2c6e7ba..000000000 --- a/nuttx/lib/lib_init.c +++ /dev/null @@ -1,203 +0,0 @@ -/************************************************************ - * lib_init.c - * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * 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 -#include -#include -#include -#include -#include -#include "lib_internal.h" - -/************************************************************ - * Definitions - ************************************************************/ - -/************************************************************ - * Private Variables - ************************************************************/ - -/************************************************************ - * Private Functions - ************************************************************/ - -/************************************************************ - * Public Functions - ************************************************************/ - -/************************************************************ - * lib_initialize - ************************************************************/ - -/* General library initialization hook */ - -void weak_const_function lib_initialize(void) -{ -} - -#if CONFIG_NFILE_STREAMS > 0 -/* The following function is called when a new TCB is allocated. It - * creates the streamlist instance that is stored in the TCB. - */ - -FAR struct streamlist *lib_alloclist(void) -{ - FAR struct streamlist *list; - list = (FAR struct streamlist*)kzmalloc(sizeof(struct streamlist)); - if (list) - { - int i; - - /* Start with a reference count of one */ - - list->sl_crefs = 1; - - /* Initialize the list access mutex */ - - (void)sem_init(&list->sl_sem, 0, 1); - - /* Initialize each FILE structure */ - - for (i = 0; i < CONFIG_NFILE_STREAMS; i++) - { - /* Clear the IOB */ - - memset(&list->sl_streams[i], 0, sizeof(FILE)); - - /* Indicate not opened */ - - list->sl_streams[i].fs_filedes = -1; - - /* Initialize the stream semaphore to one to support one-at- - * a-time access to private data sets. - */ - - lib_sem_initialize(&list->sl_streams[i]); - } - } - return list; - -} - -/* This function is called when a TCB is closed (such as with - * pthread_create(). It increases the reference count on the stream - * list. - */ - -void lib_addreflist(FAR struct streamlist *list) -{ - if (list) - { - /* Increment the reference count on the list. - * NOTE: that we disable interrupts to do this - * (vs. taking the list semaphore). We do this - * because file cleanup operations often must be - * done from the IDLE task which cannot wait - * on semaphores. - */ - - register irqstate_t flags = irqsave(); - list->sl_crefs++; - irqrestore(flags); - } -} - -/* this function is called when a TCB is destroyed. Note that is - * does not close the file by release this inode. This happens - * separately when the file descriptor list is freed. - */ - -void lib_releaselist(FAR struct streamlist *list) -{ - int crefs; - if (list) - { - /* Decrement the reference count on the list. - * NOTE: that we disable interrupts to do this - * (vs. taking the list semaphore). We do this - * because file cleanup operations often must be - * done from the IDLE task which cannot wait - * on semaphores. - */ - - register irqstate_t flags = irqsave(); - crefs = --(list->sl_crefs); - irqrestore(flags); - - /* If the count decrements to zero, then there is no reference - * to the structure and it should be deallocated. Since there - * are references, it would be an error if any task still held - * a reference to the list's semaphore. - */ - - if (crefs <= 0) - { -#if CONFIG_STDIO_BUFFER_SIZE > 0 - int i; -#endif - /* Destroy the semaphore and release the filelist */ - - (void)sem_destroy(&list->sl_sem); - - /* Release each stream in the list */ - -#if CONFIG_STDIO_BUFFER_SIZE > 0 - for (i = 0; i < CONFIG_NFILE_STREAMS; i++) - { - /* Destroy the semaphore that protects the IO buffer */ - - (void)sem_destroy(&list->sl_streams[i].fs_sem); - - /* Release the IO buffer */ - if (list->sl_streams[i].fs_bufstart) - { - sched_free(list->sl_streams[i].fs_bufstart); - } - } -#endif - /* Finally, release the list itself */ - - sched_free(list); - } - } -} - -#endif /* CONFIG_NFILE_STREAMS */ - - diff --git a/nuttx/lib/lib_libdtoa.c b/nuttx/lib/lib_libdtoa.c deleted file mode 100755 index 3bfe70aea..000000000 --- a/nuttx/lib/lib_libdtoa.c +++ /dev/null @@ -1,365 +0,0 @@ -/**************************************************************************** - * lib/unistd/lib_libdtoa.c - * - * This file was ported to NuttX by Yolande Cates. - * - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Torek. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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 - ****************************************************************************/ - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -#define MAXEXP 308 - -/**************************************************************************** - * Private Type Declarations - ****************************************************************************/ - -/**************************************************************************** - * Private Function Prototypes - ****************************************************************************/ - -static char* cvt(double value, int ndigits, int flags, char *sign, - int *decpt, int ch, int *length); -static int exponent(char *p0, int exp, int fmtch); - -/**************************************************************************** - * Global Constant Data - ****************************************************************************/ - -/**************************************************************************** - * Global Variables - ****************************************************************************/ - -/**************************************************************************** - * Private Constant Data - ****************************************************************************/ - -/**************************************************************************** - * Private Variables - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: cvt - ****************************************************************************/ - -static char* cvt(double value, int ndigits, int flags, char *sign, - int *decpt, int ch, int *length) -{ - int mode, dsgn; - char *digits, *bp, *rve; - - if (ch == 'f') - { - mode = 3; /* ndigits after the decimal point */ - } - else - { - /* To obtain ndigits after the decimal point for the 'e' and 'E' - * formats, round to ndigits + 1 significant figures. - */ - - if (ch == 'e' || ch == 'E') - { - ndigits++; - } - mode = 2; /* ndigits significant digits */ - } - - if (value < 0) - { - value = -value; - *sign = '-'; - } - else - { - *sign = '\000'; - } - - digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve); - if ((ch != 'g' && ch != 'G') || IS_ALTFORM(flags)) - { - /* Print trailing zeros */ - - bp = digits + ndigits; - if (ch == 'f') - { - if (*digits == '0' && value) - { - *decpt = -ndigits + 1; - } - bp += *decpt; - } - - if (value == 0) - { - /* kludge for __dtoa irregularity */ - - rve = bp; - } - - while (rve < bp) - { - *rve++ = '0'; - } - } - - *length = rve - digits; - return digits; -} - -/**************************************************************************** - * Name: exponent - ****************************************************************************/ - -static int exponent(FAR char *p0, int exp, int fmtch) -{ - FAR char *p; - FAR char *t; - char expbuf[MAXEXP]; - - p = p0; - *p++ = fmtch; - if (exp < 0) - { - exp = -exp; - *p++ = '-'; - } - else - { - *p++ = '+'; - } - - t = expbuf + MAXEXP; - if (exp > 9) - { - do - { - *--t = (exp % 10) + '0'; - } - while ((exp /= 10) > 9); - *--t = exp + '0'; - for (; t < expbuf + MAXEXP; *p++ = *t++); - } - else - { - *p++ = '0'; - *p++ = exp + '0'; - } - return (p - p0); -} - -/**************************************************************************** - * Name: lib_dtoa - * - * Description: - * This is part of lib_vsprintf(). It handles the floating point formats. - * - ****************************************************************************/ - -static void lib_dtoa(FAR struct lib_outstream_s *obj, int ch, int prec, - uint8_t flags, double _double) -{ - FAR char *cp; /* Handy char pointer (short term usage) */ - FAR char *cp_free = NULL; /* BIONIC: copy of cp to be freed after usage */ - char expstr[7]; /* Buffer for exponent string */ - char sign; /* Temporary negative sign for floats */ - int expt; /* Integer value of exponent */ - int expsize = 0; /* Character count for expstr */ - int ndig; /* Actual number of digits returned by cvt */ - int size; /* Size of converted field or string */ - int i; - - cp = cvt(_double, prec, flags, &sign, &expt, ch, &ndig); - cp_free = cp; - - if (ch == 'g' || ch == 'G') - { - /* 'g' or 'G' fmt */ - - if (expt <= -4 || expt > prec) - { - ch = (ch == 'g') ? 'e' : 'E'; - } - else - { - ch = 'g'; - } - } - - if (ch <= 'e') - { - /* 'e' or 'E' fmt */ - - --expt; - expsize = exponent(expstr, expt, ch); - size = expsize + ndig; - if (ndig > 1 || IS_ALTFORM(flags)) - { - ++size; - } - } - else if (ch == 'f') - { - /* f fmt */ - - if (expt > 0) - { - size = expt; - if (prec || IS_ALTFORM(flags)) - { - size += prec + 1; - } - } - else /* "0.X" */ - { - size = prec + 2; - } - } - else if (expt >= ndig) - { - /* fixed g fmt */ - - size = expt; - if (IS_ALTFORM(flags)) - { - ++size; - } - } - else - { - size = ndig + (expt > 0 ? 1 : 2 - expt); - } - - if (sign) - { - obj->put(obj, '-'); - } - - if (_double == 0) - { - /* kludge for __dtoa irregularity */ - - obj->put(obj, '0'); - if (expt < ndig || IS_ALTFORM(flags)) - { - obj->put(obj, '.'); - - i = ndig - 1; - while (i > 0) - { - obj->put(obj, '0'); - i--; - } - } - } - else if (expt <= 0) - { - obj->put(obj, '0'); - obj->put(obj, '.'); - - i = ndig; - while (i > 0) - { - obj->put(obj, *cp); - i--; - cp++; - } - } - else if (expt >= ndig) - { - i = ndig; - while (i > 0) - { - obj->put(obj, *cp); - i--; - cp++; - } - - i = expt - ndig; - while (i > 0) - { - obj->put(obj, '0'); - i--; - } - - if (IS_ALTFORM(flags)) - { - obj->put(obj, '.'); - } - } - else - { - /* print the integer */ - - i = expt; - while (i > 0) - { - obj->put(obj, *cp); - i--; - cp++; - } - - /* print the decimal place */ - - obj->put(obj, '.'); - - /* print the decimal */ - - i = ndig - expt; - while (i > 0) - { - obj->put(obj, *cp); - i--; - cp++; - } - } -} - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - diff --git a/nuttx/lib/lib_sem.c b/nuttx/lib/lib_sem.c deleted file mode 100644 index 4884950e9..000000000 --- a/nuttx/lib/lib_sem.c +++ /dev/null @@ -1,145 +0,0 @@ -/************************************************************ - * lib/unistd/lib_sem.c - * - * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * 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 - -#ifdef CONFIG_STDIO_BUFFERED_IO - -#include -#include -#include -#include -#include - -#include "lib_internal.h" - -/************************************************************ - * Pre-processor Definitions - ************************************************************/ - -/************************************************************ - * Private Data - ************************************************************/ - -/************************************************************ - * Global Functions - ************************************************************/ - -/************************************************************ - * lib_sem_initialize - ************************************************************/ - -void lib_sem_initialize(FILE *stream) -{ - /* Initialize the LIB semaphore to one (to support one-at- - * a-time access to private data sets. - */ - - (void)sem_init(&stream->sem, 0, 1); - - stream->holder = -1; - stream->counts = 0; -} - -/************************************************************ - * lib_take_semaphore - ************************************************************/ - -void lib_take_semaphore(FILE *stream) -{ - pid_t my_pid = getpid(); - - /* Do I already have the semaphore? */ - - if (stream->holder == my_pid) - { - /* Yes, just increment the number of references that I have */ - - stream->counts++; - } - else - { - /* Take the semaphore (perhaps waiting) */ - - while (sem_wait(&stream->sem) != 0) - { - /* The only case that an error should occr here is if - * the wait was awakened by a signal. - */ - - ASSERT(*get_errno_ptr() == EINTR); - } - - /* We have it. Stake the claim and return */ - - stream->holder = my_pid; - stream->counts = 1; - } -} - -/************************************************************ - * lib_give_semaphore - ************************************************************/ - -void lib_give_semaphore(FILE *stream) -{ - pid_t my_pid = getpid(); - - /* I better be holding at least one count on the semaphore */ - - ASSERT(stream->holder == my_pid); - - /* Do I hold multiple references to the semphore */ - - if (stream->counts > 1) - { - /* Yes, just release one count and return */ - - stream->counts--; - } - else - { - /* Nope, this is the last reference I have */ - - stream->holder = -1; - stream->counts = 0; - ASSERT(sem_post(&stream->sem) == 0); - } -} -#endif /* CONFIG_STDIO_BUFFERED_IO */ diff --git a/nuttx/lib/lib_streamsem.c b/nuttx/lib/lib_streamsem.c deleted file mode 100644 index 81da6dcc8..000000000 --- a/nuttx/lib/lib_streamsem.c +++ /dev/null @@ -1,90 +0,0 @@ -/************************************************************************ - * lib/unistd/lib_streamsem.c - * - * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * 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 - -#include -#include -#include -#include -#include -#include - -#include "lib_internal.h" - -/************************************************************************ - * Private types - ************************************************************************/ - -/************************************************************************ - * Private Variables - ************************************************************************/ - -/************************************************************************ - * Public Variables - ************************************************************************/ - -/************************************************************************ - * Private Functions - ************************************************************************/ - -/************************************************************************ - * Public Functions - ************************************************************************/ - -void stream_semtake(FAR struct streamlist *list) -{ - /* Take the semaphore (perhaps waiting) */ - - while (sem_wait(&list->sl_sem) != 0) - { - /* The only case that an error should occr here is if - * the wait was awakened by a signal. - */ - - ASSERT(*get_errno_ptr() == EINTR); - } -} - -void stream_semgive(FAR struct streamlist *list) -{ - sem_post(&list->sl_sem); -} - - diff --git a/nuttx/lib/misc/lib_filesem.c b/nuttx/lib/misc/lib_filesem.c new file mode 100644 index 000000000..1f2f80b3c --- /dev/null +++ b/nuttx/lib/misc/lib_filesem.c @@ -0,0 +1,145 @@ +/************************************************************************ + * lib/misc/lib_filesem.c + * + * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include +#include +#include +#include + +#include "lib_internal.h" + +#if CONFIG_STDIO_BUFFER_SIZE > 0 + +/************************************************************************ + * Pre-processor Definitions + ************************************************************************/ + +/************************************************************************ + * Private Data + ************************************************************************/ + +/************************************************************************ + * Global Functions + ************************************************************************/ + +/************************************************************************ + * lib_sem_initialize + ************************************************************************/ + +void lib_sem_initialize(FAR struct file_struct *stream) +{ + /* Initialize the LIB semaphore to one (to support one-at- + * a-time access to private data sets. + */ + + (void)sem_init(&stream->fs_sem, 0, 1); + + stream->fs_holder = -1; + stream->fs_counts = 0; +} + +/************************************************************************ + * lib_take_semaphore + ************************************************************************/ + +void lib_take_semaphore(FAR struct file_struct *stream) +{ + pid_t my_pid = getpid(); + + /* Do I already have the semaphore? */ + + if (stream->fs_holder == my_pid) + { + /* Yes, just increment the number of references that I have */ + + stream->fs_counts++; + } + else + { + /* Take the semaphore (perhaps waiting) */ + + while (sem_wait(&stream->fs_sem) != 0) + { + /* The only case that an error should occr here is if + * the wait was awakened by a signal. + */ + + ASSERT(*get_errno_ptr() == EINTR); + } + + /* We have it. Claim the stak and return */ + + stream->fs_holder = my_pid; + stream->fs_counts = 1; + } +} + +/************************************************************************ + * lib_give_semaphore + ************************************************************************/ + +void lib_give_semaphore(FAR struct file_struct *stream) +{ + pid_t my_pid = getpid(); + + /* I better be holding at least one reference to the semaphore */ + + ASSERT(stream->fs_holder == my_pid); + + /* Do I hold multiple references to the semphore */ + + if (stream->fs_counts > 1) + { + /* Yes, just release one count and return */ + + stream->fs_counts--; + } + else + { + /* Nope, this is the last reference I have */ + + stream->fs_holder = -1; + stream->fs_counts = 0; + ASSERT(sem_post(&stream->fs_sem) == 0); + } +} +#endif /* CONFIG_STDIO_BUFFER_SIZE */ diff --git a/nuttx/lib/misc/lib_init.c b/nuttx/lib/misc/lib_init.c new file mode 100644 index 000000000..bd2c6e7ba --- /dev/null +++ b/nuttx/lib/misc/lib_init.c @@ -0,0 +1,203 @@ +/************************************************************ + * lib_init.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 +#include +#include +#include +#include +#include +#include "lib_internal.h" + +/************************************************************ + * Definitions + ************************************************************/ + +/************************************************************ + * Private Variables + ************************************************************/ + +/************************************************************ + * Private Functions + ************************************************************/ + +/************************************************************ + * Public Functions + ************************************************************/ + +/************************************************************ + * lib_initialize + ************************************************************/ + +/* General library initialization hook */ + +void weak_const_function lib_initialize(void) +{ +} + +#if CONFIG_NFILE_STREAMS > 0 +/* The following function is called when a new TCB is allocated. It + * creates the streamlist instance that is stored in the TCB. + */ + +FAR struct streamlist *lib_alloclist(void) +{ + FAR struct streamlist *list; + list = (FAR struct streamlist*)kzmalloc(sizeof(struct streamlist)); + if (list) + { + int i; + + /* Start with a reference count of one */ + + list->sl_crefs = 1; + + /* Initialize the list access mutex */ + + (void)sem_init(&list->sl_sem, 0, 1); + + /* Initialize each FILE structure */ + + for (i = 0; i < CONFIG_NFILE_STREAMS; i++) + { + /* Clear the IOB */ + + memset(&list->sl_streams[i], 0, sizeof(FILE)); + + /* Indicate not opened */ + + list->sl_streams[i].fs_filedes = -1; + + /* Initialize the stream semaphore to one to support one-at- + * a-time access to private data sets. + */ + + lib_sem_initialize(&list->sl_streams[i]); + } + } + return list; + +} + +/* This function is called when a TCB is closed (such as with + * pthread_create(). It increases the reference count on the stream + * list. + */ + +void lib_addreflist(FAR struct streamlist *list) +{ + if (list) + { + /* Increment the reference count on the list. + * NOTE: that we disable interrupts to do this + * (vs. taking the list semaphore). We do this + * because file cleanup operations often must be + * done from the IDLE task which cannot wait + * on semaphores. + */ + + register irqstate_t flags = irqsave(); + list->sl_crefs++; + irqrestore(flags); + } +} + +/* this function is called when a TCB is destroyed. Note that is + * does not close the file by release this inode. This happens + * separately when the file descriptor list is freed. + */ + +void lib_releaselist(FAR struct streamlist *list) +{ + int crefs; + if (list) + { + /* Decrement the reference count on the list. + * NOTE: that we disable interrupts to do this + * (vs. taking the list semaphore). We do this + * because file cleanup operations often must be + * done from the IDLE task which cannot wait + * on semaphores. + */ + + register irqstate_t flags = irqsave(); + crefs = --(list->sl_crefs); + irqrestore(flags); + + /* If the count decrements to zero, then there is no reference + * to the structure and it should be deallocated. Since there + * are references, it would be an error if any task still held + * a reference to the list's semaphore. + */ + + if (crefs <= 0) + { +#if CONFIG_STDIO_BUFFER_SIZE > 0 + int i; +#endif + /* Destroy the semaphore and release the filelist */ + + (void)sem_destroy(&list->sl_sem); + + /* Release each stream in the list */ + +#if CONFIG_STDIO_BUFFER_SIZE > 0 + for (i = 0; i < CONFIG_NFILE_STREAMS; i++) + { + /* Destroy the semaphore that protects the IO buffer */ + + (void)sem_destroy(&list->sl_streams[i].fs_sem); + + /* Release the IO buffer */ + if (list->sl_streams[i].fs_bufstart) + { + sched_free(list->sl_streams[i].fs_bufstart); + } + } +#endif + /* Finally, release the list itself */ + + sched_free(list); + } + } +} + +#endif /* CONFIG_NFILE_STREAMS */ + + diff --git a/nuttx/lib/misc/lib_streamsem.c b/nuttx/lib/misc/lib_streamsem.c new file mode 100644 index 000000000..5ab4135bb --- /dev/null +++ b/nuttx/lib/misc/lib_streamsem.c @@ -0,0 +1,90 @@ +/************************************************************************ + * lib/misc/lib_streamsem.c + * + * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include +#include +#include +#include +#include + +#include "lib_internal.h" + +/************************************************************************ + * Private types + ************************************************************************/ + +/************************************************************************ + * Private Variables + ************************************************************************/ + +/************************************************************************ + * Public Variables + ************************************************************************/ + +/************************************************************************ + * Private Functions + ************************************************************************/ + +/************************************************************************ + * Public Functions + ************************************************************************/ + +void stream_semtake(FAR struct streamlist *list) +{ + /* Take the semaphore (perhaps waiting) */ + + while (sem_wait(&list->sl_sem) != 0) + { + /* The only case that an error should occr here is if + * the wait was awakened by a signal. + */ + + ASSERT(*get_errno_ptr() == EINTR); + } +} + +void stream_semgive(FAR struct streamlist *list) +{ + sem_post(&list->sl_sem); +} + + diff --git a/nuttx/lib/stdio/lib_libdtoa.c b/nuttx/lib/stdio/lib_libdtoa.c new file mode 100755 index 000000000..3bfe70aea --- /dev/null +++ b/nuttx/lib/stdio/lib_libdtoa.c @@ -0,0 +1,365 @@ +/**************************************************************************** + * lib/unistd/lib_libdtoa.c + * + * This file was ported to NuttX by Yolande Cates. + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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 + ****************************************************************************/ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define MAXEXP 308 + +/**************************************************************************** + * Private Type Declarations + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static char* cvt(double value, int ndigits, int flags, char *sign, + int *decpt, int ch, int *length); +static int exponent(char *p0, int exp, int fmtch); + +/**************************************************************************** + * Global Constant Data + ****************************************************************************/ + +/**************************************************************************** + * Global Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Constant Data + ****************************************************************************/ + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cvt + ****************************************************************************/ + +static char* cvt(double value, int ndigits, int flags, char *sign, + int *decpt, int ch, int *length) +{ + int mode, dsgn; + char *digits, *bp, *rve; + + if (ch == 'f') + { + mode = 3; /* ndigits after the decimal point */ + } + else + { + /* To obtain ndigits after the decimal point for the 'e' and 'E' + * formats, round to ndigits + 1 significant figures. + */ + + if (ch == 'e' || ch == 'E') + { + ndigits++; + } + mode = 2; /* ndigits significant digits */ + } + + if (value < 0) + { + value = -value; + *sign = '-'; + } + else + { + *sign = '\000'; + } + + digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve); + if ((ch != 'g' && ch != 'G') || IS_ALTFORM(flags)) + { + /* Print trailing zeros */ + + bp = digits + ndigits; + if (ch == 'f') + { + if (*digits == '0' && value) + { + *decpt = -ndigits + 1; + } + bp += *decpt; + } + + if (value == 0) + { + /* kludge for __dtoa irregularity */ + + rve = bp; + } + + while (rve < bp) + { + *rve++ = '0'; + } + } + + *length = rve - digits; + return digits; +} + +/**************************************************************************** + * Name: exponent + ****************************************************************************/ + +static int exponent(FAR char *p0, int exp, int fmtch) +{ + FAR char *p; + FAR char *t; + char expbuf[MAXEXP]; + + p = p0; + *p++ = fmtch; + if (exp < 0) + { + exp = -exp; + *p++ = '-'; + } + else + { + *p++ = '+'; + } + + t = expbuf + MAXEXP; + if (exp > 9) + { + do + { + *--t = (exp % 10) + '0'; + } + while ((exp /= 10) > 9); + *--t = exp + '0'; + for (; t < expbuf + MAXEXP; *p++ = *t++); + } + else + { + *p++ = '0'; + *p++ = exp + '0'; + } + return (p - p0); +} + +/**************************************************************************** + * Name: lib_dtoa + * + * Description: + * This is part of lib_vsprintf(). It handles the floating point formats. + * + ****************************************************************************/ + +static void lib_dtoa(FAR struct lib_outstream_s *obj, int ch, int prec, + uint8_t flags, double _double) +{ + FAR char *cp; /* Handy char pointer (short term usage) */ + FAR char *cp_free = NULL; /* BIONIC: copy of cp to be freed after usage */ + char expstr[7]; /* Buffer for exponent string */ + char sign; /* Temporary negative sign for floats */ + int expt; /* Integer value of exponent */ + int expsize = 0; /* Character count for expstr */ + int ndig; /* Actual number of digits returned by cvt */ + int size; /* Size of converted field or string */ + int i; + + cp = cvt(_double, prec, flags, &sign, &expt, ch, &ndig); + cp_free = cp; + + if (ch == 'g' || ch == 'G') + { + /* 'g' or 'G' fmt */ + + if (expt <= -4 || expt > prec) + { + ch = (ch == 'g') ? 'e' : 'E'; + } + else + { + ch = 'g'; + } + } + + if (ch <= 'e') + { + /* 'e' or 'E' fmt */ + + --expt; + expsize = exponent(expstr, expt, ch); + size = expsize + ndig; + if (ndig > 1 || IS_ALTFORM(flags)) + { + ++size; + } + } + else if (ch == 'f') + { + /* f fmt */ + + if (expt > 0) + { + size = expt; + if (prec || IS_ALTFORM(flags)) + { + size += prec + 1; + } + } + else /* "0.X" */ + { + size = prec + 2; + } + } + else if (expt >= ndig) + { + /* fixed g fmt */ + + size = expt; + if (IS_ALTFORM(flags)) + { + ++size; + } + } + else + { + size = ndig + (expt > 0 ? 1 : 2 - expt); + } + + if (sign) + { + obj->put(obj, '-'); + } + + if (_double == 0) + { + /* kludge for __dtoa irregularity */ + + obj->put(obj, '0'); + if (expt < ndig || IS_ALTFORM(flags)) + { + obj->put(obj, '.'); + + i = ndig - 1; + while (i > 0) + { + obj->put(obj, '0'); + i--; + } + } + } + else if (expt <= 0) + { + obj->put(obj, '0'); + obj->put(obj, '.'); + + i = ndig; + while (i > 0) + { + obj->put(obj, *cp); + i--; + cp++; + } + } + else if (expt >= ndig) + { + i = ndig; + while (i > 0) + { + obj->put(obj, *cp); + i--; + cp++; + } + + i = expt - ndig; + while (i > 0) + { + obj->put(obj, '0'); + i--; + } + + if (IS_ALTFORM(flags)) + { + obj->put(obj, '.'); + } + } + else + { + /* print the integer */ + + i = expt; + while (i > 0) + { + obj->put(obj, *cp); + i--; + cp++; + } + + /* print the decimal place */ + + obj->put(obj, '.'); + + /* print the decimal */ + + i = ndig - expt; + while (i > 0) + { + obj->put(obj, *cp); + i--; + cp++; + } + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + diff --git a/nuttx/lib/stdio/lib_libvsprintf.c b/nuttx/lib/stdio/lib_libvsprintf.c index b3b9e41e6..24591d875 100644 --- a/nuttx/lib/stdio/lib_libvsprintf.c +++ b/nuttx/lib/stdio/lib_libvsprintf.c @@ -189,7 +189,7 @@ static const char g_nullstring[] = "(null)"; /* Include floating point functions */ #ifdef CONFIG_LIBC_FLOATINGPOINT -# include "lib_libdtoa.c" +# include "stdio/lib_libdtoa.c" #endif /**************************************************************************** -- cgit v1.2.3