* 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
996 B
C++
31 lines
996 B
C++
//===-- Implementation of wcstol ------------------------------------------===//
|
|
//
|
|
// 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/wcstol.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(long, wcstol,
|
|
(const wchar_t *__restrict str, wchar_t **__restrict str_end,
|
|
int base)) {
|
|
auto result = internal::strtointeger<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
|