Hi,
the strtoull function should work with "long long"s instead of "long"s. A patch is attached. However, it would be better to test for the existence of a 64 bit integral data type and compile this function optionally ...
BTW: It seems that all sources in lib/crtdll/ (except dllmain.c and precomp.h) are unused. Is this correct?
Regards, Mark
Index: lib/crt/stdlib/strtoull.c =================================================================== --- lib/crt/stdlib/strtoull.c (revision 15932) +++ lib/crt/stdlib/strtoull.c (working copy) @@ -4,21 +4,49 @@ #include <ctype.h> #include <errno.h> #include <stdlib.h> -//#include <msvcrt/unconst.h> +/* #include <msvcrt/unconst.h> */
+/* required to get prototype for __set_errno() */ +#include <internal/file.h> + +#if defined(LONG_LONG_MAX) +/* GCC-style constant */ +#define ROS_LLONG_MAX LONG_LONG_MAX +#define ROS_ULLONG_MAX ULONG_LONG_MAX +typedef long long ros_ll; +typedef unsigned long long ros_ull; +#elif defined(_I64_MAX) +/* MSVC-style constant */ +#define ROS_LLONG_MAX _I64_MAX +#define ROS_ULLONG_MAX _UI64_MAX +typedef __int64 ros_ll; +typedef unsigned __int64 ros_ull; +#elif defined(LLONG_MAX) +/* C9x-style constant */ +#define ROS_LLONG_MAX LLONG_MAX +#define ROS_ULLONG_MAX ULLONG_MAX +#include <stdint.h> +typedef int64_t ros_ll; +typedef uint64_t ros_ull; +#else +#define ROS_LLONG_MAX LONG_MAX +#define ROS_ULLONG_MAX ULONG_MAX +typedef long ros_ll; +typedef unsigned long ros_ull; +#endif + /* * Convert a string to an unsigned long integer. * * Ignores `locale' stuff. Assumes that the upper and lower case * alphabets and digits are each contiguous. */ -unsigned long +ros_ull strtoull(const char *nptr, char **endptr, int base) { const char *s = nptr; - unsigned long acc; + ros_ull acc, cutoff; int c; - unsigned long cutoff; int neg = 0, any, cutlim;
/* @@ -43,8 +71,8 @@ } if (base == 0) base = c == '0' ? 8 : 10; - cutoff = (unsigned long)ULONG_MAX / base; - cutlim = (unsigned long)ULONG_MAX % base; + cutoff = (ros_ull)ROS_ULLONG_MAX / base; + cutlim = (int) ((ros_ull)ROS_ULLONG_MAX % base); for (acc = 0, any = 0;; c = *s++) { if (isdigit(c)) @@ -65,7 +93,7 @@ } if (any < 0) { - acc = ULONG_MAX; + acc = ROS_ULLONG_MAX; __set_errno ( ERANGE ); } else if (neg)