1 /* taken from wine ntdll and msvcrt string.c */
10 _i64toa(__int64 value
, char *string
, int radix
)
18 if (value
< 0 && radix
== 10) {
35 *--pos
= 'a' + digit
- 10;
43 memcpy(string
, pos
, &buffer
[64] - pos
+ 1);
50 int CDECL
_i64toa_s(__int64 value
, char *str
, size_t size
, int radix
)
55 char buffer
[65], *pos
;
58 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
59 !MSVCRT_CHECK_PMT(radix
>= 2) || !MSVCRT_CHECK_PMT(radix
<= 36))
69 if (value
< 0 && radix
== 10)
91 *--pos
= 'a' + digit
- 10;
98 len
= buffer
+ 65 - pos
;
104 /* Copy the temporary buffer backwards up to the available number of
105 * characters. Don't copy the negative sign if present. */
113 for (pos
= buffer
+ 63, i
= 0; i
< size
; i
++)
117 MSVCRT_INVALID_PMT("str[size] is too small", ERANGE
);
121 memcpy(str
, pos
, len
);
130 _ui64toa(unsigned __int64 value
, char *string
, int radix
)
140 digit
= value
% radix
;
141 value
= value
/ radix
;
143 *--pos
= '0' + digit
;
145 *--pos
= 'a' + digit
- 10;
147 } while (value
!= 0L);
149 memcpy(string
, pos
, &buffer
[64] - pos
+ 1);
156 int CDECL
_ui64toa_s(unsigned __int64 value
, char *str
,
157 size_t size
, int radix
)
159 char buffer
[65], *pos
;
162 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
163 !MSVCRT_CHECK_PMT(radix
>=2) || !MSVCRT_CHECK_PMT(radix
<=36)) {
180 *--pos
= 'a'+digit
-10;
183 if((unsigned)(buffer
-pos
+65) > size
) {
184 MSVCRT_INVALID_PMT("str[size] is too small", EINVAL
);
188 memcpy(str
, pos
, buffer
-pos
+65);
195 int CDECL
_itoa_s(int value
, char *str
, size_t size
, int radix
)
197 return _ltoa_s(value
, str
, size
, radix
);
205 _itoa(int value
, char *string
, int radix
)
207 return _ltoa(value
, string
, radix
);
215 _ltoa(long value
, char *string
, int radix
)
223 if (value
< 0 && radix
== 10) {
238 *--pos
= '0' + digit
;
240 *--pos
= 'a' + digit
- 10;
248 memcpy(string
, pos
, &buffer
[32] - pos
+ 1);
255 int CDECL
_ltoa_s(long value
, char *str
, size_t size
, int radix
)
260 char buffer
[33], *pos
;
263 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
264 !MSVCRT_CHECK_PMT(radix
>= 2) || !MSVCRT_CHECK_PMT(radix
<= 36))
275 if (value
< 0 && radix
== 10)
295 *--pos
= '0' + digit
;
297 *--pos
= 'a' + digit
- 10;
304 len
= buffer
+ 33 - pos
;
310 /* Copy the temporary buffer backwards up to the available number of
311 * characters. Don't copy the negative sign if present. */
319 for (pos
= buffer
+ 31, i
= 0; i
< size
; i
++)
323 MSVCRT_INVALID_PMT("str[size] is too small", ERANGE
);
327 memcpy(str
, pos
, len
);
336 _ultoa(unsigned long value
, char *string
, int radix
)
346 digit
= value
% radix
;
347 value
= value
/ radix
;
349 *--pos
= '0' + digit
;
351 *--pos
= 'a' + digit
- 10;
353 } while (value
!= 0L);
355 memcpy(string
, pos
, &buffer
[32] - pos
+ 1);