diff --git a/Makefile b/Makefile index ff109da..3ec6217 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ SRCS = ft_memset.c \ ft_tolower.c \ \ ft_strlen.c \ + ft_nbrlen.c \ ft_strchr.c \ ft_strrchr.c \ ft_strchrset.c \ @@ -75,6 +76,7 @@ SRCS = ft_memset.c \ ft_atoll_superscript.c \ ft_atof.c \ ft_itoa.c \ + ft_itoa_static.c \ ft_utoa.c \ ft_atoibase.c \ \ diff --git a/includes/libft.h b/includes/libft.h index 7f1ffc7..3c34427 100644 --- a/includes/libft.h +++ b/includes/libft.h @@ -27,6 +27,7 @@ void *ft_memmove(void *dst, const void *src, size_t len); void *ft_memchr(const void *s, int c, size_t n); int ft_memcmp(const void *s1, const void *s2, size_t n); size_t ft_strlen(const char *str); +size_t ft_nbrlen(int nbr); int ft_isalpha(int c); int ft_isdigit(int c); int ft_isdigit_superscript(const char *input, int *size); @@ -60,6 +61,7 @@ size_t ft_strjoin_static(char *dst, size_t dst_size, const char **srcs, size_t n char *ft_strtrim(char const *s1, char const *set); char **ft_split(char const *s, char c); char *ft_itoa(long int n); +char *ft_itoa_static(long int nbr, char *buffer, size_t nbr_len); char *ft_utoa(unsigned long int n); char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); diff --git a/srcs/ft_itoa_static.c b/srcs/ft_itoa_static.c new file mode 100644 index 0000000..2f8189f --- /dev/null +++ b/srcs/ft_itoa_static.c @@ -0,0 +1,82 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/11/25 13:59:01 by hulamy #+# #+# */ +/* Updated: 2020/02/19 15:44:04 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +/** + * Converts a long integer to its string representation and stores it in a pre-allocated buffer. + * + * @param nbr The long integer to convert. + * @param buffer The buffer to store the resulting string. Must be pre-allocated. + * @param buff_len The size of the buffer. + * Must be at least as large as the length of the number (including sign). + * + * @return The buffer (if successful), or NULL if the buffer is too small or invalid. + */ + +#include "libft.h" + +char *ft_itoa_static(long int nbr, char *buffer, size_t buff_len) +{ + int is_negative; + const char *min_str; + size_t min_len; + size_t i; + + if (buffer == NULL || buff_len == 0) + { + return NULL; // Invalid buffer or length + } + + // Handle LONG_MIN separately + if (nbr == LONG_MIN) + { + min_str = "-9223372036854775808"; + min_len = ft_strlen(min_str); + if (buff_len < min_len) + { + return NULL; // Buffer too small for LONG_MIN + } + i = 0; + while (i < min_len) + { + buffer[i] = min_str[i]; + i++; + } + buffer[min_len] = '\0'; // Null-terminate + return buffer; + } + + // Determine if the number is negative + is_negative = ft_sign_f(nbr); + if (is_negative) + { + nbr = -nbr; // Make nbr positive for processing + } + + // Write the null terminator at the end + buffer[buff_len] = '\0'; + + // Write the digits in reverse order + i = buff_len - 1; + do + { + buffer[i--] = (nbr % 10) + '0'; + nbr /= 10; + } while (nbr != 0); + + // Add the negative sign if needed + if (is_negative) + { + buffer[0] = '-'; + } + + return buffer; +} diff --git a/srcs/ft_nbrlen.c b/srcs/ft_nbrlen.c new file mode 100644 index 0000000..28ac6ff --- /dev/null +++ b/srcs/ft_nbrlen.c @@ -0,0 +1,16 @@ + +#include "libft.h" + +// return length of int +// eg. 123 -> 3, -123 -> 4 + +size_t ft_nbrlen(int nbr) +{ + int len; + + len = (nbr < 0) ? 2 : 1; + while (nbr /= 10) + len++; + + return len; +} \ No newline at end of file