From eb9841609781b1255ba695b855286ccdcd0c11a3 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Tue, 24 May 2016 19:27:57 +0000 Subject: [PATCH] =?UTF-8?q?[CRT]=20Partially=20sync=20strtoi64=20with=20Wi?= =?UTF-8?q?ne=20Staging=201.9.9.=20Patch=20by=20Samuel=20Serapi=C3=B3n=20C?= =?UTF-8?q?ORE-11174=20#resolve=20#comment=20Thanks!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=71396 --- reactos/media/doc/README.WINE | 3 +- reactos/sdk/lib/crt/libcntpr.cmake | 1 + reactos/sdk/lib/crt/string/strtoi64.c | 42 +++++++++++--- reactos/sdk/lib/crt/string/strtoul.c | 80 +-------------------------- 4 files changed, 40 insertions(+), 86 deletions(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 32c6d629fe4..c47c70f98e4 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -291,7 +291,8 @@ msvcrt - reactos/lib/sdk/crt/process/_cwait.c # Synced to WineStaging-1.7.37 reactos/lib/sdk/crt/signal/xcptinfo.c # Synced to WineStaging-1.7.37 reactos/lib/sdk/crt/string/scanf.c/h # Synced to Wine-1.7.17 - reactos/lib/sdk/crt/string/strtoul.c # Synced to WineStaging-1.7.37 + reactos/lib/sdk/crt/string/strtoi64.c # Synced to WineStaging-1.9.9 + reactos/lib/sdk/crt/string/strtoul.c # Synced to WineStaging-1.9.9 reactos/lib/sdk/crt/strings/wcs.c # Synced at 20080611 reactos/lib/sdk/crt/wine/heap.c # Synced at 20080529 reactos/lib/sdk/crt/wine/undname.c # Synced to WineStaging-1.7.55 diff --git a/reactos/sdk/lib/crt/libcntpr.cmake b/reactos/sdk/lib/crt/libcntpr.cmake index 1ddacccc064..d00f5bf64dd 100644 --- a/reactos/sdk/lib/crt/libcntpr.cmake +++ b/reactos/sdk/lib/crt/libcntpr.cmake @@ -48,6 +48,7 @@ list(APPEND LIBCNTPR_SOURCE string/itoa.c string/itow.c string/mbstowcs_nt.c + string/strtoi64.c string/strtol.c string/strtoul.c string/strtoull.c diff --git a/reactos/sdk/lib/crt/string/strtoi64.c b/reactos/sdk/lib/crt/string/strtoi64.c index 4c744aece34..5e406983f8d 100644 --- a/reactos/sdk/lib/crt/string/strtoi64.c +++ b/reactos/sdk/lib/crt/string/strtoi64.c @@ -1,13 +1,28 @@ #include +/* Based on Wine Staging 1.9.9 - dlls/msvcrt/string.c */ -__int64 -_strtoi64(const char *nptr, char **endptr, int base) +/********************************************************************* +* _strtoi64_l (MSVCRT.@) +* +* FIXME: locale parameter is ignored +*/ +__int64 CDECL strtoi64_l(const char *nptr, char **endptr, int base, _locale_t locale) { + const char *p = nptr; BOOL negative = FALSE; + BOOL got_digit = FALSE; __int64 ret = 0; - while(isspace((unsigned char)*nptr)) nptr++; +#ifndef _LIBCNT_ + TRACE("(%s %p %d %p)\n", debugstr_a(nptr), endptr, base, locale); +#endif + + if (!MSVCRT_CHECK_PMT(nptr != NULL)) return 0; + if (!MSVCRT_CHECK_PMT(base == 0 || base >= 2)) return 0; + if (!MSVCRT_CHECK_PMT(base <= 36)) return 0; + + while (isspace(*nptr)) nptr++; if(*nptr == '-') { negative = TRUE; @@ -31,7 +46,7 @@ _strtoi64(const char *nptr, char **endptr, int base) char cur = tolower(*nptr); int v; - if(isdigit((unsigned char)cur)) { + if(isdigit(cur)) { if(cur >= '0'+base) break; v = cur-'0'; @@ -40,6 +55,7 @@ _strtoi64(const char *nptr, char **endptr, int base) break; v = cur-'a'+10; } + got_digit = TRUE; if(negative) v = -v; @@ -48,19 +64,31 @@ _strtoi64(const char *nptr, char **endptr, int base) if(!negative && (ret>_I64_MAX/base || ret*base>_I64_MAX-v)) { ret = _I64_MAX; +#ifndef _LIBCNT_ *_errno() = ERANGE; - } else if(negative && (ret<_I64_MIN/base || ret*base<_I64_MIN-v)) { +#endif + } + else if (negative && (ret<_I64_MIN / base || ret*base<_I64_MIN - v)) { ret = _I64_MIN; +#ifndef _LIBCNT_ *_errno() = ERANGE; - } else +#endif + } + else ret = ret*base + v; } if(endptr) - *endptr = (char*)nptr; + *endptr = (char*)(got_digit ? nptr : p); return ret; } +__int64 +_strtoi64(const char *nptr, char **endptr, int base) +{ + return strtoi64_l(nptr, endptr, base, NULL); +} + /* EOF */ diff --git a/reactos/sdk/lib/crt/string/strtoul.c b/reactos/sdk/lib/crt/string/strtoul.c index cef232a31f1..5f35bb9d84a 100644 --- a/reactos/sdk/lib/crt/string/strtoul.c +++ b/reactos/sdk/lib/crt/string/strtoul.c @@ -1,83 +1,7 @@ #include -/* Based on Wine Staging 1.7.37 - dlls/msvcrt/string.c */ - -/********************************************************************* - * _strtoi64_l (MSVCRT.@) - * - * FIXME: locale parameter is ignored - */ -__int64 CDECL strtoi64_l(const char *nptr, char **endptr, int base, _locale_t locale) -{ - BOOL negative = FALSE; - __int64 ret = 0; - -#ifndef _LIBCNT_ - TRACE("(%s %p %d %p)\n", debugstr_a(nptr), endptr, base, locale); -#endif - - if (!MSVCRT_CHECK_PMT(nptr != NULL)) return 0; - if (!MSVCRT_CHECK_PMT(base == 0 || base >= 2)) return 0; - if (!MSVCRT_CHECK_PMT(base <= 36)) return 0; - - while(isspace(*nptr)) nptr++; - - if(*nptr == '-') { - negative = TRUE; - nptr++; - } else if(*nptr == '+') - nptr++; - - if((base==0 || base==16) && *nptr=='0' && tolower(*(nptr+1))=='x') { - base = 16; - nptr += 2; - } - - if(base == 0) { - if(*nptr=='0') - base = 8; - else - base = 10; - } - - while(*nptr) { - char cur = tolower(*nptr); - int v; - - if(isdigit(cur)) { - if(cur >= '0'+base) - break; - v = cur-'0'; - } else { - if(cur<'a' || cur>='a'+base-10) - break; - v = cur-'a'+10; - } - - if(negative) - v = -v; - - nptr++; - - if(!negative && (ret>_I64_MAX/base || ret*base>_I64_MAX-v)) { - ret = _I64_MAX; -#ifndef _LIBCNT_ - *_errno() = ERANGE; -#endif - } else if(negative && (ret<_I64_MIN/base || ret*base<_I64_MIN-v)) { - ret = _I64_MIN; -#ifndef _LIBCNT_ - *_errno() = ERANGE; -#endif - } else - ret = ret*base + v; - } - - if(endptr) - *endptr = (char*)nptr; - - return ret; -} +/* Based on Wine Staging 1.9.9 - dlls/msvcrt/string.c */ +__int64 CDECL strtoi64_l(const char *nptr, char **endptr, int base, _locale_t locale); /****************************************************************** * _strtoul_l (MSVCRT.@)