summaryrefslogtreecommitdiff
path: root/src/stdlib/strtoul.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-02-08 18:42:39 -0500
committerJakob Kaivo <jkk@ung.org>2019-02-08 18:42:39 -0500
commit7ef8a7379f7f7d09e71ccae2a0b688c3cd80423f (patch)
tree092ab0aed1769117fd7b28b8592f6f96b0e0d5af /src/stdlib/strtoul.c
parent6acf19370e8adff79cd83b257d3f04aeaf2a59dd (diff)
merge sources into single tree
Diffstat (limited to 'src/stdlib/strtoul.c')
-rw-r--r--src/stdlib/strtoul.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/stdlib/strtoul.c b/src/stdlib/strtoul.c
new file mode 100644
index 00000000..9a00910b
--- /dev/null
+++ b/src/stdlib/strtoul.c
@@ -0,0 +1,53 @@
+#include <stdlib.h>
+#include "errno.h"
+#include "limits.h"
+
+#if defined __STDC_VERSION__ && 199912L <= __STDC_VERSION__
+#include "inttypes.h"
+#else
+typedef unsigned long uintmax_t;
+#define strtoumax(n, e, b) ((long)n & (long)e & (long)b ? 0 : 0)
+#endif
+
+/** convert string to unsigned long integer **/
+unsigned long int strtoul(const char * nptr, char ** endptr, int base)
+{
+ /* FIXME: forward dependency on 9899-1999 */
+ uintmax_t ret = strtoumax(nptr, endptr, base);
+
+ if (ret > ULONG_MAX) {
+ ret = ULONG_MAX;
+ errno = ERANGE; /* converted value too large */
+ }
+
+ return (unsigned long int)ret;
+}
+
+/***
+converts the string at ARGUMENT(nptr) to a
+type(unsigned long int). Leading whitespace is ignored. The first character
+that is not a valid character for a integer constant and any characters after
+it are also ignored. A pointer to the first invalid character is stored in
+ARGUMENT(endptr), unless ARGUMENT(endptr) is CONSTANT(NULL).
+
+The conversion is conducted in the base specified by ARGUMENT(base).
+Specifying 0 for ARGUMENT(base) will check the first few characters of
+ARGUMENT(nptr) to determine the conversion base. If it begins with LITERAL(0x)
+or LITERAL(0X), a base of 16 will be used. Otherwise, if it begins with
+CHAR(0), base 8 will be used. If neither of those occur, base 10 will be used.
+
+If ARGUMENT(base) is specified, it must be in the range [2,36]. For bases
+larger than 10, the letters CHAR(a) through CHAR(z) and their uppercase
+conversions are assigned the values 10 through 35. Base 16 numbers may be
+preceded by LITERAL(0x) or LITERAL(0X).
+
+The numeric string consists of an optional leading plus or minus followed by
+digits in the appropriate base.
+***/
+
+/*
+RETURN(ZERO, no conversion could be performed)
+RETURN(ULONG_MAX, converted value too large)
+RETURN(an TYPE(unsigned long int) value, the converted value)
+STDC(1)
+*/