15a4bae0225a2f4814e61cd99013f9863fcf02d2
2 #include <internal/wine/msvcrt.h>
4 /*********************************************************************
7 __int64 CDECL
_wtoi64_l(const wchar_t *str
, _locale_t locale
)
9 ULONGLONG RunningTotal
= 0;
12 while (iswctype((int)*str
, _SPACE
)) {
18 } else if (*str
== '-') {
23 while (*str
>= '0' && *str
<= '9') {
24 RunningTotal
= RunningTotal
* 10 + *str
- '0';
28 return bMinus
? -RunningTotal
: RunningTotal
;
31 /*********************************************************************
34 __int64 CDECL
_wtoi64(const wchar_t *str
)
36 return _wtoi64_l(str
, NULL
);
40 /*********************************************************************
41 * _wcstoi64_l (MSVCRT.@)
43 * FIXME: locale parameter is ignored
45 __int64 CDECL
_wcstoi64_l(const wchar_t *nptr
,
46 wchar_t **endptr
, int base
, _locale_t locale
)
48 BOOL negative
= FALSE
;
52 TRACE("(%s %p %d %p)\n", debugstr_w(nptr
), endptr
, base
, locale
);
55 if (!MSVCRT_CHECK_PMT(nptr
!= NULL
)) return 0;
56 if (!MSVCRT_CHECK_PMT(base
== 0 || base
>= 2)) return 0;
57 if (!MSVCRT_CHECK_PMT(base
<= 36)) return 0;
59 while (iswctype((int)*nptr
, _SPACE
)) nptr
++;
64 } else if(*nptr
== '+')
67 if((base
==0 || base
==16) && *nptr
=='0' && towlower(*(nptr
+1))=='x') {
80 wchar_t cur
= towlower(*nptr
);
83 if(cur
>='0' && cur
<='9') {
88 if(cur
<'a' || cur
>='a'+base
-10)
98 if(!negative
&& (ret
>_I64_MAX
/base
|| ret
*base
>_I64_MAX
-v
)) {
103 } else if(negative
&& (ret
<_I64_MIN
/base
|| ret
*base
<_I64_MIN
-v
)) {
113 *endptr
= (wchar_t*)nptr
;
118 /*********************************************************************
119 * _wcstoi64 (MSVCRT.@)
121 __int64 CDECL
_wcstoi64(const wchar_t *nptr
,
122 wchar_t **endptr
, int base
)
124 return _wcstoi64_l(nptr
, endptr
, base
, NULL
);
127 /*********************************************************************
128 * _wcstoui64_l (MSVCRT.@)
130 * FIXME: locale parameter is ignored
132 unsigned __int64 CDECL
_wcstoui64_l(const wchar_t *nptr
,
133 wchar_t **endptr
, int base
, _locale_t locale
)
135 BOOL negative
= FALSE
;
136 unsigned __int64 ret
= 0;
139 TRACE("(%s %p %d %p)\n", debugstr_w(nptr
), endptr
, base
, locale
);
142 if (!MSVCRT_CHECK_PMT(nptr
!= NULL
)) return 0;
143 if (!MSVCRT_CHECK_PMT(base
== 0 || base
>= 2)) return 0;
144 if (!MSVCRT_CHECK_PMT(base
<= 36)) return 0;
146 while (iswctype((int)*nptr
, _SPACE
)) nptr
++;
151 } else if(*nptr
== '+')
154 if((base
==0 || base
==16) && *nptr
=='0' && towlower(*(nptr
+1))=='x') {
167 wchar_t cur
= towlower(*nptr
);
170 if(cur
>='0' && cur
<='9') {
175 if(cur
<'a' || cur
>='a'+base
-10)
182 if(ret
>_UI64_MAX
/base
|| ret
*base
>_UI64_MAX
-v
) {
192 *endptr
= (wchar_t*)nptr
;
194 return negative
? -ret
: ret
;
197 /*********************************************************************
198 * _wcstoui64 (MSVCRT.@)
200 unsigned __int64 CDECL
_wcstoui64(const wchar_t *nptr
,
201 wchar_t **endptr
, int base
)
203 return _wcstoui64_l(nptr
, endptr
, base
, NULL
);