Alexandre Julliard : ntdll: Add _wcstoui64.

Alexandre Julliard julliard at winehq.org
Thu Jun 30 16:34:19 CDT 2022


Module: wine
Branch: master
Commit: 9dcfda023332d6f39eca531574ba2bc6e149e7ba
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9dcfda023332d6f39eca531574ba2bc6e149e7ba

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun 30 11:05:00 2022 +0200

ntdll: Add _wcstoui64.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/ntdll.spec |  1 +
 dlls/ntdll/wcstring.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 2ed68e1bc5d..ca896902762 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1541,6 +1541,7 @@
 @ cdecl _wcslwr_s(wstr long)
 @ cdecl _wcsnicmp(wstr wstr long)
 @ cdecl -ret64 _wcstoi64(wstr ptr long)
+@ cdecl -ret64 _wcstoui64(wstr ptr long)
 @ cdecl _wcsupr(wstr)
 @ cdecl _wcsupr_s(wstr long)
 @ cdecl _wtoi(wstr)
diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c
index 06447248235..192bd9e9a46 100644
--- a/dlls/ntdll/wcstring.c
+++ b/dlls/ntdll/wcstring.c
@@ -800,6 +800,50 @@ __int64 __cdecl _wcstoi64( const wchar_t *s, wchar_t **end, int base )
 }
 
 
+/*********************************************************************
+ *                  _wcstoui64  (NTDLL.@)
+ */
+unsigned __int64 __cdecl _wcstoui64( const wchar_t *s, wchar_t **end, int base )
+{
+    BOOL negative = FALSE, empty = TRUE;
+    unsigned __int64 ret = 0;
+
+    if (base < 0 || base == 1 || base > 36) return 0;
+    if (end) *end = (wchar_t *)s;
+    while (iswspace(*s)) s++;
+
+    if (*s == '-')
+    {
+        negative = TRUE;
+        s++;
+    }
+    else if (*s == '+') s++;
+
+    if ((base == 0 || base == 16) && !wctoint( *s ) && (s[1] == 'x' || s[1] == 'X'))
+    {
+        base = 16;
+        s += 2;
+    }
+    if (base == 0) base = wctoint( *s ) ? 10 : 8;
+
+    while (*s)
+    {
+        int v = wctoint( *s );
+        if (v < 0 || v >= base) break;
+        s++;
+        empty = FALSE;
+
+        if (ret > UI64_MAX / base || ret * base > UI64_MAX - v)
+            ret = UI64_MAX;
+        else
+            ret = ret * base + v;
+    }
+
+    if (end && !empty) *end = (wchar_t *)s;
+    return negative ? -ret : ret;
+}
+
+
 /*********************************************************************
  *      _ultow   (NTDLL.@)
  *




More information about the wine-cvs mailing list