From a8f7e6e83bc4846c94c0489e0f6e0f807b35073e Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Sat, 21 Feb 2026 16:29:51 +0100 Subject: Implement libft Part 2 with tests Add ft_substr, ft_strjoin, ft_strtrim, ft_split, ft_itoa, ft_strmapi, ft_striteri, ft_putchar_fd, ft_putstr_fd, ft_putendl_fd, ft_putnbr_fd. --- src/ft_itoa.c | 45 +++++++++++++++++++++++++++++++++++ src/ft_putchar_fd.c | 7 ++++++ src/ft_putendl_fd.c | 9 +++++++ src/ft_putnbr_fd.c | 21 +++++++++++++++++ src/ft_putstr_fd.c | 8 +++++++ src/ft_split.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ft_striteri.c | 14 +++++++++++ src/ft_strjoin.c | 19 +++++++++++++++ src/ft_strmapi.c | 23 ++++++++++++++++++ src/ft_strtrim.c | 25 ++++++++++++++++++++ src/ft_substr.c | 23 ++++++++++++++++++ 11 files changed, 261 insertions(+) create mode 100644 src/ft_itoa.c create mode 100644 src/ft_putchar_fd.c create mode 100644 src/ft_putendl_fd.c create mode 100644 src/ft_putnbr_fd.c create mode 100644 src/ft_putstr_fd.c create mode 100644 src/ft_split.c create mode 100644 src/ft_striteri.c create mode 100644 src/ft_strjoin.c create mode 100644 src/ft_strmapi.c create mode 100644 src/ft_strtrim.c create mode 100644 src/ft_substr.c (limited to 'src') diff --git a/src/ft_itoa.c b/src/ft_itoa.c new file mode 100644 index 0000000..05f3fae --- /dev/null +++ b/src/ft_itoa.c @@ -0,0 +1,45 @@ +#include "libft.h" +#include + +static size_t +_s_numlen (int n) +{ + size_t len; + + len = 1; + if (n < 0) + len++; + while (n / 10) + { + len++; + n /= 10; + } + return (len); +} + +char * +ft_itoa (int n) +{ + size_t len; + char *str; + unsigned int nb; + + len = _s_numlen (n); + str = malloc (len + 1); + if (!str) + return (NULL); + str[len] = '\0'; + if (n < 0) + { + str[0] = '-'; + nb = -n; + } + else + nb = n; + while (len > 0 && str[len - 1] != '-') + { + str[--len] = '0' + nb % 10; + nb /= 10; + } + return (str); +} diff --git a/src/ft_putchar_fd.c b/src/ft_putchar_fd.c new file mode 100644 index 0000000..9885816 --- /dev/null +++ b/src/ft_putchar_fd.c @@ -0,0 +1,7 @@ +#include + +void +ft_putchar_fd (char c, int fd) +{ + write (fd, &c, 1); +} diff --git a/src/ft_putendl_fd.c b/src/ft_putendl_fd.c new file mode 100644 index 0000000..f7c7334 --- /dev/null +++ b/src/ft_putendl_fd.c @@ -0,0 +1,9 @@ +#include "libft.h" +#include + +void +ft_putendl_fd (char *s, int fd) +{ + write (fd, s, ft_strlen (s)); + write (fd, "\n", 1); +} diff --git a/src/ft_putnbr_fd.c b/src/ft_putnbr_fd.c new file mode 100644 index 0000000..031f9f6 --- /dev/null +++ b/src/ft_putnbr_fd.c @@ -0,0 +1,21 @@ +#include "libft.h" +#include + +void +ft_putnbr_fd (int n, int fd) +{ + char c; + unsigned int nb; + + if (n < 0) + { + write (fd, "-", 1); + nb = -n; + } + else + nb = n; + if (nb >= 10) + ft_putnbr_fd (nb / 10, fd); + c = '0' + nb % 10; + write (fd, &c, 1); +} diff --git a/src/ft_putstr_fd.c b/src/ft_putstr_fd.c new file mode 100644 index 0000000..663af0d --- /dev/null +++ b/src/ft_putstr_fd.c @@ -0,0 +1,8 @@ +#include "libft.h" +#include + +void +ft_putstr_fd (char *s, int fd) +{ + write (fd, s, ft_strlen (s)); +} diff --git a/src/ft_split.c b/src/ft_split.c new file mode 100644 index 0000000..bb51c85 --- /dev/null +++ b/src/ft_split.c @@ -0,0 +1,67 @@ +#include "libft.h" +#include + +static size_t +_s_count_words (char const *s, char c) +{ + size_t count; + + count = 0; + while (*s) + { + while (*s == c) + s++; + if (*s) + { + count++; + while (*s && *s != c) + s++; + } + } + return (count); +} + +static void +_s_free_all (char **arr, size_t n) +{ + size_t i; + + i = 0; + while (i < n) + free (arr[i++]); + free (arr); +} + +char ** +ft_split (char const *s, char c) +{ + size_t count; + char **arr; + size_t i; + + count = _s_count_words (s, c); + arr = malloc ((count + 1) * sizeof (char *)); + if (!arr) + return (NULL); + i = 0; + while (*s) + { + while (*s == c) + s++; + if (*s) + { + const char *start = s; + while (*s && *s != c) + s++; + arr[i] = ft_substr (start, 0, s - start); + if (!arr[i]) + { + _s_free_all (arr, i); + return (NULL); + } + i++; + } + } + arr[i] = NULL; + return (arr); +} diff --git a/src/ft_striteri.c b/src/ft_striteri.c new file mode 100644 index 0000000..ba701db --- /dev/null +++ b/src/ft_striteri.c @@ -0,0 +1,14 @@ +#include "libft.h" + +void +ft_striteri (char *s, void (*f) (unsigned int, char *)) +{ + unsigned int i; + + i = 0; + while (s[i]) + { + f (i, &s[i]); + i++; + } +} diff --git a/src/ft_strjoin.c b/src/ft_strjoin.c new file mode 100644 index 0000000..f6e22f0 --- /dev/null +++ b/src/ft_strjoin.c @@ -0,0 +1,19 @@ +#include "libft.h" +#include + +char * +ft_strjoin (char const *s1, char const *s2) +{ + size_t len1; + size_t len2; + char *join; + + len1 = ft_strlen (s1); + len2 = ft_strlen (s2); + join = malloc (len1 + len2 + 1); + if (!join) + return (NULL); + ft_memcpy (join, s1, len1); + ft_memcpy (join + len1, s2, len2 + 1); + return (join); +} diff --git a/src/ft_strmapi.c b/src/ft_strmapi.c new file mode 100644 index 0000000..8d419c2 --- /dev/null +++ b/src/ft_strmapi.c @@ -0,0 +1,23 @@ +#include "libft.h" +#include + +char * +ft_strmapi (char const *s, char (*f) (unsigned int, char)) +{ + size_t len; + char *result; + size_t i; + + len = ft_strlen (s); + result = malloc (len + 1); + if (!result) + return (NULL); + i = 0; + while (i < len) + { + result[i] = f (i, s[i]); + i++; + } + result[len] = '\0'; + return (result); +} diff --git a/src/ft_strtrim.c b/src/ft_strtrim.c new file mode 100644 index 0000000..e9fa3eb --- /dev/null +++ b/src/ft_strtrim.c @@ -0,0 +1,25 @@ +#include "libft.h" +#include + +char * +ft_strtrim (char const *s1, char const *set) +{ + size_t start; + size_t end; + size_t len; + char *trimmed; + + start = 0; + while (s1[start] && ft_strchr (set, s1[start])) + start++; + end = ft_strlen (s1); + while (end > start && ft_strchr (set, s1[end - 1])) + end--; + len = end - start; + trimmed = malloc (len + 1); + if (!trimmed) + return (NULL); + ft_memcpy (trimmed, s1 + start, len); + trimmed[len] = '\0'; + return (trimmed); +} diff --git a/src/ft_substr.c b/src/ft_substr.c new file mode 100644 index 0000000..0db72d0 --- /dev/null +++ b/src/ft_substr.c @@ -0,0 +1,23 @@ +#include "libft.h" +#include + +char * +ft_substr (char const *s, unsigned int start, size_t len) +{ + size_t slen; + size_t actual; + char *sub; + + slen = ft_strlen (s); + if (start >= slen) + return (ft_strdup ("")); + actual = slen - start; + if (actual > len) + actual = len; + sub = malloc (actual + 1); + if (!sub) + return (NULL); + ft_memcpy (sub, s + start, actual); + sub[actual] = '\0'; + return (sub); +} -- cgit v1.2.3