2012-11-10 17:06:01 +01:00
|
|
|
/****************************************************************************
|
2018-05-29 21:21:26 +02:00
|
|
|
* libs/libc/stdio/lib_libvsprintf.c
|
2012-11-10 17:06:01 +01:00
|
|
|
*
|
2018-10-05 17:33:48 +02:00
|
|
|
* Copyright (C) 2007-2012, 2018 Gregory Nutt. All rights reserved.
|
2012-11-10 17:06:01 +01:00
|
|
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
|
|
|
* used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <nuttx/compiler.h>
|
|
|
|
|
2016-10-18 21:32:03 +02:00
|
|
|
#include <wchar.h>
|
2012-11-10 17:06:01 +01:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include <nuttx/arch.h>
|
|
|
|
|
2015-12-30 00:31:17 +01:00
|
|
|
#include "libc.h"
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Pre-processor Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#define FLAG_SHOWPLUS 0x01
|
|
|
|
#define FLAG_ALTFORM 0x02
|
|
|
|
#define FLAG_HASDOT 0x04
|
|
|
|
#define FLAG_HASASTERISKWIDTH 0x08
|
|
|
|
#define FLAG_HASASTERISKTRUNC 0x10
|
|
|
|
#define FLAG_LONGPRECISION 0x20
|
|
|
|
#define FLAG_LONGLONGPRECISION 0x40
|
|
|
|
#define FLAG_NEGATE 0x80
|
|
|
|
|
|
|
|
#define SET_SHOWPLUS(f) do (f) |= FLAG_SHOWPLUS; while (0)
|
|
|
|
#define SET_ALTFORM(f) do (f) |= FLAG_ALTFORM; while (0)
|
|
|
|
#define SET_HASDOT(f) do (f) |= FLAG_HASDOT; while (0)
|
|
|
|
#define SET_HASASTERISKWIDTH(f) do (f) |= FLAG_HASASTERISKWIDTH; while (0)
|
|
|
|
#define SET_HASASTERISKTRUNC(f) do (f) |= FLAG_HASASTERISKTRUNC; while (0)
|
|
|
|
#define SET_LONGPRECISION(f) do (f) |= FLAG_LONGPRECISION; while (0)
|
|
|
|
#define SET_LONGLONGPRECISION(f) do (f) |= FLAG_LONGLONGPRECISION; while (0)
|
|
|
|
#define SET_NEGATE(f) do (f) |= FLAG_NEGATE; while (0)
|
|
|
|
|
|
|
|
#define CLR_SHOWPLUS(f) do (f) &= ~FLAG_SHOWPLUS; while (0)
|
|
|
|
#define CLR_ALTFORM(f) do (f) &= ~FLAG_ALTFORM; while (0)
|
|
|
|
#define CLR_HASDOT(f) do (f) &= ~FLAG_HASDOT; while (0)
|
|
|
|
#define CLR_HASASTERISKWIDTH(f) do (f) &= ~FLAG_HASASTERISKWIDTH; while (0)
|
|
|
|
#define CLR_HASASTERISKTRUNC(f) do (f) &= ~FLAG_HASASTERISKTRUNC; while (0)
|
|
|
|
#define CLR_LONGPRECISION(f) do (f) &= ~FLAG_LONGPRECISION; while (0)
|
|
|
|
#define CLR_LONGLONGPRECISION(f) do (f) &= ~FLAG_LONGLONGPRECISION; while (0)
|
|
|
|
#define CLR_NEGATE(f) do (f) &= ~FLAG_NEGATE; while (0)
|
|
|
|
#define CLR_SIGNED(f) do (f) &= ~(FLAG_SHOWPLUS|FLAG_NEGATE); while (0)
|
|
|
|
|
|
|
|
#define IS_SHOWPLUS(f) (((f) & FLAG_SHOWPLUS) != 0)
|
|
|
|
#define IS_ALTFORM(f) (((f) & FLAG_ALTFORM) != 0)
|
|
|
|
#define IS_HASDOT(f) (((f) & FLAG_HASDOT) != 0)
|
|
|
|
#define IS_HASASTERISKWIDTH(f) (((f) & FLAG_HASASTERISKWIDTH) != 0)
|
|
|
|
#define IS_HASASTERISKTRUNC(f) (((f) & FLAG_HASASTERISKTRUNC) != 0)
|
|
|
|
#define IS_LONGPRECISION(f) (((f) & FLAG_LONGPRECISION) != 0)
|
|
|
|
#define IS_LONGLONGPRECISION(f) (((f) & FLAG_LONGLONGPRECISION) != 0)
|
|
|
|
#define IS_NEGATE(f) (((f) & FLAG_NEGATE) != 0)
|
|
|
|
#define IS_SIGNED(f) (((f) & (FLAG_SHOWPLUS|FLAG_NEGATE)) != 0)
|
|
|
|
|
|
|
|
/* If CONFIG_ARCH_ROMGETC is defined, then it is assumed that the format
|
|
|
|
* string data cannot be accessed by simply de-referencing the format string
|
|
|
|
* pointer. This might be in the case in Harvard architectures where string
|
|
|
|
* data might be stored in instruction space or if string data were stored
|
|
|
|
* on some media like EEPROM or external serial FLASH. In all of these cases,
|
|
|
|
* string data has to be accessed indirectly using the architecture-supplied
|
|
|
|
* up_romgetc(). The following mechanisms attempt to make these different
|
|
|
|
* access methods indistinguishable in the following code.
|
|
|
|
*
|
|
|
|
* NOTE: It is assumed that string arguments for %s still reside in memory
|
|
|
|
* that can be directly accessed by de-referencing the string pointer.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef CONFIG_ARCH_ROMGETC
|
|
|
|
# define FMT_TOP ch = up_romgetc(src) /* Loop initialization */
|
|
|
|
# define FMT_BOTTOM src++, ch = up_romgetc(src) /* Bottom of a loop */
|
|
|
|
# define FMT_CHAR ch /* Access a character */
|
|
|
|
# define FMT_NEXT src++; ch = up_romgetc(src) /* Advance to the next character */
|
|
|
|
# define FMT_PREV src--; ch = up_romgetc(src) /* Backup to the previous character */
|
|
|
|
#else
|
|
|
|
# define FMT_TOP /* Loop initialization */
|
|
|
|
# define FMT_BOTTOM src++ /* Bottom of a loop */
|
|
|
|
# define FMT_CHAR *src /* Access a character */
|
|
|
|
# define FMT_NEXT src++ /* Advance to the next character */
|
|
|
|
# define FMT_PREV src-- /* Backup to the previous character */
|
|
|
|
#endif
|
2014-04-13 22:32:20 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Private Type Declarations
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
FMT_RJUST = 0, /* Default */
|
|
|
|
FMT_LJUST,
|
|
|
|
FMT_RJUST0,
|
|
|
|
FMT_CENTER
|
|
|
|
};
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Function Prototypes
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/* Pointer to ASCII conversion */
|
|
|
|
|
|
|
|
#ifdef CONFIG_PTR_IS_NOT_INT
|
2016-01-05 17:29:29 +01:00
|
|
|
static void ptohex(FAR struct lib_outstream_s *obj, uint8_t flags,
|
|
|
|
FAR void *p);
|
2012-11-10 17:06:01 +01:00
|
|
|
static int getsizesize(uint8_t fmt, uint8_t flags, FAR void *p)
|
|
|
|
#endif /* CONFIG_PTR_IS_NOT_INT */
|
|
|
|
|
|
|
|
/* Unsigned int to ASCII conversion */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void utodec(FAR struct lib_outstream_s *obj, unsigned int n);
|
2016-01-05 17:29:29 +01:00
|
|
|
static void utohex(FAR struct lib_outstream_s *obj, unsigned int n,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a);
|
|
|
|
static void utooct(FAR struct lib_outstream_s *obj, unsigned int n);
|
|
|
|
static void utobin(FAR struct lib_outstream_s *obj, unsigned int n);
|
2012-11-10 17:06:01 +01:00
|
|
|
static void utoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned int lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
static void fixup(uint8_t fmt, FAR uint8_t *flags, int *n);
|
|
|
|
static int getusize(uint8_t fmt, uint8_t flags, unsigned int lln);
|
|
|
|
|
|
|
|
/* Unsigned long int to ASCII conversion */
|
|
|
|
|
|
|
|
#ifdef CONFIG_LONG_IS_NOT_INT
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void lutodec(FAR struct lib_outstream_s *obj, unsigned long ln);
|
2016-01-05 17:29:29 +01:00
|
|
|
static void lutohex(FAR struct lib_outstream_s *obj, unsigned long ln,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a);
|
|
|
|
static void lutooct(FAR struct lib_outstream_s *obj, unsigned long ln);
|
|
|
|
static void lutobin(FAR struct lib_outstream_s *obj, unsigned long ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
static void lutoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned long ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
static void lfixup(uint8_t fmt, FAR uint8_t *flags, long *ln);
|
|
|
|
static int getlusize(uint8_t fmt, FAR uint8_t flags, unsigned long ln);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Unsigned long long int to ASCII conversions */
|
|
|
|
|
2015-05-30 18:00:54 +02:00
|
|
|
#if defined(CONFIG_HAVE_LONG_LONG) && defined(CONFIG_LIBC_LONG_LONG)
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void llutodec(FAR struct lib_outstream_s *obj, unsigned long long lln);
|
2016-01-05 17:29:29 +01:00
|
|
|
static void llutohex(FAR struct lib_outstream_s *obj, unsigned long long lln,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a);
|
|
|
|
static void llutooct(FAR struct lib_outstream_s *obj, unsigned long long lln);
|
|
|
|
static void llutobin(FAR struct lib_outstream_s *obj, unsigned long long lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
static void llutoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned long long lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
static void llfixup(uint8_t fmt, FAR uint8_t *flags, FAR long long *lln);
|
2016-01-05 17:29:29 +01:00
|
|
|
static int getllusize(uint8_t fmt, FAR uint8_t flags,
|
|
|
|
FAR unsigned long long lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
static void prejustify(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
2018-10-06 17:57:06 +02:00
|
|
|
uint8_t justify, uint8_t flags, int fieldwidth,
|
|
|
|
int valwidth, int trunc);
|
|
|
|
static void postjustify(FAR struct lib_outstream_s *obj, uint8_t justify,
|
2018-10-05 21:54:28 +02:00
|
|
|
uint8_t flags, int fieldwidth, int valwidth,
|
|
|
|
int trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Constant Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static const char g_nullstring[] = "(null)";
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/* Include floating point functions */
|
2014-04-13 22:32:20 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
#ifdef CONFIG_LIBC_FLOATINGPOINT
|
|
|
|
# include "stdio/lib_libdtoa.c"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: ptohex
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifdef CONFIG_PTR_IS_NOT_INT
|
2016-01-05 17:29:29 +01:00
|
|
|
static void ptohex(FAR struct lib_outstream_s *obj, uint8_t flags,
|
|
|
|
FAR void *p)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
uint32_t dw;
|
|
|
|
FAR void *p;
|
|
|
|
} u;
|
|
|
|
uint8_t bits;
|
|
|
|
|
|
|
|
/* Check for alternate form */
|
|
|
|
|
|
|
|
if (IS_ALTFORM(flags))
|
|
|
|
{
|
|
|
|
/* Prefix the number with "0x" */
|
|
|
|
|
|
|
|
obj->put(obj, '0');
|
|
|
|
obj->put(obj, 'x');
|
|
|
|
}
|
|
|
|
|
|
|
|
u.dw = 0;
|
|
|
|
u.p = p;
|
|
|
|
|
|
|
|
for (bits = 8*sizeof(void *); bits > 0; bits -= 4)
|
|
|
|
{
|
|
|
|
uint8_t nibble = (uint8_t)((u.dw >> (bits - 4)) & 0xf);
|
|
|
|
if (nibble < 10)
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + '0');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + 'a' - 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: getpsize
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static int getpsize(uint8_t flags, FAR void *p)
|
|
|
|
{
|
|
|
|
struct lib_outstream_s nulloutstream;
|
|
|
|
lib_nulloutstream(&nulloutstream);
|
|
|
|
|
|
|
|
ptohex(&nulloutstream, flags, p);
|
|
|
|
return nulloutstream.nput;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CONFIG_PTR_IS_NOT_INT */
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: utodec
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void utodec(FAR struct lib_outstream_s *obj, unsigned int n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n % 10;
|
|
|
|
unsigned int dividend = n / 10;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
utodec(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: utohex
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void utohex(FAR struct lib_outstream_s *obj, unsigned int n,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
bool nonzero = false;
|
|
|
|
uint8_t bits;
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
for (bits = 8*sizeof(unsigned int); bits > 0; bits -= 4)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
uint8_t nibble = (uint8_t)((n >> (bits - 4)) & 0xf);
|
|
|
|
if (nibble || nonzero)
|
|
|
|
{
|
|
|
|
nonzero = true;
|
|
|
|
|
|
|
|
if (nibble < 10)
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + '0');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + a - 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (!nonzero)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: utooct
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void utooct(FAR struct lib_outstream_s *obj, unsigned int n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 0x7;
|
|
|
|
unsigned int dividend = n >> 3;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
utooct(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: utobin
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void utobin(FAR struct lib_outstream_s *obj, unsigned int n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 1;
|
|
|
|
unsigned int dividend = n >> 1;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
utobin(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: utoascii
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void utoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned int n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed/unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
case 'u':
|
|
|
|
{
|
2018-10-05 17:33:48 +02:00
|
|
|
/* Convert the integer value to a string. */
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utodec(obj, n);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
#ifndef CONFIG_PTR_IS_NOT_INT
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'p': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
#endif
|
|
|
|
case 'x':
|
|
|
|
case 'X':
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
/* Convert the unsigned value to a string.
|
|
|
|
*
|
|
|
|
* NOTE that the alternate form prefix was already applied in
|
|
|
|
* prejustify().
|
|
|
|
*/
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
if (fmt == 'X')
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utohex(obj, n, 'A');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utohex(obj, n, 'a');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Check for alternate form */
|
|
|
|
|
|
|
|
if (IS_ALTFORM(flags))
|
|
|
|
{
|
|
|
|
/* Prefix the number with '0' */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
obj->put(obj, '0');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utooct(obj, n);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utobin(obj, n);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
#ifdef CONFIG_PTR_IS_NOT_INT
|
|
|
|
case 'p':
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: fixup
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void fixup(uint8_t fmt, FAR uint8_t *flags, FAR int *n)
|
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
if (*n < 0)
|
|
|
|
{
|
|
|
|
SET_NEGATE(*flags);
|
|
|
|
CLR_SHOWPLUS(*flags);
|
2018-10-06 00:09:53 +02:00
|
|
|
*n = -*n;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'u': /* Unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'p': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'x':
|
|
|
|
case 'X':
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
CLR_SIGNED(*flags);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: getusize
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static int getusize(uint8_t fmt, uint8_t flags, unsigned int n)
|
|
|
|
{
|
|
|
|
struct lib_outstream_s nulloutstream;
|
|
|
|
lib_nulloutstream(&nulloutstream);
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utoascii(&nulloutstream, fmt, flags, n);
|
2012-11-10 17:06:01 +01:00
|
|
|
return nulloutstream.nput;
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: getdblsize
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifdef CONFIG_LIBC_FLOATINGPOINT
|
|
|
|
static int getdblsize(uint8_t fmt, int trunc, uint8_t flags, double n)
|
|
|
|
{
|
|
|
|
struct lib_outstream_s nulloutstream;
|
|
|
|
lib_nulloutstream(&nulloutstream);
|
|
|
|
|
|
|
|
lib_dtoa(&nulloutstream, fmt, trunc, flags, n);
|
|
|
|
return nulloutstream.nput;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_LONG_IS_NOT_INT
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Name: lutodec
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void lutodec(FAR struct lib_outstream_s *obj, unsigned long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n % 10;
|
|
|
|
unsigned long dividend = n / 10;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
lutodec(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: lutohex
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void lutohex(FAR struct lib_outstream_s *obj, unsigned long n,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
bool nonzero = false;
|
|
|
|
uint8_t bits;
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
for (bits = 8*sizeof(unsigned long); bits > 0; bits -= 4)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
uint8_t nibble = (uint8_t)((n >> (bits - 4)) & 0xf);
|
|
|
|
if (nibble || nonzero)
|
|
|
|
{
|
|
|
|
nonzero = true;
|
|
|
|
|
|
|
|
if (nibble < 10)
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + '0');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
obj->put(obj, nibble + a - 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (!nonzero)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: lutooct
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void lutooct(FAR struct lib_outstream_s *obj, unsigned long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 0x7;
|
|
|
|
unsigned long dividend = n >> 3;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
lutooct(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: lutobin
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void lutobin(FAR struct lib_outstream_s *obj, unsigned long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 1;
|
|
|
|
unsigned long dividend = n >> 1;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
lutobin(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: lutoascii
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void lutoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned long ln)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed/unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
case 'u':
|
|
|
|
{
|
2018-10-05 17:33:48 +02:00
|
|
|
/* Convert the long integer value to a string. */
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutodec(obj, ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'x': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'X':
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
/* Convert the unsigned value to a string.
|
|
|
|
*
|
|
|
|
* NOTE that the alternate form prefix was already applied in
|
|
|
|
* prejustify().
|
|
|
|
*/
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
if (fmt == 'X')
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutohex(obj, ln, 'A');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutohex(obj, ln, 'a');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Check for alternate form */
|
|
|
|
|
|
|
|
if (IS_ALTFORM(flags))
|
|
|
|
{
|
|
|
|
/* Prefix the number with '0' */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
obj->put(obj, '0');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutooct(obj, ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutobin(obj, ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: lfixup
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void lfixup(uint8_t fmt, FAR uint8_t *flags, FAR long *ln)
|
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
if (*ln < 0)
|
|
|
|
{
|
|
|
|
SET_NEGATE(*flags);
|
|
|
|
CLR_SHOWPLUS(*flags);
|
2018-10-06 00:09:53 +02:00
|
|
|
*ln = -*ln;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'u': /* Unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'p': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'x':
|
|
|
|
case 'X':
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
CLR_SIGNED(*flags);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: getlusize
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static int getlusize(uint8_t fmt, uint8_t flags, unsigned long ln)
|
|
|
|
{
|
|
|
|
struct lib_outstream_s nulloutstream;
|
|
|
|
lib_nulloutstream(&nulloutstream);
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutoascii(&nulloutstream, fmt, flags, ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
return nulloutstream.nput;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CONFIG_LONG_IS_NOT_INT */
|
|
|
|
|
2015-05-30 18:00:54 +02:00
|
|
|
#if defined(CONFIG_HAVE_LONG_LONG) && defined(CONFIG_LIBC_LONG_LONG)
|
2012-11-10 17:06:01 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Name: llutodec
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void llutodec(FAR struct lib_outstream_s *obj, unsigned long long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n % 10;
|
|
|
|
unsigned long long dividend = n / 10;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
llutodec(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: llutohex
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void llutohex(FAR struct lib_outstream_s *obj, unsigned long long n,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t a)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
bool nonzero = false;
|
|
|
|
uint8_t bits;
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
for (bits = 8*sizeof(unsigned long long); bits > 0; bits -= 4)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
uint8_t nibble = (uint8_t)((n >> (bits - 4)) & 0xf);
|
|
|
|
if (nibble || nonzero)
|
|
|
|
{
|
|
|
|
nonzero = true;
|
|
|
|
|
|
|
|
if (nibble < 10)
|
|
|
|
{
|
|
|
|
obj->put(obj, (nibble + '0'));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
obj->put(obj, (nibble + a - 10));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (!nonzero)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: llutooct
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void llutooct(FAR struct lib_outstream_s *obj, unsigned long long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 0x7;
|
|
|
|
unsigned long long dividend = n >> 3;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
llutooct(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: llutobin
|
|
|
|
****************************************************************************/
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
static void llutobin(FAR struct lib_outstream_s *obj, unsigned long long n)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
unsigned int remainder = n & 1;
|
|
|
|
unsigned long long dividend = n >> 1;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
if (dividend != 0)
|
|
|
|
{
|
|
|
|
llutobin(obj, dividend);
|
2018-10-05 17:33:48 +02:00
|
|
|
}
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
|
|
|
|
obj->put(obj, (remainder + (unsigned int)'0'));
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: llutoascii
|
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
static void llutoascii(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
uint8_t flags, unsigned long long lln)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed/unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
case 'u':
|
|
|
|
{
|
2018-10-05 17:33:48 +02:00
|
|
|
/* Convert the long long integer value to a string. */
|
2012-11-10 17:06:01 +01:00
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutodec(obj, (unsigned long long)lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'x': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'X':
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
/* Convert the unsigned value to a string.
|
|
|
|
*
|
|
|
|
* NOTE that the alternate form prefix was already applied in
|
|
|
|
* prejustify().
|
|
|
|
*/
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
if (fmt == 'X')
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutohex(obj, (unsigned long long)lln, 'A');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutohex(obj, (unsigned long long)lln, 'a');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Check for alternate form */
|
|
|
|
|
|
|
|
if (IS_ALTFORM(flags))
|
|
|
|
{
|
|
|
|
/* Prefix the number with '0' */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
obj->put(obj, '0');
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutooct(obj, (unsigned long long)lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
/* Convert the unsigned value to a string. */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutobin(obj, (unsigned long long)lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: llfixup
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void llfixup(uint8_t fmt, FAR uint8_t *flags, FAR long long *lln)
|
|
|
|
{
|
|
|
|
/* Perform the integer conversion according to the format specifier */
|
|
|
|
|
|
|
|
switch (fmt)
|
|
|
|
{
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'd': /* Signed base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'i':
|
|
|
|
if (*lln < 0)
|
|
|
|
{
|
|
|
|
SET_NEGATE(*flags);
|
|
|
|
CLR_SHOWPLUS(*flags);
|
2018-10-06 00:09:53 +02:00
|
|
|
*lln = -*lln;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'u': /* Unsigned base 10 */
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'p': /* Hexadecimal */
|
2012-11-10 17:06:01 +01:00
|
|
|
case 'x':
|
|
|
|
case 'X':
|
2018-10-06 00:09:53 +02:00
|
|
|
case 'o': /* Octal */
|
|
|
|
case 'b': /* Binary */
|
2012-11-10 17:06:01 +01:00
|
|
|
CLR_SIGNED(*flags);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: getllusize
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static int getllusize(uint8_t fmt, uint8_t flags, unsigned long long lln)
|
|
|
|
{
|
|
|
|
struct lib_outstream_s nulloutstream;
|
|
|
|
lib_nulloutstream(&nulloutstream);
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutoascii(&nulloutstream, fmt, flags, lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
return nulloutstream.nput;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CONFIG_HAVE_LONG_LONG */
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: prejustify
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void prejustify(FAR struct lib_outstream_s *obj, uint8_t fmt,
|
2018-10-06 17:57:06 +02:00
|
|
|
uint8_t justify, uint8_t flags, int fieldwidth,
|
|
|
|
int valwidth, int trunc)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
bool althex = (fmt == 'x' || fmt == 'X') && IS_ALTFORM(flags);
|
2012-11-10 17:06:01 +01:00
|
|
|
int i;
|
|
|
|
|
2018-10-06 00:09:53 +02:00
|
|
|
/* If there is integer precision, then use FMT_RJUST vs FMT_RJUST0 */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (trunc > 0 && justify == FMT_RJUST0)
|
2018-10-05 21:54:28 +02:00
|
|
|
{
|
|
|
|
/* Force right justification in the case. Leading zeros application
|
|
|
|
* only to "precision" which is implied anyway.
|
|
|
|
*/
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
justify = FMT_RJUST;
|
2018-10-05 21:54:28 +02:00
|
|
|
}
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
switch (justify)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
default:
|
|
|
|
case FMT_RJUST:
|
2018-10-05 21:54:28 +02:00
|
|
|
{
|
|
|
|
/* Pad with spaces up to the size of the precision (aka 'trunc')
|
|
|
|
* then with zeroes to the size of the value width.
|
|
|
|
*/
|
2012-11-10 17:06:01 +01:00
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
if (trunc > valwidth)
|
|
|
|
{
|
|
|
|
int padlen = fieldwidth - trunc;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
if (IS_SIGNED(flags))
|
|
|
|
{
|
|
|
|
padlen--;
|
|
|
|
}
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
padlen -= 2;
|
|
|
|
}
|
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
for (i = padlen; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, ' ');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_NEGATE(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '-');
|
|
|
|
}
|
|
|
|
else if (IS_SHOWPLUS(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '+');
|
|
|
|
}
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
obj->put(obj, 'x');
|
|
|
|
}
|
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
for (i = trunc - valwidth; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Add a leading minus sign */
|
|
|
|
|
|
|
|
if (IS_SIGNED(flags))
|
|
|
|
{
|
|
|
|
valwidth++;
|
|
|
|
}
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
valwidth += 2;
|
|
|
|
}
|
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
for (i = fieldwidth - valwidth; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, ' ');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_NEGATE(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '-');
|
|
|
|
}
|
|
|
|
else if (IS_SHOWPLUS(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '+');
|
|
|
|
}
|
2018-10-06 17:57:06 +02:00
|
|
|
|
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
obj->put(obj, 'x');
|
|
|
|
}
|
2018-10-05 21:54:28 +02:00
|
|
|
}
|
|
|
|
}
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case FMT_RJUST0:
|
2018-10-05 21:54:28 +02:00
|
|
|
{
|
|
|
|
if (IS_NEGATE(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '-');
|
|
|
|
valwidth++;
|
|
|
|
}
|
|
|
|
else if (IS_SHOWPLUS(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '+');
|
|
|
|
valwidth++;
|
|
|
|
}
|
2012-11-10 17:06:01 +01:00
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
obj->put(obj, 'x');
|
|
|
|
valwidth += 2;
|
|
|
|
}
|
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
for (i = fieldwidth - valwidth; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case FMT_LJUST:
|
2018-10-05 21:54:28 +02:00
|
|
|
{
|
|
|
|
if (IS_NEGATE(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '-');
|
|
|
|
}
|
|
|
|
else if (IS_SHOWPLUS(flags))
|
|
|
|
{
|
|
|
|
obj->put(obj, '+');
|
|
|
|
}
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
if (althex)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
obj->put(obj, 'x');
|
|
|
|
}
|
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
/* Pad with zeros up to the size of the value width. */
|
|
|
|
|
|
|
|
for (i = trunc - valwidth; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, '0');
|
|
|
|
}
|
|
|
|
}
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Name: postjustify
|
|
|
|
****************************************************************************/
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
static void postjustify(FAR struct lib_outstream_s *obj, uint8_t justify,
|
2018-10-05 21:54:28 +02:00
|
|
|
uint8_t flags, int fieldwidth, int valwidth,
|
|
|
|
int trunc)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* Apply field justification to the integer value. */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
switch (justify)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
default:
|
|
|
|
case FMT_RJUST:
|
|
|
|
case FMT_RJUST0:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case FMT_LJUST:
|
2018-10-05 21:54:28 +02:00
|
|
|
{
|
|
|
|
int width;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
2018-10-05 21:54:28 +02:00
|
|
|
if (IS_SIGNED(flags))
|
|
|
|
{
|
|
|
|
valwidth++;
|
|
|
|
}
|
|
|
|
|
|
|
|
width = valwidth < trunc ? trunc : valwidth;
|
|
|
|
|
|
|
|
for (i = fieldwidth - width; i > 0; i--)
|
|
|
|
{
|
|
|
|
obj->put(obj, ' ');
|
|
|
|
}
|
|
|
|
}
|
2012-11-10 17:06:01 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
2018-05-29 21:21:26 +02:00
|
|
|
* libs/libc/stdio/lib_vsprintf
|
2012-11-10 17:06:01 +01:00
|
|
|
****************************************************************************/
|
|
|
|
|
2016-01-05 17:29:29 +01:00
|
|
|
int lib_vsprintf(FAR struct lib_outstream_s *obj, FAR const IPTR char *src,
|
|
|
|
va_list ap)
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
FAR char *ptmp;
|
|
|
|
int width;
|
|
|
|
int trunc;
|
2018-10-06 17:57:06 +02:00
|
|
|
uint8_t justify;
|
2012-11-10 17:06:01 +01:00
|
|
|
uint8_t flags;
|
|
|
|
#ifdef CONFIG_ARCH_ROMGETC
|
|
|
|
char ch;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
for (FMT_TOP; FMT_CHAR; FMT_BOTTOM)
|
|
|
|
{
|
|
|
|
/* Just copy regular characters */
|
|
|
|
|
|
|
|
if (FMT_CHAR != '%')
|
|
|
|
{
|
|
|
|
/* Output the character */
|
|
|
|
|
|
|
|
obj->put(obj, FMT_CHAR);
|
|
|
|
|
|
|
|
/* Flush the buffer if a newline is encountered */
|
|
|
|
|
|
|
|
if (FMT_CHAR == '\n')
|
|
|
|
{
|
|
|
|
/* Should return an error on a failure to flush */
|
|
|
|
|
|
|
|
(void)obj->flush(obj);
|
|
|
|
}
|
2017-02-08 18:28:24 +01:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Process the next character in the format */
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We have found a format specifier. Move past it. */
|
|
|
|
|
|
|
|
FMT_NEXT;
|
|
|
|
|
|
|
|
/* Assume defaults */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
flags = 0;
|
|
|
|
justify = FMT_RJUST;
|
|
|
|
width = 0;
|
|
|
|
trunc = 0;
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Process each format qualifier. */
|
|
|
|
|
|
|
|
for (; FMT_CHAR; FMT_BOTTOM)
|
|
|
|
{
|
|
|
|
/* Break out of the loop when the format is known. */
|
|
|
|
|
|
|
|
if (strchr("diuxXpobeEfgGlLsc%", FMT_CHAR))
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for left justification. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '-')
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
justify = FMT_LJUST;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for leading zero fill right justification. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '0')
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
justify = FMT_RJUST0;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
#if 0
|
|
|
|
/* Center justification. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '~')
|
|
|
|
{
|
2018-10-06 17:57:06 +02:00
|
|
|
justify = FMT_CENTER;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '*')
|
|
|
|
{
|
|
|
|
int value = va_arg(ap, int);
|
|
|
|
if (IS_HASDOT(flags))
|
|
|
|
{
|
|
|
|
trunc = value;
|
|
|
|
SET_HASASTERISKTRUNC(flags);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
width = value;
|
|
|
|
SET_HASASTERISKWIDTH(flags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for field width */
|
|
|
|
|
|
|
|
else if (FMT_CHAR >= '1' && FMT_CHAR <= '9')
|
|
|
|
{
|
|
|
|
/* Accumulate the field width integer. */
|
|
|
|
|
|
|
|
int n = ((int)(FMT_CHAR)) - (int)'0';
|
2015-10-12 15:45:02 +02:00
|
|
|
for (; ; )
|
2012-11-10 17:06:01 +01:00
|
|
|
{
|
|
|
|
FMT_NEXT;
|
|
|
|
if (FMT_CHAR >= '0' && FMT_CHAR <= '9')
|
|
|
|
{
|
|
|
|
n = 10*n + (((int)(FMT_CHAR)) - (int)'0');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_HASDOT(flags))
|
|
|
|
{
|
|
|
|
trunc = n;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
width = n;
|
|
|
|
}
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Back up to the last digit. */
|
|
|
|
|
|
|
|
FMT_PREV;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for a decimal point. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '.')
|
|
|
|
{
|
|
|
|
SET_HASDOT(flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for leading plus sign. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '+')
|
|
|
|
{
|
|
|
|
SET_SHOWPLUS(flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for alternate form. */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == '#')
|
|
|
|
{
|
|
|
|
SET_ALTFORM(flags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* "%%" means that a literal '%' was intended (instead of a format
|
|
|
|
* specification).
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (FMT_CHAR == '%')
|
|
|
|
{
|
|
|
|
obj->put(obj, '%');
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for the string format. */
|
|
|
|
|
|
|
|
if (FMT_CHAR == 's')
|
|
|
|
{
|
|
|
|
int swidth;
|
2017-03-18 00:32:44 +01:00
|
|
|
int left;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Get the string to output */
|
|
|
|
|
2015-10-12 15:45:02 +02:00
|
|
|
ptmp = va_arg(ap, FAR char *);
|
2012-11-10 17:06:01 +01:00
|
|
|
if (!ptmp)
|
|
|
|
{
|
2015-10-12 15:45:02 +02:00
|
|
|
ptmp = (FAR char *)g_nullstring;
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
|
2014-12-08 16:28:53 +01:00
|
|
|
/* Get the width of the string and perform right-justification
|
2012-11-10 17:06:01 +01:00
|
|
|
* operations.
|
|
|
|
*/
|
|
|
|
|
2017-03-18 00:32:44 +01:00
|
|
|
swidth = (IS_HASDOT(flags) && trunc >= 0)
|
|
|
|
? strnlen(ptmp, trunc) : strlen(ptmp);
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, 0, width, swidth, 0);
|
2017-03-18 00:32:44 +01:00
|
|
|
left = swidth;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Concatenate the string into the output */
|
|
|
|
|
|
|
|
while (*ptmp)
|
|
|
|
{
|
2017-03-18 00:32:44 +01:00
|
|
|
if (left-- <= 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
obj->put(obj, *ptmp);
|
|
|
|
ptmp++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Perform left-justification operations. */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, 0, width, swidth, 0);
|
2012-11-10 17:06:01 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for the character output */
|
|
|
|
|
|
|
|
else if (FMT_CHAR == 'c')
|
|
|
|
{
|
|
|
|
/* Just copy the character into the output. */
|
|
|
|
|
|
|
|
int n = va_arg(ap, int);
|
|
|
|
obj->put(obj, n);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for the long long prefix. */
|
|
|
|
|
|
|
|
if (FMT_CHAR == 'L')
|
|
|
|
{
|
|
|
|
SET_LONGLONGPRECISION(flags);
|
|
|
|
FMT_NEXT;
|
|
|
|
}
|
|
|
|
else if (FMT_CHAR == 'l')
|
|
|
|
{
|
|
|
|
SET_LONGPRECISION(flags);
|
|
|
|
FMT_NEXT;
|
|
|
|
if (FMT_CHAR == 'l')
|
|
|
|
{
|
|
|
|
SET_LONGLONGPRECISION(flags);
|
|
|
|
FMT_NEXT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Handle integer conversions */
|
|
|
|
|
|
|
|
if (strchr("diuxXpob", FMT_CHAR))
|
|
|
|
{
|
2015-05-30 18:00:54 +02:00
|
|
|
#if defined(CONFIG_HAVE_LONG_LONG) && defined(CONFIG_LIBC_LONG_LONG)
|
2012-11-10 17:06:01 +01:00
|
|
|
if (IS_LONGLONGPRECISION(flags) && FMT_CHAR != 'p')
|
|
|
|
{
|
|
|
|
long long lln;
|
|
|
|
int lluwidth;
|
2018-10-06 00:09:53 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Extract the long long value. */
|
|
|
|
|
|
|
|
lln = va_arg(ap, long long);
|
|
|
|
|
|
|
|
/* Resolve sign-ness and format issues */
|
|
|
|
|
|
|
|
llfixup(FMT_CHAR, &flags, &lln);
|
|
|
|
|
|
|
|
/* Get the width of the output */
|
|
|
|
|
|
|
|
lluwidth = getllusize(FMT_CHAR, flags, lln);
|
|
|
|
|
|
|
|
/* Perform left field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, flags, width, lluwidth,
|
|
|
|
trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Output the number */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
llutoascii(obj, FMT_CHAR, flags, (unsigned long long)lln);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Perform right field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, flags, width, lluwidth, trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif /* CONFIG_HAVE_LONG_LONG */
|
|
|
|
#ifdef CONFIG_LONG_IS_NOT_INT
|
|
|
|
if (IS_LONGPRECISION(flags) && FMT_CHAR != 'p')
|
|
|
|
{
|
|
|
|
long ln;
|
|
|
|
int luwidth;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Extract the long value. */
|
|
|
|
|
|
|
|
ln = va_arg(ap, long);
|
|
|
|
|
|
|
|
/* Resolve sign-ness and format issues */
|
|
|
|
|
|
|
|
lfixup(FMT_CHAR, &flags, &ln);
|
|
|
|
|
|
|
|
/* Get the width of the output */
|
|
|
|
|
|
|
|
luwidth = getlusize(FMT_CHAR, flags, ln);
|
|
|
|
|
|
|
|
/* Perform left field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, flags, width, trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Output the number */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
lutoascii(obj, FMT_CHAR, flags, (unsigned long)ln);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Perform right field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, flags, width, luwidth, trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif /* CONFIG_LONG_IS_NOT_INT */
|
|
|
|
#ifdef CONFIG_PTR_IS_NOT_INT
|
|
|
|
if (FMT_CHAR == 'p')
|
|
|
|
{
|
|
|
|
void *p;
|
|
|
|
int pwidth;
|
2018-10-05 17:33:48 +02:00
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Extract the integer value. */
|
|
|
|
|
|
|
|
p = va_arg(ap, void *);
|
|
|
|
|
|
|
|
/* Resolve sign-ness and format issues */
|
|
|
|
|
|
|
|
lfixup(FMT_CHAR, &flags, &ln);
|
|
|
|
|
|
|
|
/* Get the width of the output */
|
|
|
|
|
2013-05-09 22:23:34 +02:00
|
|
|
pwidth = getpsize(FMT_CHAR, flags, p);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Perform left field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, flags, width, pwidth, 0);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Output the pointer value */
|
|
|
|
|
|
|
|
ptohex(obj, flags, p);
|
|
|
|
|
|
|
|
/* Perform right field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, flags, width, pwidth, 0);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int uwidth;
|
2018-10-05 17:33:48 +02:00
|
|
|
int n;
|
|
|
|
|
2012-11-10 17:06:01 +01:00
|
|
|
/* Extract the long long value. */
|
|
|
|
|
|
|
|
n = va_arg(ap, int);
|
|
|
|
|
|
|
|
/* Resolve sign-ness and format issues */
|
|
|
|
|
|
|
|
fixup(FMT_CHAR, &flags, &n);
|
|
|
|
|
|
|
|
/* Get the width of the output */
|
|
|
|
|
|
|
|
uwidth = getusize(FMT_CHAR, flags, n);
|
|
|
|
|
|
|
|
/* Perform left field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, flags, width, uwidth,
|
|
|
|
trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Output the number */
|
|
|
|
|
libs/libc/stdio/lib_libvsprintf.c: Back out most of commit d0254b1c796bd8c383ec840997856b3f19f3363e. While logic seemed correct, verify against glibc showed differs. The output now matches the output form glibc:
This code sequence:
printf("%3.3u %3.3u %3.3u %3.3u %3.3u\n",
9, 99, 999, 9999, 99999);
printf("%3u %3u %3u %3u %3u\n",
9, 99, 999, 9999, 99999);
printf("%3.3lu %3.3lu %3.3lu %3.3lu %3.3lu\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3u %3u %3u %3u %3u\n",
9L, 99L, 999L, 9999L, 99999L);
printf("%3.3llu %3.3llu %3.3llu %3.3llu %3.3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
printf("%3llu %3llu %3llu %3llu %3llu\n",
9LL, 99LL, 999LL, 9999LL, 99999LL);
Generates:
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
009 099 999 9999 99999
9 99 999 9999 99999
For both NuttX and glibc.
2018-10-05 21:00:14 +02:00
|
|
|
utoascii(obj, FMT_CHAR, flags, (unsigned int)n);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Perform right field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, flags, width, uwidth, trunc);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Handle floating point conversions */
|
|
|
|
|
|
|
|
#ifdef CONFIG_LIBC_FLOATINGPOINT
|
|
|
|
else if (strchr("eEfgG", FMT_CHAR))
|
|
|
|
{
|
|
|
|
double dblval = va_arg(ap, double);
|
|
|
|
int dblsize;
|
|
|
|
|
|
|
|
/* Get the width of the output */
|
|
|
|
|
|
|
|
dblsize = getdblsize(FMT_CHAR, trunc, flags, dblval);
|
|
|
|
|
|
|
|
/* Perform left field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
prejustify(obj, FMT_CHAR, justify, 0, width, dblsize, 0);
|
2012-11-10 17:06:01 +01:00
|
|
|
|
|
|
|
/* Output the number */
|
|
|
|
|
|
|
|
lib_dtoa(obj, FMT_CHAR, trunc, flags, dblval);
|
|
|
|
|
|
|
|
/* Perform right field justification actions */
|
|
|
|
|
2018-10-06 17:57:06 +02:00
|
|
|
postjustify(obj, justify, 0, width, dblsize, 0);
|
2012-11-10 17:06:01 +01:00
|
|
|
}
|
|
|
|
#endif /* CONFIG_LIBC_FLOATINGPOINT */
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj->nput;
|
|
|
|
}
|