xref: /llvm-project/libc/src/stdlib/strtoul.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1d52f0aecSMichael Jones //===-- Implementation of strtoul -----------------------------------------===//
2d52f0aecSMichael Jones //
3d52f0aecSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d52f0aecSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
5d52f0aecSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d52f0aecSMichael Jones //
7d52f0aecSMichael Jones //===----------------------------------------------------------------------===//
8d52f0aecSMichael Jones 
9d52f0aecSMichael Jones #include "src/stdlib/strtoul.h"
10d52f0aecSMichael Jones #include "src/__support/common.h"
11*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
1231d797f4SMichael Jones #include "src/__support/str_to_integer.h"
1304a9c625SMichael Jones #include "src/errno/libc_errno.h"
14d52f0aecSMichael Jones 
15*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
16d52f0aecSMichael Jones 
17d52f0aecSMichael Jones LLVM_LIBC_FUNCTION(unsigned long, strtoul,
18d52f0aecSMichael Jones                    (const char *__restrict str, char **__restrict str_end,
19d52f0aecSMichael Jones                     int base)) {
2074da5e6cSMichael Jones   auto result = internal::strtointeger<unsigned long>(str, base);
2174da5e6cSMichael Jones   if (result.has_error())
2204a9c625SMichael Jones     libc_errno = result.error;
2374da5e6cSMichael Jones 
2474da5e6cSMichael Jones   if (str_end != nullptr)
2574da5e6cSMichael Jones     *str_end = const_cast<char *>(str + result.parsed_len);
2674da5e6cSMichael Jones 
2774da5e6cSMichael Jones   return result;
28d52f0aecSMichael Jones }
29d52f0aecSMichael Jones 
30*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
31