
This reverts commit d1156fcb56891fb1a426c3e8331a51d47f98a1b8. This patch fixes the reported incorrect formatting changes and adds tests for them. The performance should be unaffected, since there are no significant changes required to fix the bugs. Specifically, a `>` was changed to a `>=` to also add a `+` in the zero case, and we're checking for zero now before printing the octal and hexadecimal prefixes. Closes #131710
160 lines
8.5 KiB
C++
160 lines
8.5 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP___CHARCONV_TABLES
|
|
#define _LIBCPP___CHARCONV_TABLES
|
|
|
|
#include <__config>
|
|
#include <cstdint>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
namespace __itoa {
|
|
|
|
inline _LIBCPP_CONSTEXPR const char __base_2_lut[64] = {
|
|
'0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '1', '0', '0', '0', '1',
|
|
'0', '1', '0', '1', '1', '0', '0', '1', '1', '1', '1', '0', '0', '0', '1', '0', '0', '1', '1', '0', '1', '0',
|
|
'1', '0', '1', '1', '1', '1', '0', '0', '1', '1', '0', '1', '1', '1', '1', '0', '1', '1', '1', '1'};
|
|
|
|
inline _LIBCPP_CONSTEXPR const char __base_8_lut[128] = {
|
|
'0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '1', '0', '1', '1', '1', '2',
|
|
'1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5',
|
|
'2', '6', '2', '7', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '4', '0',
|
|
'4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '5', '0', '5', '1', '5', '2', '5', '3',
|
|
'5', '4', '5', '5', '5', '6', '5', '7', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6',
|
|
'6', '7', '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7'};
|
|
|
|
inline _LIBCPP_CONSTEXPR const char __base_16_lut[512] = {
|
|
'0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', '0', 'a', '0',
|
|
'b', '0', 'c', '0', 'd', '0', 'e', '0', 'f', '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6',
|
|
'1', '7', '1', '8', '1', '9', '1', 'a', '1', 'b', '1', 'c', '1', 'd', '1', 'e', '1', 'f', '2', '0', '2', '1', '2',
|
|
'2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', '2', 'a', '2', 'b', '2', 'c', '2', 'd',
|
|
'2', 'e', '2', 'f', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3',
|
|
'9', '3', 'a', '3', 'b', '3', 'c', '3', 'd', '3', 'e', '3', 'f', '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',
|
|
'4', '5', '4', '6', '4', '7', '4', '8', '4', '9', '4', 'a', '4', 'b', '4', 'c', '4', 'd', '4', 'e', '4', 'f', '5',
|
|
'0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', '5', 'a', '5', 'b',
|
|
'5', 'c', '5', 'd', '5', 'e', '5', 'f', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6',
|
|
'7', '6', '8', '6', '9', '6', 'a', '6', 'b', '6', 'c', '6', 'd', '6', 'e', '6', 'f', '7', '0', '7', '1', '7', '2',
|
|
'7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', '7', 'a', '7', 'b', '7', 'c', '7', 'd', '7',
|
|
'e', '7', 'f', '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',
|
|
'8', 'a', '8', 'b', '8', 'c', '8', 'd', '8', 'e', '8', 'f', '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9',
|
|
'5', '9', '6', '9', '7', '9', '8', '9', '9', '9', 'a', '9', 'b', '9', 'c', '9', 'd', '9', 'e', '9', 'f', 'a', '0',
|
|
'a', '1', 'a', '2', 'a', '3', 'a', '4', 'a', '5', 'a', '6', 'a', '7', 'a', '8', 'a', '9', 'a', 'a', 'a', 'b', 'a',
|
|
'c', 'a', 'd', 'a', 'e', 'a', 'f', 'b', '0', 'b', '1', 'b', '2', 'b', '3', 'b', '4', 'b', '5', 'b', '6', 'b', '7',
|
|
'b', '8', 'b', '9', 'b', 'a', 'b', 'b', 'b', 'c', 'b', 'd', 'b', 'e', 'b', 'f', 'c', '0', 'c', '1', 'c', '2', 'c',
|
|
'3', 'c', '4', 'c', '5', 'c', '6', 'c', '7', 'c', '8', 'c', '9', 'c', 'a', 'c', 'b', 'c', 'c', 'c', 'd', 'c', 'e',
|
|
'c', 'f', 'd', '0', 'd', '1', 'd', '2', 'd', '3', 'd', '4', 'd', '5', 'd', '6', 'd', '7', 'd', '8', 'd', '9', 'd',
|
|
'a', 'd', 'b', 'd', 'c', 'd', 'd', 'd', 'e', 'd', 'f', 'e', '0', 'e', '1', 'e', '2', 'e', '3', 'e', '4', 'e', '5',
|
|
'e', '6', 'e', '7', 'e', '8', 'e', '9', 'e', 'a', 'e', 'b', 'e', 'c', 'e', 'd', 'e', 'e', 'e', 'f', 'f', '0', 'f',
|
|
'1', 'f', '2', 'f', '3', 'f', '4', 'f', '5', 'f', '6', 'f', '7', 'f', '8', 'f', '9', 'f', 'a', 'f', 'b', 'f', 'c',
|
|
'f', 'd', 'f', 'e', 'f', 'f'};
|
|
|
|
inline _LIBCPP_CONSTEXPR const uint32_t __pow10_32[10] = {
|
|
UINT32_C(0),
|
|
UINT32_C(10),
|
|
UINT32_C(100),
|
|
UINT32_C(1000),
|
|
UINT32_C(10000),
|
|
UINT32_C(100000),
|
|
UINT32_C(1000000),
|
|
UINT32_C(10000000),
|
|
UINT32_C(100000000),
|
|
UINT32_C(1000000000)};
|
|
|
|
inline _LIBCPP_CONSTEXPR const uint64_t __pow10_64[20] = {
|
|
UINT64_C(0),
|
|
UINT64_C(10),
|
|
UINT64_C(100),
|
|
UINT64_C(1000),
|
|
UINT64_C(10000),
|
|
UINT64_C(100000),
|
|
UINT64_C(1000000),
|
|
UINT64_C(10000000),
|
|
UINT64_C(100000000),
|
|
UINT64_C(1000000000),
|
|
UINT64_C(10000000000),
|
|
UINT64_C(100000000000),
|
|
UINT64_C(1000000000000),
|
|
UINT64_C(10000000000000),
|
|
UINT64_C(100000000000000),
|
|
UINT64_C(1000000000000000),
|
|
UINT64_C(10000000000000000),
|
|
UINT64_C(100000000000000000),
|
|
UINT64_C(1000000000000000000),
|
|
UINT64_C(10000000000000000000)};
|
|
|
|
# if _LIBCPP_HAS_INT128
|
|
inline _LIBCPP_CONSTEXPR const int __pow10_128_offset = 0;
|
|
inline _LIBCPP_CONSTEXPR const __uint128_t __pow10_128[40] = {
|
|
UINT64_C(0),
|
|
UINT64_C(10),
|
|
UINT64_C(100),
|
|
UINT64_C(1000),
|
|
UINT64_C(10000),
|
|
UINT64_C(100000),
|
|
UINT64_C(1000000),
|
|
UINT64_C(10000000),
|
|
UINT64_C(100000000),
|
|
UINT64_C(1000000000),
|
|
UINT64_C(10000000000),
|
|
UINT64_C(100000000000),
|
|
UINT64_C(1000000000000),
|
|
UINT64_C(10000000000000),
|
|
UINT64_C(100000000000000),
|
|
UINT64_C(1000000000000000),
|
|
UINT64_C(10000000000000000),
|
|
UINT64_C(100000000000000000),
|
|
UINT64_C(1000000000000000000),
|
|
UINT64_C(10000000000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000000),
|
|
__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000),
|
|
(__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000)) * 10};
|
|
# endif
|
|
|
|
inline _LIBCPP_CONSTEXPR const char __digits_base_10[200] = {
|
|
// clang-format off
|
|
'0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9',
|
|
'1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '1', '8', '1', '9',
|
|
'2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',
|
|
'3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3', '9',
|
|
'4', '0', '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '4', '8', '4', '9',
|
|
'5', '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',
|
|
'6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6', '7', '6', '8', '6', '9',
|
|
'7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9',
|
|
'8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',
|
|
'9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', '5', '9', '6', '9', '7', '9', '8', '9', '9'};
|
|
// clang-format on
|
|
|
|
} // namespace __itoa
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP___CHARCONV_TABLES
|