* Removes the copy-pasta implementation of wcstointeger, and migrate the wcsto* family of functions to use a template version of strtointeger. * Fixes the out-of-bound read in the original implementation(s) when the entire input string consists of whitespaces (then the sign check can access OOB memory) The code is currently slightly peppered with "if constexpr" statements to distinguish between char and wchar_t. We can probably simplify it in subsequent changes by: * using overrides, so that internal::isalnum() is overriden for both char and wchar_t (since C++ luckily allows us to reuse names). * this wouldn't help for direct comparison with literals - for this as a somewhat ugly workaround like is_char_literal(c, '0', L'0')
31 lines
1.0 KiB
C++
31 lines
1.0 KiB
C++
//===-- Implementation of wcstoull ----------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "src/wchar/wcstoull.h"
|
|
#include "src/__support/common.h"
|
|
#include "src/__support/libc_errno.h"
|
|
#include "src/__support/macros/config.h"
|
|
#include "src/__support/str_to_integer.h"
|
|
|
|
namespace LIBC_NAMESPACE_DECL {
|
|
|
|
LLVM_LIBC_FUNCTION(unsigned long long, wcstoull,
|
|
(const wchar_t *__restrict str, wchar_t **__restrict str_end,
|
|
int base)) {
|
|
auto result = internal::strtointeger<unsigned long long>(str, base);
|
|
if (result.has_error())
|
|
libc_errno = result.error;
|
|
|
|
if (str_end != nullptr)
|
|
*str_end = const_cast<wchar_t *>(str + result.parsed_len);
|
|
|
|
return result;
|
|
}
|
|
|
|
} // namespace LIBC_NAMESPACE_DECL
|