[CRT] Partially sync strtoi64 with Wine Staging 1.9.9. Patch by Samuel SerapiĆ³n CORE...
authorMark Jansen <mark.jansen@reactos.org>
Tue, 24 May 2016 19:27:57 +0000 (19:27 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Tue, 24 May 2016 19:27:57 +0000 (19:27 +0000)
svn path=/trunk/; revision=71396

reactos/media/doc/README.WINE
reactos/sdk/lib/crt/libcntpr.cmake
reactos/sdk/lib/crt/string/strtoi64.c
reactos/sdk/lib/crt/string/strtoul.c

index 32c6d62..c47c70f 100644 (file)
@@ -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
index 1ddaccc..d00f5bf 100644 (file)
@@ -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
index 4c744ae..5e40698 100644 (file)
@@ -1,13 +1,28 @@
 #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 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 */
index cef232a..5f35bb9 100644 (file)
@@ -1,83 +1,7 @@
 #include <precomp.h>
 
-/* 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.@)