Author: cwittich
Date: Sat Sep 10 06:52:50 2016
New Revision: 72641

URL: http://svn.reactos.org/svn/reactos?rev=72641&view=rev
Log:
[CRT] sync wtoi64.c with wine 1.9.16

Modified:
    trunk/reactos/media/doc/README.WINE
    trunk/reactos/sdk/lib/crt/string/wtoi64.c

Modified: trunk/reactos/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=72641&r1=72640&r2=72641&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sat Sep 10 06:52:50 2016
@@ -300,6 +300,7 @@
   reactos/sdk/lib/crt/string/strxfrm.c          # Synced to Wine-1.9.16
   reactos/sdk/lib/crt/string/wcs.c              # Synced at 20080611
   reactos/sdk/lib/crt/string/wctype.c           # Synced at WineStaging-1.9.16
+  reactos/sdk/lib/crt/string/wtoi64.c           # Synced at Wine-1.9.16
   reactos/sdk/lib/crt/wine/heap.c               # Synced at 20080529
   reactos/sdk/lib/crt/wine/undname.c            # Synced to WineStaging-1.9.16
   reactos/sdk/lib/crt/process/thread.c          # Synced to WineStaging-1.7.55

Modified: trunk/reactos/sdk/lib/crt/string/wtoi64.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/lib/crt/string/wtoi64.c?rev=72641&r1=72640&r2=72641&view=diff
==============================================================================
--- trunk/reactos/sdk/lib/crt/string/wtoi64.c   [iso-8859-1] (original)
+++ trunk/reactos/sdk/lib/crt/string/wtoi64.c   [iso-8859-1] Sat Sep 10 
06:52:50 2016
@@ -1,72 +1,196 @@
-/*
- * COPYRIGHT:   See COPYING in the top level directory
- * PROJECT:     ReactOS system libraries
- * FILE:        lib/sdk/crt/string/wtoi64.c
- * PURPOSE:     Unknown
- * PROGRAMER:   Unknown
- * UPDATE HISTORY:
- *              25/11/05: Added license header
+#include <precomp.h>
+#include <internal/wine/msvcrt.h>
+
+/*********************************************************************
+ *              _wtoi64_l (MSVCRT.@)
  */
+__int64 CDECL _wtoi64_l(const wchar_t *str, _locale_t locale)
+{
+    ULONGLONG RunningTotal = 0;
+    BOOL bMinus = FALSE;
 
-#include <precomp.h>
+    while (isspaceW(*str)) {
+        str++;
+    } /* while */
 
-/*
- * @implemented
+    if (*str == '+') {
+        str++;
+    } else if (*str == '-') {
+        bMinus = TRUE;
+        str++;
+    } /* if */
+
+    while (*str >= '0' && *str <= '9') {
+        RunningTotal = RunningTotal * 10 + *str - '0';
+        str++;
+    } /* while */
+
+    return bMinus ? -RunningTotal : RunningTotal;
+}
+
+/*********************************************************************
+ *              _wtoi64 (MSVCRT.@)
  */
-__int64
-CDECL
-_wtoi64 (const wchar_t *nptr)
+__int64 CDECL _wtoi64(const wchar_t *str)
 {
-   int c;
-   __int64 value;
-   int sign;
-
-   if (nptr == NULL)
-       return 0;
-
-   while (iswctype((int)*nptr, _SPACE))
-        ++nptr;
-
-   c = (int)*nptr++;
-   sign = c;
-   if (c == L'-' || c == L'+')
-        c = (int)*nptr++;
-
-   value = 0;
-
-   while (iswctype(c, _DIGIT))
-     {
-        value = 10 * value + (c - L'0');
-        c = (int)*nptr++;
-     }
-
-   if (sign == L'-')
-       return -value;
-   else
-       return value;
+    return _wtoi64_l(str, NULL);
 }
 
 
-/*
- * @unimplemented
+/*********************************************************************
+ *  _wcstoi64_l (MSVCRT.@)
+ *
+ * FIXME: locale parameter is ignored
  */
-__int64
-CDECL
-_wcstoi64 (const wchar_t *nptr, wchar_t **endptr, int base)
+__int64 CDECL _wcstoi64_l(const wchar_t *nptr,
+        wchar_t **endptr, int base, _locale_t locale)
 {
-   TRACE("_wcstoi64 is UNIMPLEMENTED\n");
-   return 0;
+    BOOL negative = FALSE;
+    __int64 ret = 0;
+
+    TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
+
+    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(isspaceW(*nptr)) nptr++;
+
+    if(*nptr == '-') {
+        negative = TRUE;
+        nptr++;
+    } else if(*nptr == '+')
+        nptr++;
+
+    if((base==0 || base==16) && *nptr=='0' && tolowerW(*(nptr+1))=='x') {
+        base = 16;
+        nptr += 2;
+    }
+
+    if(base == 0) {
+        if(*nptr=='0')
+            base = 8;
+        else
+            base = 10;
+    }
+
+    while(*nptr) {
+        wchar_t cur = tolowerW(*nptr);
+        int v;
+
+        if(cur>='0' && cur<='9') {
+            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;
+            *_errno() = ERANGE;
+        } else if(negative && (ret<_I64_MIN/base || ret*base<_I64_MIN-v)) {
+            ret = _I64_MIN;
+            *_errno() = ERANGE;
+        } else
+            ret = ret*base + v;
+    }
+
+    if(endptr)
+        *endptr = (wchar_t*)nptr;
+
+    return ret;
 }
 
-/*
- * @unimplemented
+/*********************************************************************
+ *  _wcstoi64 (MSVCRT.@)
  */
-unsigned __int64
-CDECL
-_wcstoui64 (const wchar_t *nptr, wchar_t **endptr, int base)
+__int64 CDECL _wcstoi64(const wchar_t *nptr,
+        wchar_t **endptr, int base)
 {
-   TRACE("_wcstoui64 is UNIMPLEMENTED\n");
-   return 0;
+    return _wcstoi64_l(nptr, endptr, base, NULL);
+}
+
+/*********************************************************************
+ *  _wcstoui64_l (MSVCRT.@)
+ *
+ * FIXME: locale parameter is ignored
+ */
+unsigned __int64 CDECL _wcstoui64_l(const wchar_t *nptr,
+        wchar_t **endptr, int base, _locale_t locale)
+{
+    BOOL negative = FALSE;
+    unsigned __int64 ret = 0;
+
+    TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
+
+    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(isspaceW(*nptr)) nptr++;
+
+    if(*nptr == '-') {
+        negative = TRUE;
+        nptr++;
+    } else if(*nptr == '+')
+        nptr++;
+
+    if((base==0 || base==16) && *nptr=='0' && tolowerW(*(nptr+1))=='x') {
+        base = 16;
+        nptr += 2;
+    }
+
+    if(base == 0) {
+        if(*nptr=='0')
+            base = 8;
+        else
+            base = 10;
+    }
+
+    while(*nptr) {
+        wchar_t cur = tolowerW(*nptr);
+        int v;
+
+        if(cur>='0' && cur<='9') {
+            if(cur >= '0'+base)
+                break;
+            v = *nptr-'0';
+        } else {
+            if(cur<'a' || cur>='a'+base-10)
+                break;
+            v = cur-'a'+10;
+        }
+
+        nptr++;
+
+        if(ret>_UI64_MAX/base || ret*base>_UI64_MAX-v) {
+            ret = _UI64_MAX;
+            *_errno() = ERANGE;
+        } else
+            ret = ret*base + v;
+    }
+
+    if(endptr)
+        *endptr = (wchar_t*)nptr;
+
+    return negative ? -ret : ret;
+}
+
+/*********************************************************************
+ *  _wcstoui64 (MSVCRT.@)
+ */
+unsigned __int64 CDECL _wcstoui64(const wchar_t *nptr,
+        wchar_t **endptr, int base)
+{
+    return _wcstoui64_l(nptr, endptr, base, NULL);
 }
 
 


Reply via email to