Commit | Line | Data |
---|---|---|
bd99994b RP |
1 | #include <string.h> |
2 | #include <stdlib.h> | |
3 | #include <limits.h> | |
4 | ||
2c48ab2e | 5 | #include "strntol.h" |
a89ba4b1 | 6 | |
bd99994b RP |
7 | long strntol(const char *str, size_t sz, char **end, int base) |
8 | { | |
9 | /* Expect that digit representation of LONG_MAX/MIN | |
10 | * not greater than this buffer */ | |
11 | char buf[24]; | |
12 | long ret; | |
13 | const char *beg = str; | |
14 | ||
15 | /* Catch up leading spaces */ | |
16 | for (; beg && sz && *beg == ' '; beg++, sz--) | |
17 | ; | |
18 | ||
19 | if (!sz || sz >= sizeof(buf)) { | |
20 | if (end) | |
21 | *end = (char *)str; | |
22 | return 0; | |
23 | } | |
24 | ||
25 | memcpy(buf, beg, sz); | |
26 | buf[sz] = '\0'; | |
27 | ret = strtol(buf, end, base); | |
28 | if (ret == LONG_MIN || ret == LONG_MAX) | |
29 | return ret; | |
30 | if (end) | |
31 | *end = (char *)str + (*end - buf); | |
32 | return ret; | |
33 | } |