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:
Keith Packard 2019-02-06 15:50:52 -06:00 committed by Gregory Nutt
parent 508f4666b2
commit e05149b745
8 changed files with 1851 additions and 1 deletions

View File

@ -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

View File

@ -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)

View 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
};

View 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;
}

View 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 */

File diff suppressed because it is too large Load Diff

View 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;
}

View 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 */