1 /* taken from wine ntdll and msvcrt string.c */
9 _i64toa(__int64 value
, char *string
, int radix
)
17 if (value
< 0 && radix
== 10) {
34 *--pos
= 'a' + digit
- 10;
42 memcpy(string
, pos
, &buffer
[64] - pos
+ 1);
49 int CDECL
_i64toa_s(__int64 value
, char *str
, size_t size
, int radix
)
54 char buffer
[65], *pos
;
57 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
58 !MSVCRT_CHECK_PMT(radix
>= 2) || !MSVCRT_CHECK_PMT(radix
<= 36))
68 if (value
< 0 && radix
== 10)
90 *--pos
= 'a' + digit
- 10;
97 len
= buffer
+ 65 - pos
;
103 /* Copy the temporary buffer backwards up to the available number of
104 * characters. Don't copy the negative sign if present. */
112 for (pos
= buffer
+ 63, i
= 0; i
< size
; i
++)
116 MSVCRT_INVALID_PMT("str[size] is too small");
123 memcpy(str
, pos
, len
);
131 _ui64toa(unsigned __int64 value
, char *string
, int radix
)
141 digit
= value
% radix
;
142 value
= value
/ radix
;
144 *--pos
= '0' + digit
;
146 *--pos
= 'a' + digit
- 10;
148 } while (value
!= 0L);
150 memcpy(string
, pos
, &buffer
[64] - pos
+ 1);
157 int CDECL
_ui64toa_s(unsigned __int64 value
, char *str
,
158 size_t size
, int radix
)
160 char buffer
[65], *pos
;
163 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
164 !MSVCRT_CHECK_PMT(radix
>=2) || !MSVCRT_CHECK_PMT(radix
<=36)) {
181 *--pos
= 'a'+digit
-10;
184 if((unsigned)(buffer
-pos
+65) > size
) {
185 MSVCRT_INVALID_PMT("str[size] is too small");
192 memcpy(str
, pos
, buffer
-pos
+65);
199 int CDECL
_itoa_s(int value
, char *str
, size_t size
, int radix
)
201 return _ltoa_s(value
, str
, size
, radix
);
208 _itoa(int value
, char *string
, int radix
)
210 return _ltoa(value
, string
, radix
);
217 _ltoa(long value
, char *string
, int radix
)
225 if (value
< 0 && radix
== 10) {
240 *--pos
= '0' + digit
;
242 *--pos
= 'a' + digit
- 10;
250 memcpy(string
, pos
, &buffer
[32] - pos
+ 1);
257 int CDECL
_ltoa_s(long value
, char *str
, size_t size
, int radix
)
262 char buffer
[33], *pos
;
265 if (!MSVCRT_CHECK_PMT(str
!= NULL
) || !MSVCRT_CHECK_PMT(size
> 0) ||
266 !MSVCRT_CHECK_PMT(radix
>= 2) || !MSVCRT_CHECK_PMT(radix
<= 36))
277 if (value
< 0 && radix
== 10)
297 *--pos
= '0' + digit
;
299 *--pos
= 'a' + digit
- 10;
306 len
= buffer
+ 33 - pos
;
312 /* Copy the temporary buffer backwards up to the available number of
313 * characters. Don't copy the negative sign if present. */
321 for (pos
= buffer
+ 31, i
= 0; i
< size
; i
++)
325 MSVCRT_INVALID_PMT("str[size] is too small");
332 memcpy(str
, pos
, len
);
340 _ultoa(unsigned long value
, char *string
, int radix
)
350 digit
= value
% radix
;
351 value
= value
/ radix
;
353 *--pos
= '0' + digit
;
355 *--pos
= 'a' + digit
- 10;
357 } while (value
!= 0L);
359 memcpy(string
, pos
, &buffer
[32] - pos
+ 1);