Author: akhaldi
Date: Mon Jun 1 18:49:52 2015
New Revision: 67995
URL:
http://svn.reactos.org/svn/reactos?rev=67995&view=rev
Log:
[CRT][LIBCNTPR] Adopt strtoul() from Wine Staging 1.7.37. Fixes a msvcrt:string test.
CORE-9246
Modified:
trunk/reactos/lib/sdk/crt/string/strtoul.c
trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/lib/sdk/crt/string/strtoul.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/strtoul…
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/strtoul.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/strtoul.c [iso-8859-1] Mon Jun 1 18:49:52 2015
@@ -1,75 +1,110 @@
#include <precomp.h>
-#include <ctype.h>
-/*
- * Convert a string to an unsigned long integer.
+/* Based on Wine Staging 1.7.37 - dlls/msvcrt/string.c */
+
+/*********************************************************************
+ * _strtoi64_l (MSVCRT.@)
*
- * Ignores `locale' stuff. Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- *
- * @implemented
+ * FIXME: locale parameter is ignored
*/
-unsigned long
-strtoul(const char *nptr, char **endptr, int base)
+__int64 CDECL strtoi64_l(const char *nptr, char **endptr, int base, _locale_t locale)
{
- const char *s = nptr;
- unsigned long acc;
- int c;
- unsigned long cutoff;
- int neg = 0, any, cutlim;
+ BOOL negative = FALSE;
+ __int64 ret = 0;
- /*
- * See strtol for comments as to the logic used.
- */
- do {
- c = *s++;
- } while (isspace(c));
- if (c == '-')
- {
- neg = 1;
- c = *s++;
- }
- else if (c == '+')
- c = *s++;
- if ((base == 0 || base == 16) &&
- c == '0' && (*s == 'x' || *s == 'X'))
- {
- c = s[1];
- s += 2;
- base = 16;
- }
- if (base == 0)
- base = c == '0' ? 8 : 10;
- cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
- cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
- for (acc = 0, any = 0;; c = *s++)
- {
- if (isdigit(c))
- c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
- else
- break;
- if (c >= base)
- break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
- any = -1;
- else {
- any = 1;
- acc *= base;
- acc += c;
+#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 (any < 0)
- {
- acc = ULONG_MAX;
+
+ 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_
- _set_errno(ERANGE);
+ *_errno() = ERANGE;
#endif
- }
- else if (neg)
- acc = 0-acc;
- if (endptr != 0)
- *endptr = any ? (char *)((size_t)(s - 1)) : (char *)((size_t)nptr);
- return acc;
+ } 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.@)
+ */
+unsigned long CDECL strtoul_l(const char* nptr, char** end, int base, _locale_t locale)
+{
+ __int64 ret = strtoi64_l(nptr, end, base, locale);
+
+ if(ret > ULONG_MAX) {
+ ret = ULONG_MAX;
+#ifndef _LIBCNT_
+ *_errno() = ERANGE;
+#endif
+ }else if(ret < -(__int64)ULONG_MAX) {
+ ret = 1;
+#ifndef _LIBCNT_
+ *_errno() = ERANGE;
+#endif
+ }
+
+ return ret;
+}
+
+/******************************************************************
+ * strtoul (MSVCRT.@)
+ */
+unsigned long CDECL strtoul(const char* nptr, char** end, int base)
+{
+ return strtoul_l(nptr, end, base, NULL);
+}
Modified: trunk/reactos/media/doc/README.WINE
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=…
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Mon Jun 1 18:49:52 2015
@@ -286,6 +286,7 @@
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/strings/wcs.c # Synced at 20080611
reactos/lib/sdk/crt/wine/heap.c # Synced at 20080529
reactos/lib/sdk/crt/wine/undname.c # Synced at 20081130