Iros
Loading...
Searching...
No Matches
strtol_implementation.h
Go to the documentation of this file.
1
#pragma once
2
3
#include <
ccpp/bits/zstring_parser.h
>
4
#include <errno.h>
5
6
#include "
di/math/prelude.h
"
7
#include "
di/util/prelude.h
"
8
9
namespace
ccpp
{
10
template
<di::concepts::OneOf<
long
,
long
long
,
unsigned
long
,
unsigned
long
long
> T>
11
T
strtol
(
char
const
* __restrict
string
,
char
** __restrict end,
int
radix) {
12
auto
set_end = [&](
char
const
* value) {
13
if
(end) {
14
*end =
const_cast<
char
*
>
(value);
15
}
16
};
17
18
if
(radix < 0 || radix == 1 || radix > 36) {
19
set_end(
string
);
20
errno
=
EINVAL
;
21
return
0;
22
}
23
24
auto
context =
di::parser::ZStringParserContext
(
di::ZCString
(
string
));
25
auto
parser =
~di
::parser::match_zero_or_more(
' '
_m ||
'\f'
_m ||
'\n'
_m ||
'\r'
_m ||
'\t'
_m ||
'\v'
_m) >>
26
di::parser::integer<T, di::parser::IntegerMode::CStandard>
(radix);
27
auto
result = parser.parse(context);
28
29
if
(!result) {
30
switch
(result.error()) {
31
case
di::parser::ZStringError::Invalid
:
32
errno
=
EINVAL
;
33
set_end(
string
);
34
return
0;
35
case
di::parser::ZStringError::Overflow
:
36
errno
=
ERANGE
;
37
set_end(context.iterator_on_error().base());
38
return
di::NumericLimits<T>::max
;
39
case
di::parser::ZStringError::Underflow
:
40
errno
=
ERANGE
;
41
set_end(context.iterator_on_error().base());
42
return
di::NumericLimits<T>::min
;
43
default
:
44
di::unreachable
();
45
}
46
}
47
48
set_end(context.begin().base().base());
49
return
*result;
50
}
51
}
EINVAL
#define EINVAL
Definition
errno.h:32
ERANGE
#define ERANGE
Definition
errno.h:71
di::parser::ZStringParserContext
Definition
zstring_parser.h:24
errno
#define errno
Definition
errno.h:11
prelude.h
prelude.h
ccpp
Definition
getopt.cpp:3
ccpp::strtol
T strtol(char const *__restrict string, char **__restrict end, int radix)
Definition
strtol_implementation.h:11
di::container::ZCString
ZStringImpl< char const > ZCString
Definition
zstring.h:38
di::parser::ZStringError::Underflow
@ Underflow
Definition
zstring_parser.h:21
di::parser::ZStringError::Overflow
@ Overflow
Definition
zstring_parser.h:20
di::parser::ZStringError::Invalid
@ Invalid
Definition
zstring_parser.h:19
di::parser::integer
constexpr auto integer
Definition
integer.h:212
di
Definition
zstring_parser.h:9
di::unreachable
void unreachable()
Definition
unreachable.h:4
di::math::NumericLimits
Definition
numeric_limits.h:7
zstring_parser.h
libs
ccpp
include
ccpp
bits
strtol_implementation.h
Generated by
1.13.0