mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 18:35:41 +00:00
[CRT] Partially sync strtoi64 with Wine Staging 1.9.9. Patch by Samuel Serapión CORE-11174 #resolve #comment Thanks!
svn path=/trunk/; revision=71396
This commit is contained in:
parent
fff779dd5b
commit
eb98416097
4 changed files with 40 additions and 86 deletions
|
@ -291,7 +291,8 @@ msvcrt -
|
||||||
reactos/lib/sdk/crt/process/_cwait.c # Synced to WineStaging-1.7.37
|
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/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/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/strings/wcs.c # Synced at 20080611
|
||||||
reactos/lib/sdk/crt/wine/heap.c # Synced at 20080529
|
reactos/lib/sdk/crt/wine/heap.c # Synced at 20080529
|
||||||
reactos/lib/sdk/crt/wine/undname.c # Synced to WineStaging-1.7.55
|
reactos/lib/sdk/crt/wine/undname.c # Synced to WineStaging-1.7.55
|
||||||
|
|
|
@ -48,6 +48,7 @@ list(APPEND LIBCNTPR_SOURCE
|
||||||
string/itoa.c
|
string/itoa.c
|
||||||
string/itow.c
|
string/itow.c
|
||||||
string/mbstowcs_nt.c
|
string/mbstowcs_nt.c
|
||||||
|
string/strtoi64.c
|
||||||
string/strtol.c
|
string/strtol.c
|
||||||
string/strtoul.c
|
string/strtoul.c
|
||||||
string/strtoull.c
|
string/strtoull.c
|
||||||
|
|
|
@ -1,13 +1,28 @@
|
||||||
#include <precomp.h>
|
#include <precomp.h>
|
||||||
|
|
||||||
|
/* 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 negative = FALSE;
|
||||||
|
BOOL got_digit = FALSE;
|
||||||
__int64 ret = 0;
|
__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 == '-') {
|
if(*nptr == '-') {
|
||||||
negative = TRUE;
|
negative = TRUE;
|
||||||
|
@ -31,7 +46,7 @@ _strtoi64(const char *nptr, char **endptr, int base)
|
||||||
char cur = tolower(*nptr);
|
char cur = tolower(*nptr);
|
||||||
int v;
|
int v;
|
||||||
|
|
||||||
if(isdigit((unsigned char)cur)) {
|
if(isdigit(cur)) {
|
||||||
if(cur >= '0'+base)
|
if(cur >= '0'+base)
|
||||||
break;
|
break;
|
||||||
v = cur-'0';
|
v = cur-'0';
|
||||||
|
@ -40,6 +55,7 @@ _strtoi64(const char *nptr, char **endptr, int base)
|
||||||
break;
|
break;
|
||||||
v = cur-'a'+10;
|
v = cur-'a'+10;
|
||||||
}
|
}
|
||||||
|
got_digit = TRUE;
|
||||||
|
|
||||||
if(negative)
|
if(negative)
|
||||||
v = -v;
|
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)) {
|
if(!negative && (ret>_I64_MAX/base || ret*base>_I64_MAX-v)) {
|
||||||
ret = _I64_MAX;
|
ret = _I64_MAX;
|
||||||
|
#ifndef _LIBCNT_
|
||||||
*_errno() = ERANGE;
|
*_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;
|
ret = _I64_MIN;
|
||||||
|
#ifndef _LIBCNT_
|
||||||
*_errno() = ERANGE;
|
*_errno() = ERANGE;
|
||||||
} else
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
ret = ret*base + v;
|
ret = ret*base + v;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(endptr)
|
if(endptr)
|
||||||
*endptr = (char*)nptr;
|
*endptr = (char*)(got_digit ? nptr : p);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__int64
|
||||||
|
_strtoi64(const char *nptr, char **endptr, int base)
|
||||||
|
{
|
||||||
|
return strtoi64_l(nptr, endptr, base, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,83 +1,7 @@
|
||||||
#include <precomp.h>
|
#include <precomp.h>
|
||||||
|
|
||||||
/* Based on Wine Staging 1.7.37 - dlls/msvcrt/string.c */
|
/* 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);
|
||||||
/*********************************************************************
|
|
||||||
* _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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* _strtoul_l (MSVCRT.@)
|
* _strtoul_l (MSVCRT.@)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue