libs/libc/stdio: Add newlib-nano fprintf as an option. This fprintf code was originally adapted from AVR libc and provides improved floating point output support, including 'g' mode and making 'f' mode include digits past the decimal by default. However, this version does not have any long long support. On a demonstration cortex M4 build, this version saves about 5kB of ROM. The newlib version can be found here: https://salsa.debian.org/electronics-team/toolchains/newlib-nano . That project is GPL overall, but the newlib-nano printf portions are BSD licensed as described in the COPYING.NEWLIB file.
This commit is contained in:
parent
508f4666b2
commit
e05149b745
@ -108,4 +108,26 @@ config MEMCPY_VIK
|
||||
Select this option for improved performance at the expense of increased
|
||||
size. See licensing information in the top-level COPYING file.
|
||||
|
||||
config NANO_PRINTF
|
||||
bool "Use nano printf code"
|
||||
default n
|
||||
---help---
|
||||
Replace printf code with version from newlib-nano. This version
|
||||
provides improved floating point output support, including 'g' mode
|
||||
as well as making the default 'f' format include digits past the
|
||||
decimal point. However, it does not include 'long long' support.
|
||||
|
||||
config NANO_PRINTLEVEL
|
||||
int "Nano printf support level"
|
||||
default 2
|
||||
range 1 2 if !LIBC_FLOATINGPOINT
|
||||
range 1 3 if LIBC_FLOATINGPOINT
|
||||
depends on NANO_PRINTF
|
||||
---help---
|
||||
Nano printf can be built into more than one support level. The
|
||||
default is to offer the usual modifiers and integer formatting
|
||||
support (level 2). Level 1 maintains a minimal version that just
|
||||
offers integer formatting, but no modifier support whatsoever.
|
||||
Level 3 is intented for floating point support.
|
||||
|
||||
endmenu #Standard C I/O
|
||||
|
@ -39,12 +39,28 @@
|
||||
|
||||
CSRCS += lib_fileno.c lib_printf.c lib_sprintf.c lib_asprintf.c
|
||||
CSRCS += lib_snprintf.c lib_libsprintf.c lib_vsprintf.c lib_vasprintf.c
|
||||
CSRCS += lib_vsnprintf.c lib_libvsprintf.c lib_dprintf.c lib_vdprintf.c
|
||||
CSRCS += lib_vsnprintf.c lib_dprintf.c lib_vdprintf.c
|
||||
CSRCS += lib_meminstream.c lib_memoutstream.c lib_memsistream.c
|
||||
CSRCS += lib_memsostream.c lib_lowoutstream.c
|
||||
CSRCS += lib_zeroinstream.c lib_nullinstream.c lib_nulloutstream.c
|
||||
CSRCS += lib_sscanf.c lib_libnoflush.c lib_libsnoflush.c
|
||||
|
||||
ifeq ($(CONFIG_NANO_PRINTF),y)
|
||||
|
||||
CSRCS += nano_libvsprintf.c nano_ultoa_invert.c
|
||||
|
||||
ifeq ($(CONFIG_NANO_PRINTLEVEL),3)
|
||||
|
||||
CSRCS += nano_dtoa_engine.c nano_dtoa_data.c
|
||||
|
||||
endif
|
||||
|
||||
else
|
||||
|
||||
CSRCS += lib_libvsprintf.c
|
||||
|
||||
endif
|
||||
|
||||
# The remaining sources files depend upon file descriptors
|
||||
|
||||
ifneq ($(CONFIG_NFILE_DESCRIPTORS),0)
|
||||
|
276
libs/libc/stdio/nano_dtoa_data.c
Normal file
276
libs/libc/stdio/nano_dtoa_data.c
Normal file
@ -0,0 +1,276 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/stdio/nano_dtoa_data.c
|
||||
*
|
||||
* Copyright © 2018, Keith Packard
|
||||
* 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.
|
||||
* 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 "nano_dtoa_engine.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef DBL_MAX_10_EXP
|
||||
# error DBL_MAX_10_EXP
|
||||
#endif
|
||||
|
||||
#ifndef DBL_MIN_10_EXP
|
||||
# error DBL_MIN_10_EXP
|
||||
#endif
|
||||
|
||||
#ifndef DBL_DIG
|
||||
# error DBL_DIG
|
||||
#endif
|
||||
|
||||
/* Make sure the computed sizes of the arrays match the actual sizes
|
||||
* by declaring an array which is legal if the sizes match and illegal
|
||||
* if they do not
|
||||
*/
|
||||
|
||||
#define count_of(n) (sizeof (n) / sizeof (n[0]))
|
||||
#define match(array,size) (count_of(array) == size)
|
||||
#define check_match(array,size) (match(array, size) ? 1 : -1)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
const double __dtoa_scale_up[] =
|
||||
{
|
||||
#if DBL_MAX_10_EXP >= 1
|
||||
1e1,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 2
|
||||
1e2,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 4
|
||||
1e4,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 8
|
||||
1e8,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 16
|
||||
1e16,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 32
|
||||
1e32,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 64
|
||||
1e64,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 128
|
||||
1e128,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 256
|
||||
1e256,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 512
|
||||
1e512,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 1024
|
||||
1e1024,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 2048
|
||||
1e2048,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 4096
|
||||
1e4096,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 8192
|
||||
1e8192,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 16384
|
||||
1e16384,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 32768
|
||||
1e32768,
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 65536
|
||||
1e65536,
|
||||
#endif
|
||||
};
|
||||
|
||||
const double __dtoa_scale_down[] =
|
||||
{
|
||||
#if DBL_MIN_10_EXP <= -1
|
||||
1e-1,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -2
|
||||
1e-2,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -4
|
||||
1e-4,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -8
|
||||
1e-8,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -16
|
||||
1e-16,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -32
|
||||
1e-32,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -64
|
||||
1e-64,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -128
|
||||
1e-128,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -256
|
||||
1e-256,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -512
|
||||
1e-512,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -1024
|
||||
1e-1024,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -2048
|
||||
1e-2048,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -4096
|
||||
1e-4096,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -8192
|
||||
1e-8192,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -16384
|
||||
1e-16384,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -32768
|
||||
1e-32768,
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -65536
|
||||
1e-65536,
|
||||
#endif
|
||||
};
|
||||
|
||||
const double __dtoa_round[] =
|
||||
{
|
||||
#if DBL_DIG >= 30
|
||||
5e30,
|
||||
#endif
|
||||
#if DBL_DIG >= 29
|
||||
5e29,
|
||||
#endif
|
||||
#if DBL_DIG >= 28
|
||||
5e28,
|
||||
#endif
|
||||
#if DBL_DIG >= 27
|
||||
5e27,
|
||||
#endif
|
||||
#if DBL_DIG >= 26
|
||||
5e26,
|
||||
#endif
|
||||
#if DBL_DIG >= 25
|
||||
5e25,
|
||||
#endif
|
||||
#if DBL_DIG >= 24
|
||||
5e24,
|
||||
#endif
|
||||
#if DBL_DIG >= 23
|
||||
5e23,
|
||||
#endif
|
||||
#if DBL_DIG >= 22
|
||||
5e22,
|
||||
#endif
|
||||
#if DBL_DIG >= 21
|
||||
5e21,
|
||||
#endif
|
||||
#if DBL_DIG >= 20
|
||||
5e20,
|
||||
#endif
|
||||
#if DBL_DIG >= 19
|
||||
5e19,
|
||||
#endif
|
||||
#if DBL_DIG >= 18
|
||||
5e18,
|
||||
#endif
|
||||
#if DBL_DIG >= 17
|
||||
5e17,
|
||||
#endif
|
||||
#if DBL_DIG >= 16
|
||||
5e16,
|
||||
#endif
|
||||
#if DBL_DIG >= 15
|
||||
5e15,
|
||||
#endif
|
||||
#if DBL_DIG >= 14
|
||||
5e14,
|
||||
#endif
|
||||
#if DBL_DIG >= 13
|
||||
5e13,
|
||||
#endif
|
||||
#if DBL_DIG >= 12
|
||||
5e12,
|
||||
#endif
|
||||
#if DBL_DIG >= 11
|
||||
5e11,
|
||||
#endif
|
||||
#if DBL_DIG >= 10
|
||||
5e10,
|
||||
#endif
|
||||
#if DBL_DIG >= 9
|
||||
5e9,
|
||||
#endif
|
||||
#if DBL_DIG >= 8
|
||||
5e8,
|
||||
#endif
|
||||
#if DBL_DIG >= 7
|
||||
5e7,
|
||||
#endif
|
||||
#if DBL_DIG >= 6
|
||||
5e6,
|
||||
#endif
|
||||
#if DBL_DIG >= 5
|
||||
5e5,
|
||||
#endif
|
||||
#if DBL_DIG >= 4
|
||||
5e4,
|
||||
#endif
|
||||
#if DBL_DIG >= 3
|
||||
5e3,
|
||||
#endif
|
||||
#if DBL_DIG >= 2
|
||||
5e2,
|
||||
#endif
|
||||
#if DBL_DIG >= 1
|
||||
5e1,
|
||||
#endif
|
||||
#if DBL_DIG >= 0
|
||||
5e0,
|
||||
#endif
|
||||
};
|
169
libs/libc/stdio/nano_dtoa_engine.c
Normal file
169
libs/libc/stdio/nano_dtoa_engine.c
Normal file
@ -0,0 +1,169 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/stdio/nanoo_dtoa_engine.c
|
||||
*
|
||||
* Copyright © 2018, Keith Packard
|
||||
* 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.
|
||||
* 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 <math.h>
|
||||
|
||||
#include "nano_dtoa_engine.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* A bit of CPP trickery -- construct the floating-point value 10 ** DBL_DIG
|
||||
* by pasting the value of DBL_DIG onto '1e' to
|
||||
*/
|
||||
|
||||
#define PASTE(a) 1e##a
|
||||
#define SUBSTITUTE(a) PASTE(a)
|
||||
#define MIN_MANT (SUBSTITUTE(DBL_DIG))
|
||||
#define MAX_MANT (10.0 * MIN_MANT)
|
||||
#define MIN_MANT_INT ((uint64_t)MIN_MANT)
|
||||
#define MIN_MANT_EXP DBL_DIG
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
int __dtoa_engine(double x, FAR struct dtoa *dtoa, int max_digits,
|
||||
int max_decimals)
|
||||
{
|
||||
int32_t exp = 0;
|
||||
uint8_t flags = 0;
|
||||
int i;
|
||||
|
||||
if (__builtin_signbit(x))
|
||||
{
|
||||
flags |= DTOA_MINUS;
|
||||
x = -x;
|
||||
}
|
||||
|
||||
if (x == 0)
|
||||
{
|
||||
flags |= DTOA_ZERO;
|
||||
for (i = 0; i < max_digits; i++)
|
||||
dtoa->digits[i] = '0';
|
||||
}
|
||||
else if (isnan(x))
|
||||
{
|
||||
flags |= DTOA_NAN;
|
||||
}
|
||||
else if (isinf(x))
|
||||
{
|
||||
flags |= DTOA_INF;
|
||||
}
|
||||
else
|
||||
{
|
||||
double y;
|
||||
|
||||
exp = MIN_MANT_EXP;
|
||||
|
||||
/* Bring x within range MIN_MANT <= x < MAX_MANT while computing
|
||||
* exponent value
|
||||
*/
|
||||
|
||||
if (x < MIN_MANT)
|
||||
{
|
||||
for (i = DTOA_SCALE_UP_NUM - 1; i >= 0; i--)
|
||||
{
|
||||
y = x * __dtoa_scale_up[i];
|
||||
if (y < MAX_MANT)
|
||||
{
|
||||
x = y;
|
||||
exp -= (1 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = DTOA_SCALE_DOWN_NUM - 1; i >= 0; i--)
|
||||
{
|
||||
y = x * __dtoa_scale_down[i];
|
||||
if (y >= MIN_MANT)
|
||||
{
|
||||
x = y;
|
||||
exp += (1 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If limiting decimals, then limit the max digits to no more than the
|
||||
* number of digits left of the decimal plus the number of digits right
|
||||
* of the decimal
|
||||
*/
|
||||
|
||||
if (max_decimals != 0)
|
||||
{
|
||||
max_digits = MIN(max_digits, max_decimals + MAX(exp + 1, 1));
|
||||
}
|
||||
|
||||
/* Round nearest by adding 1/2 of the last digit before converting to
|
||||
* int. Check for overflow and adjust mantissa and exponent values
|
||||
*/
|
||||
|
||||
x = x + __dtoa_round[max_digits];
|
||||
|
||||
if (x >= MAX_MANT)
|
||||
{
|
||||
x /= 10.0;
|
||||
exp++;
|
||||
}
|
||||
|
||||
/* Now convert mantissa to decimal. */
|
||||
|
||||
uint64_t mant = (uint64_t) x;
|
||||
uint64_t decimal = MIN_MANT_INT;
|
||||
|
||||
/* Compute digits */
|
||||
|
||||
for (i = 0; i < max_digits; i++)
|
||||
{
|
||||
dtoa->digits[i] = mant / decimal + '0';
|
||||
mant %= decimal;
|
||||
decimal /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
dtoa->digits[max_digits] = '\0';
|
||||
dtoa->flags = flags;
|
||||
dtoa->exp = exp;
|
||||
return max_digits;
|
||||
}
|
189
libs/libc/stdio/nano_dtoa_engine.h
Normal file
189
libs/libc/stdio/nano_dtoa_engine.h
Normal file
@ -0,0 +1,189 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/stdio/nano_dtoa_engine.h
|
||||
*
|
||||
* Copyright © 2018, Keith Packard
|
||||
* 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.
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __LIBS_LIBC_STDIO_NANO_DTOA_ENGINE_H
|
||||
#define __LIBS_LIBC_STDIO_NANO_DTOA_ENGINE_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <float.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define DTOA_MAX_DIG DBL_DIG
|
||||
|
||||
#define DTOA_MINUS 1
|
||||
#define DTOA_ZERO 2
|
||||
#define DTOA_INF 4
|
||||
#define DTOA_NAN 8
|
||||
#define DTOA_CARRY 16 /* Carry was to master position. */
|
||||
|
||||
#if DBL_MAX_10_EXP >= 1 && DBL_MAX_10_EXP < 2
|
||||
# define DTOA_SCALE_UP_NUM 1
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 2 && DBL_MAX_10_EXP < 4
|
||||
# define DTOA_SCALE_UP_NUM 2
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 4 && DBL_MAX_10_EXP < 8
|
||||
# define DTOA_SCALE_UP_NUM 3
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 8 && DBL_MAX_10_EXP < 16
|
||||
# define DTOA_SCALE_UP_NUM 4
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 16 && DBL_MAX_10_EXP < 32
|
||||
# define DTOA_SCALE_UP_NUM 5
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 32 && DBL_MAX_10_EXP < 64
|
||||
# define DTOA_SCALE_UP_NUM 6
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 64 && DBL_MAX_10_EXP < 128
|
||||
# define DTOA_SCALE_UP_NUM 7
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 128 && DBL_MAX_10_EXP < 256
|
||||
# define DTOA_SCALE_UP_NUM 8
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 256 && DBL_MAX_10_EXP < 512
|
||||
# define DTOA_SCALE_UP_NUM 9
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 512 && DBL_MAX_10_EXP < 1024
|
||||
# define DTOA_SCALE_UP_NUM 10
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 1024 && DBL_MAX_10_EXP < 2048
|
||||
# define DTOA_SCALE_UP_NUM 11
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 2048 && DBL_MAX_10_EXP < 4096
|
||||
# define DTOA_SCALE_UP_NUM 12
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 4096 && DBL_MAX_10_EXP < 8192
|
||||
# define DTOA_SCALE_UP_NUM 13
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 8192 && DBL_MAX_10_EXP < 16384
|
||||
# define DTOA_SCALE_UP_NUM 14
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 16384 && DBL_MAX_10_EXP < 32768
|
||||
# define DTOA_SCALE_UP_NUM 15
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 32768 && DBL_MAX_10_EXP < 65536
|
||||
# define DTOA_SCALE_UP_NUM 16
|
||||
#endif
|
||||
#if DBL_MAX_10_EXP >= 65536 && DBL_MAX_10_EXP < 131072
|
||||
# define DTOA_SCALE_UP_NUM 17
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -1 && DBL_MIN_10_EXP > -2
|
||||
# define DTOA_SCALE_DOWN_NUM 1
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -2 && DBL_MIN_10_EXP > -4
|
||||
# define DTOA_SCALE_DOWN_NUM 2
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -4 && DBL_MIN_10_EXP > -8
|
||||
# define DTOA_SCALE_DOWN_NUM 3
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -8 && DBL_MIN_10_EXP > -16
|
||||
# define DTOA_SCALE_DOWN_NUM 4
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -16 && DBL_MIN_10_EXP > -32
|
||||
# define DTOA_SCALE_DOWN_NUM 5
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -32 && DBL_MIN_10_EXP > -64
|
||||
# define DTOA_SCALE_DOWN_NUM 6
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -64 && DBL_MIN_10_EXP > -128
|
||||
# define DTOA_SCALE_DOWN_NUM 7
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -128 && DBL_MIN_10_EXP > -256
|
||||
# define DTOA_SCALE_DOWN_NUM 8
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -256 && DBL_MIN_10_EXP > -512
|
||||
# define DTOA_SCALE_DOWN_NUM 9
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -512 && DBL_MIN_10_EXP > -1024
|
||||
# define DTOA_SCALE_DOWN_NUM 10
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -1024 && DBL_MIN_10_EXP > -2048
|
||||
# define DTOA_SCALE_DOWN_NUM 11
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -2048 && DBL_MIN_10_EXP > -4096
|
||||
# define DTOA_SCALE_DOWN_NUM 12
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -4096 && DBL_MIN_10_EXP > -8192
|
||||
# define DTOA_SCALE_DOWN_NUM 13
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -8192 && DBL_MIN_10_EXP > -16384
|
||||
# define DTOA_SCALE_DOWN_NUM 14
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -16384 && DBL_MIN_10_EXP > -32768
|
||||
# define DTOA_SCALE_DOWN_NUM 15
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -32768 && DBL_MIN_10_EXP > -65536
|
||||
# define DTOA_SCALE_DOWN_NUM 16
|
||||
#endif
|
||||
#if DBL_MIN_10_EXP <= -65536 && DBL_MIN_10_EXP > -131072
|
||||
# define DTOA_SCALE_DOWN_NUM 17
|
||||
#endif
|
||||
|
||||
#define DTOA_ROUND_NUM (DBL_DIG + 1)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
struct dtoa
|
||||
{
|
||||
int32_t exp;
|
||||
uint8_t flags;
|
||||
char digits[DTOA_MAX_DIG + 1];
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
extern const double __dtoa_scale_up[];
|
||||
extern const double __dtoa_scale_down[];
|
||||
extern const double __dtoa_round[];
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
int __dtoa_engine(double x, FAR struct dtoa *dtoa, int max_digits,
|
||||
int max_decimals);
|
||||
|
||||
#endif /* __LIBS_LIBC_STDIO_NANO_DTOA_ENGINE_H */
|
1037
libs/libc/stdio/nano_libvsprintf.c
Normal file
1037
libs/libc/stdio/nano_libvsprintf.c
Normal file
File diff suppressed because it is too large
Load Diff
79
libs/libc/stdio/nano_ultoa_invert.c
Normal file
79
libs/libc/stdio/nano_ultoa_invert.c
Normal file
@ -0,0 +1,79 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/stdio/nano_ultoa_invert.c
|
||||
*
|
||||
* Copyright © 2017, Keith Packard
|
||||
* 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.
|
||||
* 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 "nano_ultoa_invert.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
FAR char *__ultoa_invert(unsigned long val, FAR char *str, int base)
|
||||
{
|
||||
int upper = 0;
|
||||
|
||||
if (base & XTOA_UPPER)
|
||||
{
|
||||
upper = 1;
|
||||
base &= ~XTOA_UPPER;
|
||||
}
|
||||
do
|
||||
{
|
||||
int v;
|
||||
|
||||
v = val % base;
|
||||
val = val / base;
|
||||
|
||||
if (v <= 9)
|
||||
{
|
||||
v += '0';
|
||||
}
|
||||
else
|
||||
{
|
||||
if (upper)
|
||||
v += 'A' - 10;
|
||||
else
|
||||
v += 'a' - 10;
|
||||
}
|
||||
|
||||
*str++ = v;
|
||||
}
|
||||
while (val);
|
||||
|
||||
return str;
|
||||
}
|
62
libs/libc/stdio/nano_ultoa_invert.h
Normal file
62
libs/libc/stdio/nano_ultoa_invert.h
Normal file
@ -0,0 +1,62 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/stdio/nano_ultoa_invert.h
|
||||
*
|
||||
* Copyright (c) 2005, Dmitry Xmelkov
|
||||
* 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.
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __LIBS_LIBC_STDIO_NANO_ULTOA_INVERT_H
|
||||
#define __LIBS_LIBC_STDIO_NANO_ULTOA_INVERT_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/compiler.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Next flags are to use with `base'. Unused fields are reserved. */
|
||||
|
||||
#define XTOA_PREFIX 0x0100 /* Put prefix for octal or hex */
|
||||
#define XTOA_UPPER 0x0200 /* Use upper case letters */
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Internal function for use from `printf'. */
|
||||
|
||||
FAR char *__ultoa_invert(unsigned long val, FAR char *s, int base);
|
||||
|
||||
#endif /* __LIBS_LIBC_STDIO_NANO_ULTOA_INVERT_H */
|
Loading…
Reference in New Issue
Block a user