Module: wine Branch: master Commit: a449b2d57b6ad84f11c90346e01b8acef546b4f5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a449b2d57b6ad84f11c90346e0...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Sep 25 14:41:52 2013 +0200
msvcrt: Call MSVCRT_strtoi64_l in strtoul implementation.
---
dlls/msvcrt/string.c | 47 ++++++++++++++++--------------------------- dlls/msvcrt/tests/string.c | 20 ++++++++++++++++++ 2 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index cdce4a2..861389b 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -726,35 +726,6 @@ int CDECL __STRINGTOLD( MSVCRT__LDOUBLE *value, char **endptr, const char *str, return 0; }
-/****************************************************************** - * strtoul (MSVCRT.@) - */ -MSVCRT_ulong CDECL MSVCRT_strtoul(const char* nptr, char** end, int base) -{ - /* wrapper to forward libc error code to msvcrt's error codes */ - unsigned long ret; - - errno = 0; - ret = strtoul(nptr, end, base); - switch (errno) - { - case ERANGE: *MSVCRT__errno() = MSVCRT_ERANGE; break; - case EINVAL: *MSVCRT__errno() = MSVCRT_EINVAL; break; - default: - /* cope with the fact that we may use 64bit long integers on libc - * while msvcrt always uses 32bit long integers - */ - if (ret > MSVCRT_ULONG_MAX) - { - ret = MSVCRT_ULONG_MAX; - *MSVCRT__errno() = MSVCRT_ERANGE; - } - break; - } - - return ret; -} - /********************************************************************* * strlen (MSVCRT.@) */ @@ -918,6 +889,24 @@ MSVCRT_long CDECL MSVCRT_strtol(const char* nptr, char** end, int base) return ret; }
+/****************************************************************** + * strtoul (MSVCRT.@) + */ +MSVCRT_ulong CDECL MSVCRT_strtoul(const char* nptr, char** end, int base) +{ + __int64 ret = MSVCRT_strtoi64_l(nptr, end, base, NULL); + + if(ret > MSVCRT_ULONG_MAX) { + ret = MSVCRT_ULONG_MAX; + *MSVCRT__errno() = MSVCRT_ERANGE; + }else if(ret < -(__int64)MSVCRT_ULONG_MAX) { + ret = 1; + *MSVCRT__errno() = MSVCRT_ERANGE; + } + + return ret; +} + /********************************************************************* * _strtoui64_l (MSVCRT.@) * diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index dc90b38..3877d18 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -1341,6 +1341,26 @@ static void test_strtol(void) ul = strtoul("9223372036854775807L", &e, 0); ok(ul==4294967295ul, "wrong value %u\n", ul); ok(errno == ERANGE, "wrong errno %d\n", errno); + + errno = 0; + ul = strtoul("-2", NULL, 0); + ok(ul == -2, "wrong value %u\n", ul); + ok(errno == 0, "wrong errno %d\n", errno); + + errno = 0; + ul = strtoul("-4294967294", NULL, 0); + ok(ul == 2, "wrong value %u\n", ul); + ok(errno == 0, "wrong errno %d\n", errno); + + errno = 0; + ul = strtoul("-4294967295", NULL, 0); + ok(ul==1, "wrong value %u\n", ul); + ok(errno == 0, "wrong errno %d\n", errno); + + errno = 0; + ul = strtoul("-4294967296", NULL, 0); + ok(ul == 1, "wrong value %u\n", ul); + ok(errno == ERANGE, "wrong errno %d\n", errno); }
static void test_strnlen(void)