NAME=libft.a
-SRCS=ft_char2.c ft_char.c ft_mem2.c ft_mem.c ft_str2.c ft_str.c
+SRCS=ft_char1.c ft_char2.c ft_mem1.c ft_mem2.c ft_str1.c ft_str2.c ft_str3.c ft_split.c
OBJS=${SRCS:.c=.o}
-CFLAGS=-Wall -Wextra -Werror -O3
+CFLAGS=-Wall -Wextra -Werror
CC=cc
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_atoi.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:05:22 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:06:56 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <libft.h>
+
+static bool ft_isspace(char c)
+{
+ return (c == ' ' || (c >= '\t' && c <= '\r'));
+}
+
+int ft_atoi(const char *nptr)
+{
+ int sign;
+ int res;
+
+ sign = 1;
+ res = 0;
+ while (ft_isspace(*nptr))
+ nptr++;
+ if (*nptr == '-')
+ sign = -1;
+ else if (*nptr != '+')
+ nptr--;
+ nptr++;
+ while (ft_isdigit(*nptr))
+ res = res * 10 + sign * (*(nptr++) - '0');
+ return (res);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_bzero.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:47:42 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:47:59 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_bzero(void *s, size_t n)
+{
+ return (ft_memset(s, '\0', n));
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_calloc.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:52:41 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:55:36 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "libft.h"
+
+void *ft_calloc(size_t nmemb, size_t size)
+{
+ void *res;
+ size_t alloc;
+
+ if (__builtin_mul_overflow(nmemb, size, &alloc))
+ return (NULL);
+ res = malloc(alloc);
+ if (res)
+ ft_bzero(res, alloc);
+ return (res);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isalnum.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:42:58 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:43:50 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_isalnum(int c)
+{
+ return (ft_isalpha(c) || ft_isdigit(c));
+}
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* ft_char.c :+: :+: :+: */
+/* ft_isalpha.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
-/* Created: 2025/10/27 11:30:03 by agilliar #+# #+# */
-/* Updated: 2025/10/27 13:17:26 by agilliar ### ########.fr */
+/* Created: 2025/10/29 09:42:17 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:42:31 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
{
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}
-
-int ft_isdigit(int c)
-{
- return (c >= '0' && c <= '9');
-}
-
-int ft_isalnum(int c)
-{
- return (ft_isalpha(c) || ft_isdigit(c));
-}
-
-int ft_isascii(int c)
-{
- return (c >= '\0' && c <= '\x7F');
-}
-
-int ft_isprint(int c)
-{
- return (c >= ' ' && c <= '~');
-}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isascii.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:43:14 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:43:17 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isascii(int c)
+{
+ return (c >= '\0' && c <= '\x7F');
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isdigit.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:42:38 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:42:45 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isdigit(int c)
+{
+ return (c >= '0' && c <= '9');
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isprint.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:43:29 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:43:32 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isprint(int c)
+{
+ return (c >= ' ' && c <= '~');
+}
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* ft_mem.c :+: :+: :+: */
+/* ft_mem1.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/10/27 12:08:42 by agilliar #+# #+# */
-/* Updated: 2025/10/27 14:51:45 by agilliar ### ########.fr */
+/* Updated: 2025/10/29 09:19:54 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
{
size_t i;
- i = 0;
- while (i < n)
+ if (dest < src)
{
- ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
- i++;
+ i = 0;
+ while (i < n)
+ {
+ ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
+ i++;
+ }
}
+ else
+ while (n--)
+ ((unsigned char *)dest)[n] = ((unsigned char *)src)[n];
return (dest);
}
i = 0;
while (i < n)
{
- if (((unsigned char *)s)[i] == c)
+ if (((unsigned char *)s)[i] == (unsigned char)c)
return ((void *)&((unsigned char *)s)[i]);
i++;
}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/10/27 14:39:28 by agilliar #+# #+# */
-/* Updated: 2025/10/27 15:10:14 by agilliar ### ########.fr */
+/* Updated: 2025/10/29 09:30:07 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
{
void *res;
- if (SIZE_MAX / size < nmemb)
+ if (size && SIZE_MAX / size < nmemb)
return (NULL);
res = malloc(nmemb * size);
if (res)
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:48:41 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:48:43 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+void *ft_memchr(const void *s, int c, size_t n)
+{
+ size_t i;
+
+ i = 0;
+ while (i < n)
+ {
+ if (((unsigned char *)s)[i] == (unsigned char)c)
+ return ((void *)&((unsigned char *)s)[i]);
+ i++;
+ }
+ return (NULL);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:51:58 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:52:31 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_memcmp(const void *s1, const void *s2, size_t n)
+{
+ size_t i;
+ int res;
+
+ i = 0;
+ res = 0;
+ while (res == 0 && i < n)
+ {
+ res = ((unsigned char *) s1)[i] - ((unsigned char *) s2)[i];
+ i++;
+ }
+ return (res);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:48:05 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:48:15 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+void *ft_memcpy(void *restrict dest, const void *src, size_t n)
+{
+ size_t i;
+
+ i = 0;
+ while (i < n)
+ {
+ ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
+ i++;
+ }
+ return (dest);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memmove.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:48:19 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:48:31 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+void *ft_memmove(void *dest, const void *src, size_t n)
+{
+ size_t i;
+
+ if (dest < src)
+ {
+ i = 0;
+ while (i < n)
+ {
+ ((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
+ i++;
+ }
+ }
+ else
+ while (n--)
+ ((unsigned char *)dest)[n] = ((unsigned char *)src)[n];
+ return (dest);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memset.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:47:17 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:47:32 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+void *ft_memset(void *s, int c, size_t n)
+{
+ size_t i;
+
+ i = 0;
+ while (i < n)
+ ((unsigned char *) s)[i++] = c;
+ return (s);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_split.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/28 12:08:04 by agilliar #+# #+# */
+/* Updated: 2025/10/28 13:20:17 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include <stdlib.h>
+
+static size_t ft_strlen_term(const char *s, char c)
+{
+ size_t i;
+
+ i = 0;
+ while (s[i] && s[i] != c)
+ i++;
+ return (i);
+}
+
+static char **ft_split_cleanup(char **res, size_t len)
+{
+ size_t i;
+
+ i = 0;
+ while (i < len)
+ free(res[i++]);
+ free(res);
+ return (NULL);
+}
+
+static char **ft_split_with(char **res, const char *s, char c)
+{
+ size_t i;
+
+ if (!res)
+ return (res);
+ i = 0;
+ while (*s)
+ if (ft_strlen_term(s, c) == 0)
+ s++;
+ else
+ {
+ res[i] = ft_substr(s, 0, ft_strlen_term(s, c));
+ if (!res[i])
+ return (ft_split_cleanup(res, i));
+ i++;
+ s += ft_strlen_term(s, c);
+ }
+ res[i] = NULL;
+ return (res);
+}
+
+char **ft_split(const char *s, char c)
+{
+ size_t i;
+ size_t len;
+
+ i = 0;
+ len = 1;
+ while (s[i])
+ if (ft_strlen_term(&s[i], c) == 0)
+ i++;
+ else
+ {
+ i += ft_strlen_term(&s[i], c);
+ len++;
+ }
+ return (ft_split_with(malloc(sizeof(char *) * len), s, c));
+}
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* ft_str.c :+: :+: :+: */
+/* ft_str1.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/10/27 12:11:26 by agilliar #+# #+# */
-/* Updated: 2025/10/27 13:29:49 by agilliar ### ########.fr */
+/* Updated: 2025/10/29 09:28:34 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
+#include <stdbool.h>
size_t ft_strlen(const char *s)
{
return (i);
}
-size_t ft_strlcpy(char *dest, char *src, size_t size)
+size_t ft_strlcpy(char *dest, const char *src, size_t size)
{
size_t len;
size_t i;
return (len);
}
-size_t ft_strlcat(char *dest, char *src, size_t size)
+size_t ft_strlcat(char *dest, const char *src, size_t size)
{
size_t src_len;
size_t dest_len;
char *ft_strchr(const char *s, int c)
{
- while (*s != c && *s != '\0')
+ while (*s != (char)c && *s != '\0')
s++;
- if (*s == c)
+ if (*s == (char)c)
return ((char *) s);
return (NULL);
}
char *res;
res = (char *) s;
- while (*s != '\0')
- if (*s == c)
+ while (true)
+ {
+ if (*s == (char)c)
res = (char *) s;
- if (*res == c)
+ if (!*s)
+ break;
+ s++;
+ }
+ if (*res == (char)c)
return (res);
return (NULL);
}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/10/27 13:31:21 by agilliar #+# #+# */
-/* Updated: 2025/10/27 15:36:29 by agilliar ### ########.fr */
+/* Updated: 2025/10/29 09:36:36 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
#include <stdbool.h>
#include <stdlib.h>
-int ft_strncmp(char *s1, char *s2, size_t n)
+int ft_strncmp(const char *s1, const char *s2, size_t n)
{
unsigned int idx;
char *ft_substr(const char *s, unsigned int start, size_t len)
{
- size_t i;
+ size_t s_len;
char *res;
- s = s + start;
- i = 0;
- while (s[i] && i < len)
- i++;
- res = malloc(i + 1);
+ s_len = ft_strlen(s);
+ if (start > s_len)
+ start = s_len;
+ if (len > s_len - start)
+ len = s_len - start;
+ res = malloc(len + 1);
if (!res)
return (res);
- ft_memcpy(res, s, i);
- res[i] = '\0';
+ ft_memcpy(res, s + start, len);
+ res[len] = '\0';
return (res);
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_str3.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/28 09:18:20 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:40:51 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include <stdlib.h>
+#include <stdbool.h>
+
+char *ft_strjoin(const char *s1, const char *s2)
+{
+ size_t l1;
+ size_t l2;
+ char *res;
+
+ l1 = ft_strlen(s1);
+ l2 = ft_strlen(s2);
+ res = malloc(l1 + l2 + 1);
+ if (!res)
+ return (res);
+ ft_memcpy(res, s1, l1);
+ ft_memcpy(&res[l1], s2, l2);
+ res[l1 + l2] = '\0';
+ return (res);
+}
+
+static bool ft_char_in_set(char c, const char *set)
+{
+ while (*set && *set != c)
+ set++;
+ return (*set == c);
+}
+
+char *ft_strtrim(const char *s1, const char *set)
+{
+ size_t i;
+ size_t len;
+
+ while (*s1 && ft_char_in_set(*s1, set))
+ s1++;
+ i = 0;
+ len = 0;
+ while (s1[i])
+ if (!ft_char_in_set(s1[i++], set))
+ len = i;
+ return (ft_substr(s1, 0, len));
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:50:12 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:51:18 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+char *ft_strchr(const char *s, int c)
+{
+ while (*s != (char)c && *s != '\0')
+ s++;
+ if (*s == (char)c)
+ return ((char *) s);
+ return (NULL);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strdup.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:01:04 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:02:35 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strdup(char *src)
+{
+ return (ft_substr(str, 0, ft_strlen(str)));
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strjoin.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:08:19 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:08:40 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include <stdlib.h>
+
+char *ft_strjoin(const char *s1, const char *s2)
+{
+ size_t l1;
+ size_t l2;
+ char *res;
+
+ l1 = ft_strlen(s1);
+ l2 = ft_strlen(s2);
+ res = malloc(l1 + l2 + 1);
+ if (!res)
+ return (res);
+ ft_memcpy(res, s1, l1);
+ ft_memcpy(&res[l1], s2, l2);
+ res[l1 + l2] = '\0';
+ return (res);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcat.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:49:32 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:49:39 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+size_t ft_strlcat(char *dest, const char *src, size_t size)
+{
+ size_t src_len;
+ size_t dest_len;
+ size_t i;
+
+ src_len = 0;
+ while (src[src_len])
+ src_len++;
+ dest_len = 0;
+ while (dest_len < size && dest[dest_len])
+ dest_len++;
+ i = 0;
+ while (dest_len + i + 1 < size && i < src_len)
+ {
+ dest[dest_len + i] = src[i];
+ i++;
+ }
+ if (dest_len != size)
+ dest[dest_len + i] = '\0';
+ return (src_len + dest_len);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:49:19 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:49:27 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+size_t ft_strlcpy(char *dest, const char *src, size_t size)
+{
+ size_t len;
+ size_t i;
+
+ len = 0;
+ while (src[len] != '\0')
+ len++;
+ if (size == 0)
+ return (len);
+ i = 0;
+ while (i < len && i < size - 1)
+ *dest++ = src[i++];
+ *dest = '\0';
+ return (len);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlen.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:48:58 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:49:12 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+size_t ft_strlen(const char *s)
+{
+ size_t i;
+
+ i = 0;
+ while (s[i] != '\0')
+ i++;
+ return (i);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strncmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:03:01 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:04:21 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+int ft_strncmp(const char *s1, const char *s2, size_t n)
+{
+ size_t idx;
+
+ if (n == 0)
+ return (0);
+ idx = 0;
+ while (s1[idx] != '\0' && s1[idx] == s2[idx] && idx < n - 1)
+ idx++;
+ return ((unsigned char) s1[idx] - (unsigned char) s2[idx]);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strnstr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:04:47 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:05:14 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+char *ft_strnstr(const char *big, const char *little, size_t len)
+{
+ size_t i;
+ size_t j;
+
+ i = 0;
+ j = 0;
+ while (little[i] && i + j < len && big[i + j])
+ {
+ if (big[i + j] != little[i])
+ {
+ i = 0;
+ j++;
+ }
+ else
+ i++;
+ }
+ if (little[i])
+ return (NULL);
+ return ((char *)&big[j]);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strrchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:51:22 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:51:35 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stddef.h>
+
+char *ft_strrchr(const char *s, int c)
+{
+ char *res;
+
+ res = (char *) s;
+ while (true)
+ {
+ if (*s == (char)c)
+ res = (char *) s;
+ if (!*s)
+ break;
+ s++;
+ }
+ if (*res == (char)c)
+ return (res);
+ return (NULL);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strtrim.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:08:47 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:09:08 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+static bool ft_char_in_set(char c, const char *set)
+{
+ while (*set && *set != c)
+ set++;
+ return (*set == c);
+}
+
+char *ft_strtrim(const char *s1, const char *set)
+{
+ size_t i;
+ size_t len;
+
+ while (*s1 && ft_char_in_set(*s1, set))
+ s1++;
+ i = 0;
+ len = 0;
+ while (s1[i])
+ if (!ft_char_in_set(s1[i++], set))
+ len = i;
+ return (ft_substr(s1, 0, len));
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_substr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 10:07:38 by agilliar #+# #+# */
+/* Updated: 2025/10/29 10:08:13 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stdlib.h>
+#include "libft.h"
+
+char *ft_substr(const char *s, unsigned int start, size_t len)
+{
+ size_t s_len;
+ char *res;
+
+ s_len = ft_strlen(s);
+ if (start > s_len)
+ start = s_len;
+ if (len > s_len - start)
+ len = s_len - start;
+ res = malloc(len + 1);
+ if (!res)
+ return (res);
+ ft_memcpy(res, s + start, len);
+ res[len] = '\0';
+ return (res);
+}
/* ************************************************************************** */
/* */
/* ::: :::::::: */
-/* ft_char2.c :+: :+: :+: */
+/* ft_tolower.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
-/* Created: 2025/10/27 12:56:07 by agilliar #+# #+# */
-/* Updated: 2025/10/27 13:08:18 by agilliar ### ########.fr */
+/* Created: 2025/10/29 09:44:28 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:44:39 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
-int ft_toupper(int c)
-{
- if (c >= 'a' && c <= 'z')
- c = c - 'a' + 'A';
- return (c);
-}
-
int ft_tolower(int c)
{
if (c >= 'A' && c <= 'Z')
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_toupper.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/10/29 09:44:12 by agilliar #+# #+# */
+/* Updated: 2025/10/29 09:44:20 by agilliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_toupper(int c)
+{
+ if (c >= 'a' && c <= 'z')
+ c = c - 'a' + 'A';
+ return (c);
+}
/* By: agilliar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/10/27 11:27:06 by agilliar #+# #+# */
-/* Updated: 2025/10/27 15:34:27 by agilliar ### ########.fr */
+/* Updated: 2025/10/29 09:26:33 by agilliar ### ########.fr */
/* */
/* ************************************************************************** */
# include <stddef.h>
-int ft_strncmp(char *s1, char *s2, size_t n);
-char *ft_strnstr(const char *big, const char *little, size_t len);
-int ft_atoi(const char *nptr);
int ft_memcmp(const void *s1, const void *s2, size_t n);
void *ft_calloc(size_t nmemb, size_t size);
char *ft_strdup(char *src);
+int ft_strncmp(const char *s1, const char *s2, size_t n);
+char *ft_strnstr(const char *big, const char *little, size_t len);
+int ft_atoi(const char *nptr);
+char *ft_substr(const char *s, unsigned int start, size_t len);
void *ft_memset(void *s, int c, size_t n);
void *ft_bzero(void *s, size_t n);
-void *ft_memcpy(void *restrict dest, const void *src, size_t n);
+void *ft_memcpy(void *dest, const void *src, size_t n);
void *ft_memmove(void *dest, const void *src, size_t n);
void *ft_memchr(const void *s, int c, size_t n);
-int ft_toupper(int c);
-int ft_tolower(int c);
+size_t ft_strlen(const char *s);
+size_t ft_strlcpy(char *dest, const char *src, size_t size);
+size_t ft_strlcat(char *dest, const char *src, size_t size);
+char *ft_strchr(const char *s, int c);
+char *ft_strrchr(const char *s, int c);
int ft_isalpha(int c);
int ft_isdigit(int c);
int ft_isalnum(int c);
int ft_isascii(int c);
int ft_isprint(int c);
-size_t ft_strlen(const char *s);
-size_t ft_strlcpy(char *dest, char *src, size_t size);
-size_t ft_strlcat(char *dest, char *src, size_t size);
-char *ft_strchr(const char *s, int c);
-char *ft_strrchr(const char *s, int c);
+char *ft_strjoin(const char *s1, const char *s2);
+char *ft_strtrim(const char *s1, const char *set);
+int ft_toupper(int c);
+int ft_tolower(int c);
#endif