Module: wine Branch: master Commit: ae1202cef0273fb8dc728d8f039062ea3aa2911f URL: https://source.winehq.org/git/wine.git/?a=commit;h=ae1202cef0273fb8dc728d8f0...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 30 11:04:36 2022 +0200
ntdll: Add _wcstoi64.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/wcstring.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 2a119c9a508..2ed68e1bc5d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1540,6 +1540,7 @@ @ cdecl _wcslwr(wstr) @ cdecl _wcslwr_s(wstr long) @ cdecl _wcsnicmp(wstr wstr long) +@ cdecl -ret64 _wcstoi64(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 97d67ee38d0..06447248235 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -22,6 +22,7 @@
#include <ctype.h> #include <errno.h> +#include <limits.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> @@ -752,6 +753,53 @@ __msvcrt_ulong __cdecl wcstoul(LPCWSTR s, LPWSTR *end, INT base) }
+/********************************************************************* + * _wcstoi64 (NTDLL.@) + */ +__int64 __cdecl _wcstoi64( const wchar_t *s, wchar_t **end, int base ) +{ + BOOL negative = FALSE, empty = TRUE; + __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; + if (negative) v = -v; + s++; + empty = FALSE; + + if (!negative && (ret > I64_MAX / base || ret * base > I64_MAX - v)) + ret = I64_MAX; + else if (negative && (ret < I64_MIN / base || ret * base < I64_MIN - v)) + ret = I64_MIN; + else + ret = ret * base + v; + } + + if (end && !empty) *end = (wchar_t *)s; + return ret; +} + + /********************************************************************* * _ultow (NTDLL.@) *