diff options
Diffstat (limited to 'newlib/libc/stdlib/itoa.c')
-rw-r--r-- | newlib/libc/stdlib/itoa.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/newlib/libc/stdlib/itoa.c b/newlib/libc/stdlib/itoa.c new file mode 100644 index 000000000..c7c9b8871 --- /dev/null +++ b/newlib/libc/stdlib/itoa.c @@ -0,0 +1,69 @@ +/* +FUNCTION +<<itoa>>---integer to string + +INDEX + itoa + +ANSI_SYNOPSIS + #include <stdlib.h> + char *itoa(int <[value]>, char *<[str]>, int <[base]>); + char *__itoa(int <[value]>, char *<[str]>, int <[base]>); + +DESCRIPTION +<<itoa>> converts the integer [<value>] to a null-terminated string +using the specified base, which must be between 2 and 36, inclusive. +If <[base]> is 10, <[value]> is treated as signed and the string will be +prefixed with '-' if negative. For all other bases, <[value]> is treated as +unsigned. <[str]> should be an array long enough to contain the converted +value, which in the worst case is sizeof(int)*8+1 bytes. + +RETURNS +A pointer to the string, <[str]>, or NULL if <[base]> is invalid. + +PORTABILITY +<<itoa>> is non-ANSI. + +No supporting OS subroutine calls are required. +*/ + +#include <stdlib.h> + +char * +_DEFUN (__itoa, (value, str, base), + int value _AND + char *str _AND + int base) +{ + unsigned uvalue; + int i = 0; + + /* Check base is supported. */ + if ((base < 2) || (base > 36)) + { + str[0] = '\0'; + return NULL; + } + + /* Negative numbers are only supported for decimal. + * Cast to unsigned to avoid overflow for maximum negative value. */ + if ((base == 10) && (value < 0)) + { + str[i++] = '-'; + uvalue = (unsigned)-value; + } + else + uvalue = (unsigned)value; + + __utoa (uvalue, &str[i], base); + return str; +} + +char * +_DEFUN (itoa, (value, str, base), + int value _AND + char *str _AND + int base) +{ + return __itoa (value, str, base); +} |