aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ft_asprintf.c24
-rw-r--r--src/ft_atoi.c43
-rw-r--r--src/ft_bzero.c18
-rw-r--r--src/ft_calloc.c23
-rw-r--r--src/ft_dprintf.c24
-rw-r--r--src/ft_isalnum.c18
-rw-r--r--src/ft_isalpha.c16
-rw-r--r--src/ft_isascii.c18
-rw-r--r--src/ft_isdigit.c16
-rw-r--r--src/ft_isprint.c16
-rw-r--r--src/ft_itoa.c39
-rw-r--r--src/ft_lstadd_back_bonus.c25
-rw-r--r--src/ft_lstadd_front_bonus.c21
-rw-r--r--src/ft_lstclear_bonus.c24
-rw-r--r--src/ft_lstdelone_bonus.c22
-rw-r--r--src/ft_lstiter_bonus.c24
-rw-r--r--src/ft_lstlast_bonus.c22
-rw-r--r--src/ft_lstmap_bonus.c48
-rw-r--r--src/ft_lstnew_bonus.c24
-rw-r--r--src/ft_lstpop_front_bonus.c26
-rw-r--r--src/ft_lstsize_bonus.c26
-rw-r--r--src/ft_memalloc.c18
-rw-r--r--src/ft_memccpy.c31
-rw-r--r--src/ft_memchr.c26
-rw-r--r--src/ft_memcmp.c30
-rw-r--r--src/ft_memcpy.c22
-rw-r--r--src/ft_memdel.c21
-rw-r--r--src/ft_memmove.c33
-rw-r--r--src/ft_memset.c31
-rw-r--r--src/ft_printf.c24
-rw-r--r--src/ft_printf/convert.c122
-rw-r--r--src/ft_printf/convert_char.c53
-rw-r--r--src/ft_printf/convert_hex.c34
-rw-r--r--src/ft_printf/convert_int.c40
-rw-r--r--src/ft_printf/convert_none.c25
-rw-r--r--src/ft_printf/convert_percent.c23
-rw-r--r--src/ft_printf/convert_ptr.c29
-rw-r--r--src/ft_printf/convert_str.c25
-rw-r--r--src/ft_printf/convert_uint.c34
-rw-r--r--src/ft_printf/convert_written.c28
-rw-r--r--src/ft_printf/extract.c98
-rw-r--r--src/ft_printf/ft_printf.c92
-rw-r--r--src/ft_printf/ft_vasprintf.h155
-rw-r--r--src/ft_printf/length_modifier.c39
-rw-r--r--src/ft_printf/list.c67
-rw-r--r--src/ft_printf/parse.c61
-rw-r--r--src/ft_printf/utils.c115
-rw-r--r--src/ft_putchar.c18
-rw-r--r--src/ft_putchar_fd.c20
-rw-r--r--src/ft_putendl.c18
-rw-r--r--src/ft_putendl_fd.c21
-rw-r--r--src/ft_putnbr.c18
-rw-r--r--src/ft_putnbr_fd.c30
-rw-r--r--src/ft_putstr.c18
-rw-r--r--src/ft_putstr_fd.c20
-rw-r--r--src/ft_snprintf.c24
-rw-r--r--src/ft_split.c73
-rw-r--r--src/ft_sprintf.c24
-rw-r--r--src/ft_strcat.c19
-rw-r--r--src/ft_strchr.c18
-rw-r--r--src/ft_strclr.c20
-rw-r--r--src/ft_strcmp.c18
-rw-r--r--src/ft_strcount.c24
-rw-r--r--src/ft_strcpy.c18
-rw-r--r--src/ft_strdel.c18
-rw-r--r--src/ft_strdup.c22
-rw-r--r--src/ft_strequ.c20
-rw-r--r--src/ft_striter.c21
-rw-r--r--src/ft_striteri.c27
-rw-r--r--src/ft_strjoin.c24
-rw-r--r--src/ft_strjoin_free.c32
-rw-r--r--src/ft_strjoin_free_snd.c26
-rw-r--r--src/ft_strlcat.c32
-rw-r--r--src/ft_strlcpy.c28
-rw-r--r--src/ft_strlen.c41
-rw-r--r--src/ft_strmap.c34
-rw-r--r--src/ft_strmapi.c34
-rw-r--r--src/ft_strncat.c29
-rw-r--r--src/ft_strncmp.c25
-rw-r--r--src/ft_strncpy.c24
-rw-r--r--src/ft_strndup.c22
-rw-r--r--src/ft_strnequ.c20
-rw-r--r--src/ft_strnew.c18
-rw-r--r--src/ft_strnstr.c29
-rw-r--r--src/ft_strrchr.c24
-rw-r--r--src/ft_strstr.c29
-rw-r--r--src/ft_strtrim.c31
-rw-r--r--src/ft_substr.c26
-rw-r--r--src/ft_tolower.c24
-rw-r--r--src/ft_toupper.c20
-rw-r--r--src/ft_vasprintf.c21
-rw-r--r--src/ft_vdprintf.c24
-rw-r--r--src/ft_vprintf.c18
-rw-r--r--src/ft_vsnprintf.c26
-rw-r--r--src/ft_vsprintf.c18
-rw-r--r--src/get_next_line/get_next_line.c115
96 files changed, 3096 insertions, 0 deletions
diff --git a/src/ft_asprintf.c b/src/ft_asprintf.c
new file mode 100644
index 0000000..5eb62d9
--- /dev/null
+++ b/src/ft_asprintf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_asprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:30:33 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:43:08 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_asprintf(char **ret, const char *format, ...)
+{
+ int vret;
+ va_list ap;
+
+ va_start(ap, format);
+ vret = ft_vasprintf(ret, format, ap);
+ va_end(ap);
+ return (vret);
+}
diff --git a/src/ft_atoi.c b/src/ft_atoi.c
new file mode 100644
index 0000000..bfba860
--- /dev/null
+++ b/src/ft_atoi.c
@@ -0,0 +1,43 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_atoi.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:46:16 by cacharle #+# #+# */
+/* Updated: 2019/11/20 01:43:18 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+#define MIN_INT -2147483648
+#define MAX_INT 2147483647
+
+int ft_atoi(const char *str)
+{
+ unsigned int nb;
+ int i;
+ int is_negative;
+
+ while (*str == ' ' || *str == '\t' || *str == '\n'
+ || *str == '\v' || *str == '\f' || *str == '\r')
+ str++;
+ is_negative = 0;
+ if (*str == '-' || *str == '+')
+ if (*str++ == '-')
+ is_negative = 1;
+ i = 0;
+ nb = 0;
+ while (ft_isdigit(str[i]))
+ {
+ if (!is_negative && nb > (unsigned int)MAX_INT)
+ return (-1);
+ else if (nb > (unsigned int)MIN_INT)
+ return (0);
+ nb *= 10;
+ nb += str[i++] & 0x0F;
+ }
+ return ((int)(is_negative ? -nb : nb));
+}
diff --git a/src/ft_bzero.c b/src/ft_bzero.c
new file mode 100644
index 0000000..d179af0
--- /dev/null
+++ b/src/ft_bzero.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_bzero.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:50:10 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:29:26 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_bzero(void *s, size_t n)
+{
+ ft_memset(s, 0, n);
+}
diff --git a/src/ft_calloc.c b/src/ft_calloc.c
new file mode 100644
index 0000000..24501bf
--- /dev/null
+++ b/src/ft_calloc.c
@@ -0,0 +1,23 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_calloc.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 12:45:37 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:05:53 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_calloc(size_t count, size_t size)
+{
+ void *mem;
+
+ if ((mem = malloc(count * size)) == NULL)
+ return (NULL);
+ ft_bzero(mem, count * size);
+ return (mem);
+}
diff --git a/src/ft_dprintf.c b/src/ft_dprintf.c
new file mode 100644
index 0000000..8e60970
--- /dev/null
+++ b/src/ft_dprintf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_dprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:29:11 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:42:05 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_dprintf(int fd, const char *format, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, format);
+ ret = ft_vdprintf(fd, format, ap);
+ va_end(ap);
+ return (ret);
+}
diff --git a/src/ft_isalnum.c b/src/ft_isalnum.c
new file mode 100644
index 0000000..1ee1e0f
--- /dev/null
+++ b/src/ft_isalnum.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isalnum.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:41:40 by cacharle #+# #+# */
+/* Updated: 2019/10/07 09:41:56 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_isalnum(int c)
+{
+ return (ft_isalpha(c) || ft_isdigit(c));
+}
diff --git a/src/ft_isalpha.c b/src/ft_isalpha.c
new file mode 100644
index 0000000..6f155b4
--- /dev/null
+++ b/src/ft_isalpha.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isalpha.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:54:52 by cacharle #+# #+# */
+/* Updated: 2019/10/20 13:01:13 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isalpha(int c)
+{
+ return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
+}
diff --git a/src/ft_isascii.c b/src/ft_isascii.c
new file mode 100644
index 0000000..51dcd1c
--- /dev/null
+++ b/src/ft_isascii.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isascii.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:54:30 by cacharle #+# #+# */
+/* Updated: 2019/10/20 13:03:23 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#define MAX_CHAR ((1 << 7) - 1)
+
+int ft_isascii(int c)
+{
+ return (c >= 0 && c <= MAX_CHAR);
+}
diff --git a/src/ft_isdigit.c b/src/ft_isdigit.c
new file mode 100644
index 0000000..f8a5850
--- /dev/null
+++ b/src/ft_isdigit.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isdigit.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:41:20 by cacharle #+# #+# */
+/* Updated: 2019/10/07 10:41:25 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isdigit(int c)
+{
+ return (c >= '0' && c <= '9');
+}
diff --git a/src/ft_isprint.c b/src/ft_isprint.c
new file mode 100644
index 0000000..c311709
--- /dev/null
+++ b/src/ft_isprint.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isprint.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:52:09 by cacharle #+# #+# */
+/* Updated: 2019/10/20 13:03:36 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isprint(int c)
+{
+ return (c >= ' ' && c <= '~');
+}
diff --git a/src/ft_itoa.c b/src/ft_itoa.c
new file mode 100644
index 0000000..166e278
--- /dev/null
+++ b/src/ft_itoa.c
@@ -0,0 +1,39 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_itoa.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:19:56 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:13:10 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_itoa(int n)
+{
+ char *str;
+ int len;
+ unsigned int u_nbr;
+
+ len = n < 0 || n == 0 ? 1 : 0;
+ u_nbr = n < 0 ? -n : n;
+ while (u_nbr > 0)
+ {
+ u_nbr /= 10;
+ len++;
+ }
+ if ((str = ft_strnew(len)) == NULL)
+ return (NULL);
+ u_nbr = n < 0 ? -n : n;
+ if (n < 0)
+ str[0] = '-';
+ while (--len >= (n < 0 ? 1 : 0))
+ {
+ str[len] = (u_nbr % 10) | 0x30;
+ u_nbr /= 10;
+ }
+ return (str);
+}
diff --git a/src/ft_lstadd_back_bonus.c b/src/ft_lstadd_back_bonus.c
new file mode 100644
index 0000000..01eb00c
--- /dev/null
+++ b/src/ft_lstadd_back_bonus.c
@@ -0,0 +1,25 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstadd_back_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:02:03 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:01:26 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstadd_back(t_list **alst, t_list *new)
+{
+ if (alst == NULL)
+ return ;
+ if (*alst == NULL)
+ {
+ *alst = new;
+ return ;
+ }
+ ft_lstlast(*alst)->next = new;
+}
diff --git a/src/ft_lstadd_front_bonus.c b/src/ft_lstadd_front_bonus.c
new file mode 100644
index 0000000..282b0b4
--- /dev/null
+++ b/src/ft_lstadd_front_bonus.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstadd_front_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:02:25 by cacharle #+# #+# */
+/* Updated: 2019/10/18 12:16:06 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstadd_front(t_list **alst, t_list *new)
+{
+ if (alst == NULL || new == NULL)
+ return ;
+ new->next = *alst;
+ *alst = new;
+}
diff --git a/src/ft_lstclear_bonus.c b/src/ft_lstclear_bonus.c
new file mode 100644
index 0000000..ee1d9e5
--- /dev/null
+++ b/src/ft_lstclear_bonus.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstclear_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:02:39 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:37 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstclear(t_list **lst, void (*del)(void *))
+{
+ if (lst == NULL)
+ return ;
+ if (*lst == NULL)
+ return ;
+ ft_lstclear(&((*lst)->next), del);
+ ft_lstdelone(*lst, del);
+ *lst = NULL;
+}
diff --git a/src/ft_lstdelone_bonus.c b/src/ft_lstdelone_bonus.c
new file mode 100644
index 0000000..30cec69
--- /dev/null
+++ b/src/ft_lstdelone_bonus.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstdelone_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:03:02 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:31 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstdelone(t_list *lst, void (*del)(void *))
+{
+ if (lst == NULL)
+ return ;
+ if (del != NULL)
+ (*del)(lst->content);
+ free(lst);
+}
diff --git a/src/ft_lstiter_bonus.c b/src/ft_lstiter_bonus.c
new file mode 100644
index 0000000..282e0fa
--- /dev/null
+++ b/src/ft_lstiter_bonus.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstiter_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:03:22 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:01:39 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstiter(t_list *lst, void (*f)(void *))
+{
+ if (f == NULL)
+ return ;
+ while (lst != NULL)
+ {
+ (*f)(lst->content);
+ lst = lst->next;
+ }
+}
diff --git a/src/ft_lstlast_bonus.c b/src/ft_lstlast_bonus.c
new file mode 100644
index 0000000..247f4da
--- /dev/null
+++ b/src/ft_lstlast_bonus.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstlast_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:03:40 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:26 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+t_list *ft_lstlast(t_list *lst)
+{
+ if (lst == NULL)
+ return (NULL);
+ while (lst->next != NULL)
+ lst = lst->next;
+ return (lst);
+}
diff --git a/src/ft_lstmap_bonus.c b/src/ft_lstmap_bonus.c
new file mode 100644
index 0000000..c623d6f
--- /dev/null
+++ b/src/ft_lstmap_bonus.c
@@ -0,0 +1,48 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstmap_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:03:57 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:01:31 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
+{
+ t_list *mapped;
+ t_list *tmp;
+
+ if (lst == NULL || f == NULL)
+ return (NULL);
+ mapped = NULL;
+ while (lst != NULL)
+ {
+ if ((tmp = ft_lstnew((*f)(lst->content))) == NULL)
+ {
+ ft_lstclear(&mapped, del);
+ return (NULL);
+ }
+ ft_lstadd_back(&mapped, tmp);
+ lst = lst->next;
+ }
+ return (mapped);
+}
+
+/*
+** Rest in peace, my beautiful recursion.
+**
+** t_list *tmp;
+**
+** if (lst == NULL)
+** return (NULL);
+** if ((tmp = ft_lstnew(lst->content)) == NULL)
+** return (NULL);
+** tmp->content = (*f)(tmp->content);
+** tmp->next = ft_lstmap(lst->next, f);
+** return (tmp);
+*/
diff --git a/src/ft_lstnew_bonus.c b/src/ft_lstnew_bonus.c
new file mode 100644
index 0000000..ea10e4d
--- /dev/null
+++ b/src/ft_lstnew_bonus.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstnew_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:01:16 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:01:35 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+t_list *ft_lstnew(void const *content)
+{
+ t_list *elem;
+
+ if ((elem = (t_list*)malloc(sizeof(t_list))) == NULL)
+ return (NULL);
+ elem->content = (void*)content;
+ elem->next = NULL;
+ return (elem);
+}
diff --git a/src/ft_lstpop_front_bonus.c b/src/ft_lstpop_front_bonus.c
new file mode 100644
index 0000000..f81315a
--- /dev/null
+++ b/src/ft_lstpop_front_bonus.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstpop_front_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/25 03:32:51 by cacharle #+# #+# */
+/* Updated: 2019/10/25 03:35:58 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stdlib.h>
+#include "libft.h"
+
+void ft_lstpop_front(t_list **lst, void (*del)(void *))
+{
+ t_list *tmp;
+
+ if (lst == NULL || *lst == NULL)
+ return ;
+ tmp = (*lst)->next;
+ del((*lst)->content);
+ free(*lst);
+ *lst = tmp;
+}
diff --git a/src/ft_lstsize_bonus.c b/src/ft_lstsize_bonus.c
new file mode 100644
index 0000000..b9d65d2
--- /dev/null
+++ b/src/ft_lstsize_bonus.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstsize_bonus.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/09 09:04:28 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:01:44 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_lstsize(t_list *lst)
+{
+ int counter;
+
+ counter = 0;
+ while (lst != NULL)
+ {
+ counter++;
+ lst = lst->next;
+ }
+ return (counter);
+}
diff --git a/src/ft_memalloc.c b/src/ft_memalloc.c
new file mode 100644
index 0000000..5aab2ec
--- /dev/null
+++ b/src/ft_memalloc.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memalloc.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:07:14 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:28:56 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memalloc(size_t size)
+{
+ return (ft_calloc(size, 1));
+}
diff --git a/src/ft_memccpy.c b/src/ft_memccpy.c
new file mode 100644
index 0000000..f95aa03
--- /dev/null
+++ b/src/ft_memccpy.c
@@ -0,0 +1,31 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memccpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:01:53 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:30:45 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memccpy(void *dest, const void *src, int c, size_t n)
+{
+ size_t i;
+ t_byte *cast_dest;
+ t_byte *cast_src;
+
+ cast_dest = (t_byte*)dest;
+ cast_src = (t_byte*)src;
+ i = -1;
+ while (++i < n)
+ {
+ cast_dest[i] = cast_src[i];
+ if (cast_dest[i] == (unsigned char)c)
+ return (cast_dest + i + 1);
+ }
+ return (NULL);
+}
diff --git a/src/ft_memchr.c b/src/ft_memchr.c
new file mode 100644
index 0000000..d2364db
--- /dev/null
+++ b/src/ft_memchr.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:55:31 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:30:55 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memchr(const void *s, int c, size_t n)
+{
+ size_t i;
+ t_byte *cast_s;
+
+ cast_s = (t_byte*)s;
+ i = -1;
+ while (++i < n)
+ if (cast_s[i] == (unsigned char)c)
+ return (cast_s + i);
+ return (NULL);
+}
diff --git a/src/ft_memcmp.c b/src/ft_memcmp.c
new file mode 100644
index 0000000..2c8e179
--- /dev/null
+++ b/src/ft_memcmp.c
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:56:44 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:58:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_memcmp(const void *s1, const void *s2, size_t n)
+{
+ size_t i;
+ t_byte *cast_s1;
+ t_byte *cast_s2;
+
+ cast_s1 = (t_byte*)s1;
+ cast_s2 = (t_byte*)s2;
+ if (n == 0)
+ return (0);
+ i = -1;
+ while (++i < n)
+ if (cast_s1[i] != cast_s2[i])
+ return (cast_s1[i] - cast_s2[i]);
+ return (0);
+}
diff --git a/src/ft_memcpy.c b/src/ft_memcpy.c
new file mode 100644
index 0000000..70837bc
--- /dev/null
+++ b/src/ft_memcpy.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:00:07 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:20:29 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memcpy(void *dest, const void *src, size_t n)
+{
+ if (dest == src)
+ return (dest);
+ while (n-- > 0)
+ *((t_byte*)dest + n) = *((t_byte*)src + n);
+ return (dest);
+}
diff --git a/src/ft_memdel.c b/src/ft_memdel.c
new file mode 100644
index 0000000..2b21f33
--- /dev/null
+++ b/src/ft_memdel.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memdel.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:00:56 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:22:41 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_memdel(void **ap)
+{
+ if (ap == NULL)
+ return ;
+ free(*ap);
+ *ap = NULL;
+}
diff --git a/src/ft_memmove.c b/src/ft_memmove.c
new file mode 100644
index 0000000..aa107bd
--- /dev/null
+++ b/src/ft_memmove.c
@@ -0,0 +1,33 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memmove.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:03:21 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:31:00 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memmove(void *dst, const void *src, size_t len)
+{
+ size_t i;
+ t_byte *dst_cast;
+ t_byte *src_cast;
+
+ if (dst == src)
+ return (dst);
+ dst_cast = (t_byte*)dst;
+ src_cast = (t_byte*)src;
+ i = -1;
+ if (dst_cast < src_cast)
+ while (++i < len)
+ dst_cast[i] = src_cast[i];
+ else
+ while (len-- > 0)
+ dst_cast[len] = src_cast[len];
+ return (dst);
+}
diff --git a/src/ft_memset.c b/src/ft_memset.c
new file mode 100644
index 0000000..7963fd0
--- /dev/null
+++ b/src/ft_memset.c
@@ -0,0 +1,31 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memset.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:01:23 by cacharle #+# #+# */
+/* Updated: 2019/11/20 23:22:51 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+#define BUF_TYPE long int
+
+void *ft_memset(void *s, int c, size_t n)
+{
+ BUF_TYPE buf;
+
+ c = (unsigned char)c;
+ while (n % 8 > 0)
+ *((t_byte*)s + --n) = (t_byte)c;
+ n /= 8;
+ buf = (BUF_TYPE)c | (BUF_TYPE)c << 8 | (BUF_TYPE)c << 16
+ | (BUF_TYPE)c << 24 | (BUF_TYPE)c << 32 | (BUF_TYPE)c << 40
+ | (BUF_TYPE)c << 48 | (BUF_TYPE)c << 56;
+ while (n > 0)
+ *((BUF_TYPE*)s + --n) = buf;
+ return (s);
+}
diff --git a/src/ft_printf.c b/src/ft_printf.c
new file mode 100644
index 0000000..1b92bb2
--- /dev/null
+++ b/src/ft_printf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:31:32 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:41:54 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_printf(const char *format, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, format);
+ ret = ft_vprintf(format, ap);
+ va_end(ap);
+ return (ret);
+}
diff --git a/src/ft_printf/convert.c b/src/ft_printf/convert.c
new file mode 100644
index 0000000..398c754
--- /dev/null
+++ b/src/ft_printf/convert.c
@@ -0,0 +1,122 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* printer.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/28 23:19:24 by cacharle #+# #+# */
+/* Updated: 2019/11/14 10:22:04 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "libft.h"
+#include "ft_vasprintf.h"
+
+char *convert(t_pformat *pformat, va_list ap)
+{
+ char *str;
+
+ if (pformat == NULL)
+ return (NULL);
+ if (pformat->flags & FLAG_WIDTH_WILDCARD)
+ {
+ if (pformat->flags & FLAG_WIDTH_OVERWRITE)
+ (void)va_arg(ap, int);
+ else
+ pformat->width = va_arg(ap, int);
+ if (pformat->width < 0)
+ {
+ pformat->flags |= FLAG_MINUS;
+ pformat->width *= -1;
+ }
+ }
+ if (pformat->flags & FLAG_PRECISION_WILDCARD)
+ pformat->precision = va_arg(ap, int);
+ if ((str = convert_specifier(ap, pformat)) == NULL)
+ return (NULL);
+ return (str);
+}
+
+char *convert_specifier(va_list ap, t_pformat *pformat)
+{
+ if (pformat->specifier == 'c')
+ return (convert_char(ap, pformat));
+ if (pformat->specifier == 's')
+ return (convert_str(ap, pformat));
+ if (pformat->specifier == 'p')
+ return (convert_ptr(ap, pformat));
+ if (pformat->specifier == 'd' || pformat->specifier == 'i')
+ return (convert_int(ap, pformat));
+ if (pformat->specifier == 'u')
+ return (convert_uint(ap, pformat));
+ if (pformat->specifier == 'x')
+ return (convert_hex(ap, pformat));
+ if (pformat->specifier == 'X')
+ return (convert_hex(ap, pformat));
+ if (pformat->specifier == '%')
+ return (convert_percent(ap, pformat));
+ if (pformat->specifier == 'n')
+ return (convert_written(ap, pformat));
+ else
+ return (convert_none(ap, pformat));
+ return (NULL);
+}
+
+char *handle_width(t_pformat *pformat, char *str)
+{
+ char *tmp;
+ int len;
+ int i;
+
+ if ((len = ft_strlen(str)) >= pformat->width)
+ return (str);
+ if ((tmp = (char*)malloc(sizeof(char) * (pformat->width + 1))) == NULL)
+ return (NULL);
+ if (pformat->flags & FLAG_MINUS)
+ {
+ i = len;
+ ft_strcpy(tmp, str);
+ while (i < pformat->width)
+ tmp[i++] = ' ';
+ tmp[i] = 0;
+ }
+ else
+ {
+ i = 0;
+ while (i <= pformat->width - len)
+ tmp[i++] = pformat->flags & FLAG_ZERO ? '0' : ' ';
+ ft_strcpy(tmp + i - 1, str);
+ }
+ free(str);
+ return (tmp);
+}
+
+char *handle_precision(t_pformat *pformat, char *str)
+{
+ int len;
+ char *tmp;
+
+ if (pformat == NULL || str == NULL)
+ return (NULL);
+ if (ft_strchr("diuxX", pformat->specifier) && pformat->precision >= 0)
+ pformat->flags &= ~FLAG_ZERO;
+ len = ft_strlen(str);
+ if (pformat->precision == 0 && str[0] == '0')
+ {
+ free(str);
+ return (ft_strdup(""));
+ }
+ if (!ft_strchr("diuxXp", pformat->specifier) || len >= pformat->precision)
+ return (str);
+ if ((tmp = (char*)malloc(sizeof(char) * (pformat->precision + 1))) == NULL)
+ return (NULL);
+ ft_strcpy(tmp + pformat->precision - len, str);
+ while (pformat->precision-- > len)
+ tmp[pformat->precision - len] = '0';
+ free(str);
+ return (tmp);
+}
diff --git a/src/ft_printf/convert_char.c b/src/ft_printf/convert_char.c
new file mode 100644
index 0000000..c5f3a93
--- /dev/null
+++ b/src/ft_printf/convert_char.c
@@ -0,0 +1,53 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_char.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:22:29 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:44:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+static char *handle_width_char(t_pformat *pformat, char *str)
+{
+ char *tmp;
+ int i;
+
+ pformat->size = 1;
+ if (1 >= pformat->width)
+ return (str);
+ if ((tmp = (char*)malloc(sizeof(char) * (pformat->width + 1))) == NULL)
+ return (NULL);
+ if (pformat->flags & FLAG_MINUS)
+ {
+ ft_memcpy(tmp, str, (i = 1) + 1);
+ while (i < pformat->width)
+ tmp[i++] = ' ';
+ tmp[i] = 0;
+ }
+ else
+ {
+ i = 0;
+ while (i <= pformat->width - 1)
+ tmp[i++] = pformat->flags & FLAG_ZERO ? '0' : ' ';
+ ft_memcpy(tmp + i - 1, str, 2);
+ }
+ free(str);
+ pformat->size = pformat->width;
+ return (tmp);
+}
+
+char *convert_char(va_list ap, t_pformat *pformat)
+{
+ char *str;
+
+ if ((str = ft_strnew(2)) == NULL)
+ return (NULL);
+ str[0] = va_arg(ap, int);
+ str[1] = '\0';
+ return (handle_width_char(pformat, str));
+}
diff --git a/src/ft_printf/convert_hex.c b/src/ft_printf/convert_hex.c
new file mode 100644
index 0000000..0464dc7
--- /dev/null
+++ b/src/ft_printf/convert_hex.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_hex.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:23:06 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:58:59 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_hex(va_list ap, t_pformat *pformat)
+{
+ char *str;
+ long long unsigned int n;
+
+ n = length_modifier_unsigned_int(ap, pformat);
+ str = pformat->specifier == 'x' ? ITOA_HEX_LOW(n) : ITOA_HEX_UP(n);
+ str = handle_precision(pformat, str);
+ if (pformat->flags & FLAG_ZERO)
+ {
+ if (pformat->flags & FLAG_ALTERNATE && n != 0)
+ pformat->width -= 2;
+ str = handle_width(pformat, str);
+ }
+ if (pformat->flags & FLAG_ALTERNATE && n != 0)
+ str = ft_strjoin_free_snd(pformat->specifier == 'X' ? "0X" : "0x", str);
+ if (!(pformat->flags & FLAG_ZERO))
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_int.c b/src/ft_printf/convert_int.c
new file mode 100644
index 0000000..2345f76
--- /dev/null
+++ b/src/ft_printf/convert_int.c
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_int.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:29:53 by cacharle #+# #+# */
+/* Updated: 2019/11/06 00:00:09 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_int(va_list ap, t_pformat *pformat)
+{
+ int is_neg;
+ long long int n;
+ char *str;
+
+ n = length_modifier_int(ap, pformat);
+ is_neg = n < 0;
+ str = ITOA_DEC(n);
+ if (is_neg)
+ ft_strcpy(str, str + 1);
+ str = handle_precision(pformat, str);
+ if (pformat->flags & FLAG_ZERO)
+ {
+ if (is_neg || pformat->flags & (FLAG_SIGNED | FLAG_SPACE))
+ pformat->width--;
+ str = handle_width(pformat, str);
+ }
+ if (is_neg)
+ str = ft_strjoin_free_snd("-", str);
+ else if (pformat->flags & (FLAG_SIGNED | FLAG_SPACE))
+ str = ft_strjoin_free_snd(pformat->flags & FLAG_SPACE ? " " : "+", str);
+ if (!(pformat->flags & FLAG_ZERO))
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_none.c b/src/ft_printf/convert_none.c
new file mode 100644
index 0000000..358ef1b
--- /dev/null
+++ b/src/ft_printf/convert_none.c
@@ -0,0 +1,25 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_none.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/04 19:30:25 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:44:13 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_none(va_list ap, t_pformat *pformat)
+{
+ char *str;
+
+ (void)ap;
+ if ((str = ft_strdup("")) == NULL)
+ return (NULL);
+ str = handle_precision(pformat, str);
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_percent.c b/src/ft_printf/convert_percent.c
new file mode 100644
index 0000000..813bb77
--- /dev/null
+++ b/src/ft_printf/convert_percent.c
@@ -0,0 +1,23 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_percent.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:23:27 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:44:07 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_percent(va_list ap, t_pformat *pformat)
+{
+ char *str;
+
+ (void)ap;
+ str = ft_strdup("%");
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_ptr.c b/src/ft_printf/convert_ptr.c
new file mode 100644
index 0000000..63babb9
--- /dev/null
+++ b/src/ft_printf/convert_ptr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_ptr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:24:08 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:43:45 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_ptr(va_list ap, t_pformat *pformat)
+{
+ char *str;
+
+ str = ITOA_HEX_LOW((long long unsigned int)va_arg(ap, void*));
+ str = handle_precision(pformat, str);
+ if (!(pformat->flags & FLAG_ZERO))
+ str = ft_strjoin_free_snd("0x", str);
+ if (pformat->flags & FLAG_ZERO)
+ pformat->width -= 2;
+ str = handle_width(pformat, str);
+ if (pformat->flags & FLAG_ZERO)
+ str = ft_strjoin_free_snd("0x", str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_str.c b/src/ft_printf/convert_str.c
new file mode 100644
index 0000000..7d51a5e
--- /dev/null
+++ b/src/ft_printf/convert_str.c
@@ -0,0 +1,25 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_str.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:22:25 by cacharle #+# #+# */
+/* Updated: 2019/11/09 01:07:24 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_str(va_list ap, t_pformat *pformat)
+{
+ char *str;
+
+ str = va_arg(ap, char*);
+ str = str == NULL ? ft_strdup("(null)") : ft_strdup(str);
+ if (pformat->precision >= 0 && pformat->precision < (int)ft_strlen(str))
+ str[pformat->precision] = '\0';
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_uint.c b/src/ft_printf/convert_uint.c
new file mode 100644
index 0000000..4207165
--- /dev/null
+++ b/src/ft_printf/convert_uint.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_uint.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:25:40 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:44:19 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_uint(va_list ap, t_pformat *pformat)
+{
+ char *str;
+ long long unsigned int n;
+
+ if (pformat->flags & FLAG_SHORT)
+ n = (unsigned short)va_arg(ap, int);
+ else if (pformat->flags & FLAG_SHORT_SHORT)
+ n = (unsigned char)va_arg(ap, int);
+ else if (pformat->flags & FLAG_LONG)
+ n = va_arg(ap, long unsigned int);
+ else if (pformat->flags & FLAG_LONG_LONG)
+ n = va_arg(ap, long long unsigned int);
+ else
+ n = va_arg(ap, unsigned int);
+ str = ft_itoa_unsigned_base(n, "0123456789");
+ str = handle_precision(pformat, str);
+ str = handle_width(pformat, str);
+ return (str);
+}
diff --git a/src/ft_printf/convert_written.c b/src/ft_printf/convert_written.c
new file mode 100644
index 0000000..4beeaef
--- /dev/null
+++ b/src/ft_printf/convert_written.c
@@ -0,0 +1,28 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* convert_written.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/30 23:38:28 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:59:24 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+char *convert_written(va_list ap, t_pformat *pformat)
+{
+ if (pformat->flags & FLAG_SHORT)
+ pformat->written = (long long int*)va_arg(ap, signed char*);
+ if (pformat->flags & FLAG_SHORT_SHORT)
+ pformat->written = (long long int*)va_arg(ap, short*);
+ if (pformat->flags & FLAG_LONG)
+ pformat->written = (long long int*)va_arg(ap, long int*);
+ if (pformat->flags & FLAG_LONG_LONG)
+ pformat->written = va_arg(ap, long long int*);
+ else
+ pformat->written = (long long int*)va_arg(ap, int*);
+ return (NULL);
+}
diff --git a/src/ft_printf/extract.c b/src/ft_printf/extract.c
new file mode 100644
index 0000000..c56a777
--- /dev/null
+++ b/src/ft_printf/extract.c
@@ -0,0 +1,98 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* extract.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:10:36 by cacharle #+# #+# */
+/* Updated: 2019/11/10 10:33:33 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+const char *extract_flags(t_pformat *pformat, const char *fmt)
+{
+ if (*fmt == '\0')
+ return (fmt);
+ while (ft_strchr(FLAGS_STR, *fmt) != NULL)
+ {
+ if (*fmt == '0')
+ pformat->flags |= FLAG_ZERO;
+ if (*fmt == '-')
+ pformat->flags |= FLAG_MINUS;
+ if (*fmt == '+')
+ pformat->flags |= FLAG_SIGNED;
+ if (*fmt == ' ')
+ pformat->flags |= FLAG_SPACE;
+ if (*fmt == '#')
+ pformat->flags |= FLAG_ALTERNATE;
+ if (*fmt == '\'')
+ ;
+ fmt++;
+ }
+ if (pformat->flags & FLAG_SIGNED)
+ pformat->flags &= ~FLAG_SPACE;
+ return (fmt);
+}
+
+const char *extract_width(t_pformat *pformat, const char *fmt)
+{
+ if (*fmt == '\0')
+ return (fmt);
+ if (*fmt == '*')
+ {
+ pformat->flags |= FLAG_WIDTH_WILDCARD;
+ fmt++;
+ }
+ if (!ft_isdigit(*fmt))
+ return (fmt);
+ pformat->width = ft_atoi(fmt);
+ while (*fmt && ft_isdigit(*fmt))
+ fmt++;
+ if (pformat->flags & FLAG_WIDTH_WILDCARD)
+ pformat->flags |= FLAG_WIDTH_OVERWRITE;
+ return (fmt);
+}
+
+const char *extract_precision(t_pformat *pformat, const char *fmt)
+{
+ if (*fmt == '\0' || *fmt != '.')
+ return (fmt);
+ fmt++;
+ if (*fmt == '*')
+ {
+ pformat->flags |= FLAG_PRECISION_WILDCARD;
+ fmt++;
+ }
+ pformat->precision = ft_atoi(fmt);
+ while (*fmt && ft_isdigit(*fmt))
+ fmt++;
+ return (fmt);
+}
+
+const char *extract_length_modifier(t_pformat *pformat, const char *fmt)
+{
+ if (fmt[0] && fmt[0] == 'l')
+ {
+ if (fmt[1] && fmt[1] == 'l')
+ {
+ pformat->flags |= FLAG_LONG_LONG;
+ return (fmt + 2);
+ }
+ pformat->flags |= FLAG_LONG;
+ return (fmt + 1);
+ }
+ if (fmt[0] && fmt[0] == 'h')
+ {
+ if (fmt[1] && fmt[1] == 'h')
+ {
+ pformat->flags |= FLAG_SHORT_SHORT;
+ return (fmt + 2);
+ }
+ pformat->flags |= FLAG_SHORT;
+ return (fmt + 1);
+ }
+ return (fmt);
+}
diff --git a/src/ft_printf/ft_printf.c b/src/ft_printf/ft_printf.c
new file mode 100644
index 0000000..daa0cf2
--- /dev/null
+++ b/src/ft_printf/ft_printf.c
@@ -0,0 +1,92 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:15:28 by cacharle #+# #+# */
+/* Updated: 2019/11/13 08:56:49 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+int ft_printf(const char *format, ...)
+{
+ t_printf_status status;
+
+ if (format == NULL)
+ return (STATUS_ERROR);
+ if (!parse(format, &status.flist))
+ return (STATUS_ERROR);
+ va_start(status.ap, format);
+ status.format = format;
+ status.out = NULL;
+ status.out_size = 0;
+ while (*status.format)
+ {
+ if (*status.format == '%'
+ && (status.format =
+ add_conversion(&status, status.flist->content)) == NULL)
+ return (destroy_status_error(&status));
+ else if ((status.format = add_between(&status)) == NULL)
+ return (destroy_status_error(&status));
+ }
+ va_end(status.ap);
+ list_destroy(&status.flist);
+ write(STDOUT_FILENO, status.out, status.out_size);
+ free(status.out);
+ return (status.out_size);
+}
+
+const char *add_conversion(t_printf_status *status, t_pformat *pformat)
+{
+ char *conversion_str;
+
+ conversion_str = convert(pformat, status->ap);
+ if (pformat->specifier == 'n')
+ {
+ if (pformat->written != NULL)
+ *pformat->written = status->out_size;
+ status->format += pformat->fmt_len;
+ list_pop_front(&status->flist);
+ return (status->format + 1);
+ }
+ if (conversion_str == NULL)
+ return (NULL);
+ if (pformat->specifier != 'c')
+ pformat->size = ft_strlen(conversion_str);
+ if ((status->out = ft_memjoin_free(status->out, status->out_size,
+ conversion_str, pformat->size)) == NULL)
+ return (NULL);
+ status->out_size += pformat->size;
+ free(conversion_str);
+ status->format += pformat->fmt_len;
+ list_pop_front(&status->flist);
+ return (status->format + 1);
+}
+
+const char *add_between(t_printf_status *status)
+{
+ int i;
+
+ i = 0;
+ while (status->format[i] && status->format[i] != '%')
+ i++;
+ if ((status->out = ft_memjoin_free(status->out, status->out_size,
+ (void*)status->format, i)) == NULL)
+ return (NULL);
+ status->out_size += i;
+ return (status->format + i);
+}
+
+int destroy_status_error(t_printf_status *status)
+{
+ if (status == NULL)
+ return (STATUS_ERROR);
+ va_end(status->ap);
+ list_destroy(&status->flist);
+ free(status->out);
+ return (STATUS_ERROR);
+}
diff --git a/src/ft_printf/ft_vasprintf.h b/src/ft_printf/ft_vasprintf.h
new file mode 100644
index 0000000..4110557
--- /dev/null
+++ b/src/ft_printf/ft_vasprintf.h
@@ -0,0 +1,155 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* header.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:06:46 by cacharle #+# #+# */
+/* Updated: 2019/11/13 09:29:23 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef HEADER_H
+# define HEADER_H
+
+# include <unistd.h>
+# include <stdlib.h>
+# include <stdarg.h>
+# include "libft.h"
+
+# define STATUS_ERROR -1
+
+# define SPECIFIERS_STR "nfcspdiuxX%"
+# define FLAGS_STR "#0- +'"
+
+# define IS_STANDALONE_FLAG(c) (ft_strchr(FLAGS_STR, c) != NULL)
+
+# define FLAG_MINUS (1 << 0)
+# define FLAG_ZERO (1 << 1)
+# define FLAG_SIGNED (1 << 2)
+# define FLAG_SPACE (1 << 3)
+# define FLAG_ALTERNATE (1 << 4)
+# define FLAG_SHORT (1 << 5)
+# define FLAG_SHORT_SHORT (1 << 6)
+# define FLAG_LONG (1 << 7)
+# define FLAG_LONG_LONG (1 << 8)
+# define FLAG_WIDTH_WILDCARD (1 << 9)
+# define FLAG_PRECISION_WILDCARD (1 << 10)
+# define FLAG_WIDTH_OVERWRITE (1 << 11)
+
+# define ITOA_HEX_LOW(x) (ft_itoa_unsigned_base(x, "0123456789abcdef"))
+# define ITOA_HEX_UP(x) (ft_itoa_unsigned_base(x, "0123456789ABCDEF"))
+# define ITOA_DEC(x) (ft_itoa_base(x, "0123456789"))
+
+typedef int t_bool;
+typedef short t_flags;
+typedef long long int t_big_int;
+typedef long long unsigned int t_big_uint;
+
+typedef struct
+{
+ int precision;
+ int width;
+ t_flags flags;
+ char specifier;
+ int fmt_len;
+ int size;
+ long long int *written;
+} t_pformat;
+
+typedef struct s_flist
+{
+ struct s_flist *next;
+ t_pformat *content;
+} t_flist;
+
+typedef struct s_printf_status
+{
+ va_list ap;
+ t_flist *flist;
+ const char *format;
+ char *out;
+ int out_size;
+} t_printf_status;
+
+/*
+** ft_printf.c
+*/
+
+int ft_printf(const char *format, ...);
+const char *add_conversion(t_printf_status *status,
+ t_pformat *pformat);
+const char *add_between(t_printf_status *status);
+int destroy_status_error(t_printf_status *status);
+
+/*
+** parse.c
+*/
+
+int parse(const char *format, t_flist **flist);
+t_pformat *parse_reduced(const char *fmt);
+
+/*
+** printer.c
+*/
+
+char *convert(t_pformat *pformat, va_list ap);
+char *convert_specifier(va_list ap, t_pformat *pformat);
+char *handle_width(t_pformat *pformat, char *str);
+char *handle_precision(t_pformat *pformat, char *str);
+
+/*
+** utils.c
+*/
+
+char *ft_itoa_base(long long int n, char *base);
+char *ft_itoa_unsigned_base(long long unsigned int n,
+ char *base);
+void *ft_memjoin_free(void *dst, int dst_size, void *src,
+ int src_size);
+
+/*
+** extract.c
+*/
+
+const char *extract_flags(t_pformat *pformat, const char *fmt);
+const char *extract_width(t_pformat *pformat, const char *fmt);
+const char *extract_precision(t_pformat *pformat, const char *fmt);
+const char *extract_length_modifier(t_pformat *pformat,
+ const char *fmt);
+
+/*
+** list.c
+*/
+
+t_flist *list_new(t_pformat *content);
+void *list_destroy(t_flist **lst);
+void list_push_front(t_flist **lst, t_flist *new);
+void list_pop_front(t_flist **lst);
+t_flist *list_reverse(t_flist *lst);
+
+/*
+** convert_*.c
+*/
+
+char *convert_char(va_list ap, t_pformat *pformat);
+char *convert_str(va_list ap, t_pformat *pformat);
+char *convert_ptr(va_list ap, t_pformat *pformat);
+char *convert_int(va_list ap, t_pformat *pformat);
+char *convert_uint(va_list ap, t_pformat *pformat);
+char *convert_hex(va_list ap, t_pformat *pformat);
+char *convert_percent(va_list ap, t_pformat *pformat);
+char *convert_written(va_list ap, t_pformat *pformat);
+char *convert_double(va_list ap, t_pformat *pformat);
+char *convert_none(va_list ap, t_pformat *pformat);
+
+/*
+** length_modifier.c
+*/
+
+t_big_uint length_modifier_unsigned_int(
+ va_list ap, t_pformat *pformat);
+t_big_int length_modifier_int(va_list ap, t_pformat *pformat);
+
+#endif
diff --git a/src/ft_printf/length_modifier.c b/src/ft_printf/length_modifier.c
new file mode 100644
index 0000000..88226da
--- /dev/null
+++ b/src/ft_printf/length_modifier.c
@@ -0,0 +1,39 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* length_modifier.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/05 23:56:07 by cacharle #+# #+# */
+/* Updated: 2019/11/09 00:50:06 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+t_big_uint length_modifier_unsigned_int(va_list ap, t_pformat *pformat)
+{
+ if (pformat->flags & FLAG_SHORT)
+ return ((unsigned short)va_arg(ap, int));
+ else if (pformat->flags & FLAG_SHORT_SHORT)
+ return ((unsigned char)va_arg(ap, int));
+ else if (pformat->flags & FLAG_LONG)
+ return (va_arg(ap, long unsigned int));
+ else if (pformat->flags & FLAG_LONG_LONG)
+ return (va_arg(ap, long long unsigned int));
+ return (va_arg(ap, unsigned int));
+}
+
+t_big_int length_modifier_int(va_list ap, t_pformat *pformat)
+{
+ if (pformat->flags & FLAG_SHORT)
+ return ((short)va_arg(ap, int));
+ else if (pformat->flags & FLAG_SHORT_SHORT)
+ return ((signed char)va_arg(ap, int));
+ else if (pformat->flags & FLAG_LONG)
+ return (va_arg(ap, long int));
+ else if (pformat->flags & FLAG_LONG_LONG)
+ return (va_arg(ap, long long int));
+ return (va_arg(ap, int));
+}
diff --git a/src/ft_printf/list.c b/src/ft_printf/list.c
new file mode 100644
index 0000000..99491f4
--- /dev/null
+++ b/src/ft_printf/list.c
@@ -0,0 +1,67 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* list.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:14:50 by cacharle #+# #+# */
+/* Updated: 2019/11/05 23:45:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+t_flist *list_new(t_pformat *content)
+{
+ t_flist *lst;
+
+ if ((lst = (t_flist*)malloc(sizeof(t_flist))) == NULL)
+ return (NULL);
+ lst->content = content;
+ lst->next = NULL;
+ return (lst);
+}
+
+void *list_destroy(t_flist **lst)
+{
+ if (lst == NULL)
+ return (NULL);
+ while (*lst != NULL)
+ list_pop_front(lst);
+ return (NULL);
+}
+
+void list_push_front(t_flist **lst, t_flist *new)
+{
+ if (lst == NULL || new == NULL)
+ return ;
+ new->next = *lst;
+ *lst = new;
+}
+
+void list_pop_front(t_flist **lst)
+{
+ t_flist *tmp;
+
+ if (lst == NULL || *lst == NULL)
+ return ;
+ tmp = (*lst)->next;
+ free((*lst)->content);
+ free(*lst);
+ *lst = tmp;
+}
+
+t_flist *list_reverse(t_flist *lst)
+{
+ t_flist *tmp;
+
+ if (lst == NULL)
+ return (NULL);
+ if (lst->next == NULL)
+ return (lst);
+ tmp = list_reverse(lst->next);
+ lst->next->next = lst;
+ lst->next = NULL;
+ return (tmp);
+}
diff --git a/src/ft_printf/parse.c b/src/ft_printf/parse.c
new file mode 100644
index 0000000..33928a0
--- /dev/null
+++ b/src/ft_printf/parse.c
@@ -0,0 +1,61 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* parse.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:11:33 by cacharle #+# #+# */
+/* Updated: 2019/11/13 08:13:02 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+int parse(const char *format, t_flist **flist)
+{
+ t_flist *tmp;
+ t_pformat *parsed;
+
+ *flist = NULL;
+ while (*format)
+ {
+ format++;
+ if (format[-1] != '%')
+ continue;
+ if ((parsed = parse_reduced(format)) == NULL)
+ return ((int)list_destroy(flist));
+ if ((tmp = list_new(parsed)) == NULL)
+ return ((int)list_destroy(flist));
+ list_push_front(flist, tmp);
+ format += (*flist)->content->fmt_len;
+ }
+ *flist = list_reverse(*flist);
+ return (1);
+}
+
+t_pformat *parse_reduced(const char *fmt)
+{
+ t_pformat *pformat;
+ const char *start;
+
+ if ((pformat = (t_pformat*)malloc(sizeof(t_pformat))) == NULL)
+ return (NULL);
+ pformat->precision = -1;
+ pformat->width = -1;
+ pformat->flags = 0;
+ start = fmt;
+ fmt = extract_flags(pformat, fmt);
+ fmt = extract_width(pformat, fmt);
+ fmt = extract_precision(pformat, fmt);
+ fmt = extract_length_modifier(pformat, fmt);
+ pformat->fmt_len = fmt - start + 1;
+ if (*fmt == '\0' || ft_strchr(SPECIFIERS_STR, *fmt) == NULL)
+ {
+ pformat->fmt_len--;
+ pformat->specifier = '_';
+ }
+ else
+ pformat->specifier = *ft_strchr(SPECIFIERS_STR, *fmt);
+ return (pformat);
+}
diff --git a/src/ft_printf/utils.c b/src/ft_printf/utils.c
new file mode 100644
index 0000000..ad44980
--- /dev/null
+++ b/src/ft_printf/utils.c
@@ -0,0 +1,115 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/29 00:12:40 by cacharle #+# #+# */
+/* Updated: 2019/11/13 08:49:58 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_vasprintf.h"
+
+static int nbrlen_radix(long long int nbr, int radix)
+{
+ int counter;
+ long long unsigned int u_nbr;
+
+ if (nbr == 0)
+ return (1);
+ counter = 0;
+ u_nbr = nbr;
+ if (nbr < 0)
+ {
+ counter++;
+ u_nbr = -nbr;
+ }
+ while (u_nbr > 0)
+ {
+ u_nbr /= radix;
+ counter++;
+ }
+ return (counter);
+}
+
+char *ft_itoa_base(long long int n, char *base)
+{
+ char *str;
+ int len;
+ int radix;
+ long long unsigned int u_nbr;
+
+ radix = ft_strlen(base);
+ len = nbrlen_radix(n, radix);
+ if ((str = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ str[len] = '\0';
+ u_nbr = n < 0 ? -n : n;
+ if (n < 0)
+ str[0] = '-';
+ while (--len >= (n < 0 ? 1 : 0))
+ {
+ str[len] = base[u_nbr % radix];
+ u_nbr /= radix;
+ }
+ return (str);
+}
+
+static int nbrlen_unsigned_radix(long long unsigned int nbr, int radix)
+{
+ int counter;
+
+ if (nbr == 0)
+ return (1);
+ counter = 0;
+ while (nbr > 0)
+ {
+ nbr /= radix;
+ counter++;
+ }
+ return (counter);
+}
+
+char *ft_itoa_unsigned_base(long long unsigned int n, char *base)
+{
+ char *str;
+ int len;
+ int radix;
+
+ radix = ft_strlen(base);
+ len = nbrlen_unsigned_radix(n, radix);
+ if ((str = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ str[len] = '\0';
+ while (--len >= 0)
+ {
+ str[len] = base[n % radix];
+ n /= radix;
+ }
+ return (str);
+}
+
+void *ft_memjoin_free(void *dst, int dst_size, void *src, int src_size)
+{
+ void *clone;
+
+ if (dst == NULL)
+ {
+ if ((dst = malloc(src_size)) == NULL)
+ return (NULL);
+ ft_memcpy(dst, src, src_size);
+ return (dst);
+ }
+ if ((clone = malloc(dst_size)) == NULL)
+ return (NULL);
+ ft_memcpy(clone, dst, dst_size);
+ free(dst);
+ if ((dst = malloc(dst_size + src_size)) == NULL)
+ return (NULL);
+ ft_memcpy(dst, clone, dst_size);
+ free(clone);
+ ft_memcpy(dst + dst_size, src, src_size);
+ return (dst);
+}
diff --git a/src/ft_putchar.c b/src/ft_putchar.c
new file mode 100644
index 0000000..2838f0a
--- /dev/null
+++ b/src/ft_putchar.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putchar.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:53:31 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:49:14 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putchar(char c)
+{
+ write(STDOUT_FILENO, &c, 1);
+}
diff --git a/src/ft_putchar_fd.c b/src/ft_putchar_fd.c
new file mode 100644
index 0000000..97d6f7a
--- /dev/null
+++ b/src/ft_putchar_fd.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putchar_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:42:34 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:49:28 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putchar_fd(char c, int fd)
+{
+ if (fd < 0 || fd > OPEN_MAX)
+ return ;
+ write(fd, &c, 1);
+}
diff --git a/src/ft_putendl.c b/src/ft_putendl.c
new file mode 100644
index 0000000..880977e
--- /dev/null
+++ b/src/ft_putendl.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putendl.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:42:54 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:00:32 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putendl(char *s)
+{
+ ft_putendl_fd(s, STDOUT_FILENO);
+}
diff --git a/src/ft_putendl_fd.c b/src/ft_putendl_fd.c
new file mode 100644
index 0000000..a8077fc
--- /dev/null
+++ b/src/ft_putendl_fd.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putendl_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:44:06 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:00:07 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putendl_fd(char *s, int fd)
+{
+ if (s == NULL || fd < 0 || fd > OPEN_MAX)
+ return ;
+ ft_putstr_fd(s, fd);
+ ft_putchar_fd('\n', fd);
+}
diff --git a/src/ft_putnbr.c b/src/ft_putnbr.c
new file mode 100644
index 0000000..247df40
--- /dev/null
+++ b/src/ft_putnbr.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putnbr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:52:33 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:59:34 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putnbr(int n)
+{
+ ft_putnbr_fd(n, STDOUT_FILENO);
+}
diff --git a/src/ft_putnbr_fd.c b/src/ft_putnbr_fd.c
new file mode 100644
index 0000000..169d1b5
--- /dev/null
+++ b/src/ft_putnbr_fd.c
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putnbr_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:40:35 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:46:11 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putnbr_fd(int n, int fd)
+{
+ unsigned int p_n;
+
+ if (fd < 0 || fd > OPEN_MAX)
+ return ;
+ p_n = n;
+ if (n < 0)
+ {
+ ft_putchar_fd('-', fd);
+ p_n = -n;
+ }
+ if (p_n > 9)
+ ft_putnbr_fd(p_n / 10, fd);
+ ft_putchar_fd(p_n % 10 | 0x30, fd);
+}
diff --git a/src/ft_putstr.c b/src/ft_putstr.c
new file mode 100644
index 0000000..14b01a3
--- /dev/null
+++ b/src/ft_putstr.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putstr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 09:52:12 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:48:48 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putstr(char const *s)
+{
+ ft_putstr_fd((char*)s, STDOUT_FILENO);
+}
diff --git a/src/ft_putstr_fd.c b/src/ft_putstr_fd.c
new file mode 100644
index 0000000..d0279ab
--- /dev/null
+++ b/src/ft_putstr_fd.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putstr_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:40:15 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:47:59 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putstr_fd(char *s, int fd)
+{
+ if (s == NULL || fd < 0 || fd > OPEN_MAX)
+ return ;
+ write(fd, s, ft_strlen(s));
+}
diff --git a/src/ft_snprintf.c b/src/ft_snprintf.c
new file mode 100644
index 0000000..e1fdfbd
--- /dev/null
+++ b/src/ft_snprintf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_snprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:27:55 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:41:49 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_snprintf(char *str, size_t size, const char *format, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, format);
+ ret = ft_vsnprintf(str, size, format, ap);
+ va_end(ap);
+ return (ret);
+}
diff --git a/src/ft_split.c b/src/ft_split.c
new file mode 100644
index 0000000..6fb5964
--- /dev/null
+++ b/src/ft_split.c
@@ -0,0 +1,73 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_split.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/17 08:29:02 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:08:27 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+static size_t count_segment(char const *s, char c)
+{
+ size_t counter;
+ int i;
+
+ counter = 0;
+ i = 0;
+ while (s[i])
+ {
+ if (s[i] == c)
+ {
+ i++;
+ continue ;
+ }
+ counter++;
+ while (s[i] && s[i] != c)
+ i++;
+ }
+ return (counter);
+}
+
+static void *destroy_strs(char **strs)
+{
+ if (strs == NULL)
+ return (NULL);
+ while (*strs != NULL)
+ free(*strs++);
+ free(strs);
+ return (NULL);
+}
+
+char **ft_split(char const *s, char c)
+{
+ char **strs;
+ size_t tab_counter;
+ size_t i;
+ size_t j;
+
+ if (s == NULL)
+ return (NULL);
+ tab_counter = count_segment(s, c);
+ if ((strs = (char**)malloc(sizeof(char*) * (tab_counter + 1))) == NULL)
+ return (NULL);
+ tab_counter = 0;
+ j = -1;
+ while (s[++j])
+ {
+ if (s[j] == c)
+ continue ;
+ i = 0;
+ while (s[j + i] && s[j + i] != c)
+ i++;
+ if ((strs[tab_counter++] = ft_strndup(&s[j], i)) == NULL)
+ return (destroy_strs(strs));
+ j += i - 1;
+ }
+ strs[tab_counter] = NULL;
+ return (strs);
+}
diff --git a/src/ft_sprintf.c b/src/ft_sprintf.c
new file mode 100644
index 0000000..31da75e
--- /dev/null
+++ b/src/ft_sprintf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_sprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:17:21 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:42:28 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_sprintf(char *str, const char *format, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, format);
+ ret = ft_vsprintf(str, format, ap);
+ va_end(ap);
+ return (ret);
+}
diff --git a/src/ft_strcat.c b/src/ft_strcat.c
new file mode 100644
index 0000000..d5bc7e0
--- /dev/null
+++ b/src/ft_strcat.c
@@ -0,0 +1,19 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strcat.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:09:41 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:03:38 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strcat(char *dest, const char *src)
+{
+ ft_memcpy(dest + ft_strlen(dest), src, ft_strlen(src) + 1);
+ return (dest);
+}
diff --git a/src/ft_strchr.c b/src/ft_strchr.c
new file mode 100644
index 0000000..50bfc0a
--- /dev/null
+++ b/src/ft_strchr.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:14:47 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:04:52 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strchr(const char *s, int c)
+{
+ return (ft_memchr(s, c, ft_strlen(s) + 1));
+}
diff --git a/src/ft_strclr.c b/src/ft_strclr.c
new file mode 100644
index 0000000..7e412fe
--- /dev/null
+++ b/src/ft_strclr.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strclr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:15:18 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:11:51 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_strclr(char *s)
+{
+ if (s == NULL)
+ return ;
+ ft_bzero(s, ft_strlen(s));
+}
diff --git a/src/ft_strcmp.c b/src/ft_strcmp.c
new file mode 100644
index 0000000..1978286
--- /dev/null
+++ b/src/ft_strcmp.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strcmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:16:07 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:58:27 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_strcmp(const char *s1, const char *s2)
+{
+ return (ft_memcmp(s1, s2, ft_strlen(s1) + 1));
+}
diff --git a/src/ft_strcount.c b/src/ft_strcount.c
new file mode 100644
index 0000000..87e756d
--- /dev/null
+++ b/src/ft_strcount.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strcount.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/15 09:17:48 by cacharle #+# #+# */
+/* Updated: 2019/11/15 09:19:36 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_strcount(char *str, char c)
+{
+ int counter;
+
+ if (c == '\0')
+ return (1);
+ counter = 0;
+ while (*str)
+ if (*str++ == c)
+ counter++;
+ return (counter);
+}
diff --git a/src/ft_strcpy.c b/src/ft_strcpy.c
new file mode 100644
index 0000000..9677b24
--- /dev/null
+++ b/src/ft_strcpy.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:38:36 by cacharle #+# #+# */
+/* Updated: 2019/11/20 23:25:57 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strcpy(char *dest, const char *src)
+{
+ return (ft_memcpy(dest, src, ft_strlen(src) + 1));
+}
diff --git a/src/ft_strdel.c b/src/ft_strdel.c
new file mode 100644
index 0000000..05cf064
--- /dev/null
+++ b/src/ft_strdel.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strdel.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:39:14 by cacharle #+# #+# */
+/* Updated: 2019/11/20 01:58:27 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_strdel(char **as)
+{
+ ft_memdel((void*)as);
+}
diff --git a/src/ft_strdup.c b/src/ft_strdup.c
new file mode 100644
index 0000000..65a6ac6
--- /dev/null
+++ b/src/ft_strdup.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strdup.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:18:07 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:13:47 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strdup(const char *s)
+{
+ char *clone;
+
+ if ((clone = ft_strnew(ft_strlen(s))) == NULL)
+ return (NULL);
+ return (ft_strcpy(clone, s));
+}
diff --git a/src/ft_strequ.c b/src/ft_strequ.c
new file mode 100644
index 0000000..75ccb81
--- /dev/null
+++ b/src/ft_strequ.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strequ.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:18:34 by cacharle #+# #+# */
+/* Updated: 2019/11/20 02:00:22 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_strequ(char const *s1, char const *s2)
+{
+ if (s1 == NULL || s2 == NULL)
+ return (0);
+ return (ft_strcmp(s1, s2) == 0);
+}
diff --git a/src/ft_striter.c b/src/ft_striter.c
new file mode 100644
index 0000000..f410d24
--- /dev/null
+++ b/src/ft_striter.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_striter.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:38:16 by cacharle #+# #+# */
+/* Updated: 2019/11/20 02:01:32 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_striter(char *s, void (*f)(char *))
+{
+ if (s == NULL || f == NULL)
+ return ;
+ while (*s)
+ (*f)(s++);
+}
diff --git a/src/ft_striteri.c b/src/ft_striteri.c
new file mode 100644
index 0000000..05f15d4
--- /dev/null
+++ b/src/ft_striteri.c
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_striteri.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:33:09 by cacharle #+# #+# */
+/* Updated: 2019/11/20 02:01:41 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_striteri(char *s, void (*f)(unsigned int, char *))
+{
+ unsigned int i;
+
+ if (s == NULL || f == NULL)
+ return ;
+ 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..2bc4908
--- /dev/null
+++ b/src/ft_strjoin.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strjoin.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:35:26 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:20 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strjoin(char const *s1, char const *s2)
+{
+ char *joined;
+
+ if (s1 == NULL || s2 == NULL)
+ return (NULL);
+ if ((joined = ft_strnew(ft_strlen(s1) + ft_strlen(s2))) == NULL)
+ return (NULL);
+ return (ft_strcat(ft_strcpy(joined, s1), s2));
+}
diff --git a/src/ft_strjoin_free.c b/src/ft_strjoin_free.c
new file mode 100644
index 0000000..4050b77
--- /dev/null
+++ b/src/ft_strjoin_free.c
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strjoin_free.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/05 21:32:48 by cacharle #+# #+# */
+/* Updated: 2019/11/14 10:07:10 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stdlib.h>
+#include "libft.h"
+
+char *ft_strjoin_free(char const *s1, char const *s2, int free_nb)
+{
+ char *joined;
+
+ if (s1 == NULL || s2 == NULL || free_nb < 0 || free_nb > 2)
+ return (NULL);
+ if ((joined = ft_strjoin(s1, s2)) == NULL)
+ return (NULL);
+ if (free_nb == 1)
+ free((void*)s1);
+ if (free_nb == 2)
+ {
+ free((void*)s1);
+ free((void*)s2);
+ }
+ return (joined);
+}
diff --git a/src/ft_strjoin_free_snd.c b/src/ft_strjoin_free_snd.c
new file mode 100644
index 0000000..0503211
--- /dev/null
+++ b/src/ft_strjoin_free_snd.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strjoin_free_snd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/05 22:12:56 by cacharle #+# #+# */
+/* Updated: 2019/11/14 10:07:19 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include <stdlib.h>
+#include "libft.h"
+
+char *ft_strjoin_free_snd(char const *s1, char const *s2)
+{
+ char *joined;
+
+ if (s1 == NULL || s2 == NULL)
+ return (NULL);
+ if ((joined = ft_strjoin(s1, s2)) == NULL)
+ return (NULL);
+ free((void*)s2);
+ return (joined);
+}
diff --git a/src/ft_strlcat.c b/src/ft_strlcat.c
new file mode 100644
index 0000000..ce7fa0b
--- /dev/null
+++ b/src/ft_strlcat.c
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcat.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:31:37 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:31:08 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlcat(char *dst, const char *src, size_t size)
+{
+ size_t i;
+ size_t j;
+ size_t dst_len;
+ size_t src_len;
+
+ dst_len = ft_strlen(dst);
+ src_len = ft_strlen(src);
+ if (size <= dst_len)
+ return (src_len + size);
+ i = 0;
+ j = dst_len;
+ while (src[i] && j < size - 1)
+ dst[j++] = src[i++];
+ dst[j] = '\0';
+ return (dst_len + src_len);
+}
diff --git a/src/ft_strlcpy.c b/src/ft_strlcpy.c
new file mode 100644
index 0000000..6afb8f5
--- /dev/null
+++ b/src/ft_strlcpy.c
@@ -0,0 +1,28 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 12:28:47 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:31:16 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlcpy(char *dst, const char *src, size_t size)
+{
+ unsigned int i;
+
+ if (dst == NULL || src == NULL)
+ return (0);
+ if (size == 0)
+ return (ft_strlen(src));
+ i = -1;
+ while (++i < size - 1 && src[i] != '\0')
+ dst[i] = src[i];
+ dst[i] = '\0';
+ return (ft_strlen(src));
+}
diff --git a/src/ft_strlen.c b/src/ft_strlen.c
new file mode 100644
index 0000000..0e0a47c
--- /dev/null
+++ b/src/ft_strlen.c
@@ -0,0 +1,41 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlen.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:32:48 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:45:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlen(const char *s)
+{
+ unsigned long int *ptr;
+ const char *cpy;
+
+ ptr = (unsigned long int*)s;
+ while (TRUE)
+ {
+ cpy = (const char*)ptr++;
+ if (cpy[0] == '\0')
+ return (cpy - s);
+ if (cpy[1] == '\0')
+ return (cpy + 1 - s);
+ if (cpy[2] == '\0')
+ return (cpy + 2 - s);
+ if (cpy[3] == '\0')
+ return (cpy + 3 - s);
+ if (cpy[4] == '\0')
+ return (cpy + 4 - s);
+ if (cpy[5] == '\0')
+ return (cpy + 5 - s);
+ if (cpy[6] == '\0')
+ return (cpy + 6 - s);
+ if (cpy[7] == '\0')
+ return (cpy + 7 - s);
+ }
+}
diff --git a/src/ft_strmap.c b/src/ft_strmap.c
new file mode 100644
index 0000000..61d16f1
--- /dev/null
+++ b/src/ft_strmap.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strmap.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:29:52 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:11 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strmap(char const *s, char (*f)(char))
+{
+ size_t i;
+ size_t len;
+ char *mapped;
+
+ if (s == NULL || f == NULL)
+ return (NULL);
+ len = ft_strlen(s);
+ if ((mapped = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ i = 0;
+ while (i < len)
+ {
+ mapped[i] = (*f)(s[i]);
+ i++;
+ }
+ mapped[i] = '\0';
+ return (mapped);
+}
diff --git a/src/ft_strmapi.c b/src/ft_strmapi.c
new file mode 100644
index 0000000..71d77e4
--- /dev/null
+++ b/src/ft_strmapi.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strmapi.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:29:32 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:02:15 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strmapi(char *s, char (*f)(unsigned int, char))
+{
+ size_t i;
+ size_t len;
+ char *mapped;
+
+ if (s == NULL || f == NULL)
+ return (NULL);
+ len = ft_strlen(s);
+ if ((mapped = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ i = 0;
+ while (i < len)
+ {
+ mapped[i] = (*f)((unsigned int)i, s[i]);
+ i++;
+ }
+ mapped[i] = '\0';
+ return (mapped);
+}
diff --git a/src/ft_strncat.c b/src/ft_strncat.c
new file mode 100644
index 0000000..d68db0a
--- /dev/null
+++ b/src/ft_strncat.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strncat.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:28:37 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:33:22 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strncat(char *dest, const char *src, size_t n)
+{
+ size_t i;
+ size_t j;
+
+ i = ft_strlen(dest);
+ j = 0;
+ while (j < n && src[j])
+ {
+ dest[i + j] = src[j];
+ j++;
+ }
+ dest[i + j] = '\0';
+ return (dest);
+}
diff --git a/src/ft_strncmp.c b/src/ft_strncmp.c
new file mode 100644
index 0000000..cd303fc
--- /dev/null
+++ b/src/ft_strncmp.c
@@ -0,0 +1,25 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strncmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:27:34 by cacharle #+# #+# */
+/* Updated: 2019/11/21 01:56:32 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_strncmp(const char *s1, const char *s2, size_t n)
+{
+ size_t i;
+
+ if (n == 0)
+ return (0);
+ i = 0;
+ while (i + 1 < n && s1[i] == s2[i] && s1[i])
+ i++;
+ return ((unsigned char)s1[i] - (unsigned char)s2[i]);
+}
diff --git a/src/ft_strncpy.c b/src/ft_strncpy.c
new file mode 100644
index 0000000..a0cfb4c
--- /dev/null
+++ b/src/ft_strncpy.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strncpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:26:59 by cacharle #+# #+# */
+/* Updated: 2019/11/21 02:49:48 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strncpy(char *dest, const char *src, size_t n)
+{
+ size_t len;
+
+ len = ft_strlen(src);
+ ft_memcpy(dest, src, MIN(n, len));
+ if (len < n)
+ ft_bzero(dest + len, n - len);
+ return (dest);
+}
diff --git a/src/ft_strndup.c b/src/ft_strndup.c
new file mode 100644
index 0000000..0683dae
--- /dev/null
+++ b/src/ft_strndup.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strndup.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/25 03:28:52 by cacharle #+# #+# */
+/* Updated: 2019/11/20 04:15:44 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strndup(const char *s1, size_t n)
+{
+ char *clone;
+
+ if ((clone = ft_strnew(n)) == NULL)
+ return (NULL);
+ return (ft_strncpy(clone, s1, n));
+}
diff --git a/src/ft_strnequ.c b/src/ft_strnequ.c
new file mode 100644
index 0000000..e242ee7
--- /dev/null
+++ b/src/ft_strnequ.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strnequ.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:30:27 by cacharle #+# #+# */
+/* Updated: 2019/11/20 02:00:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_strnequ(char const *s1, char const *s2, size_t n)
+{
+ if (s1 == NULL || s2 == NULL)
+ return (0);
+ return (ft_strncmp(s1, s2, n) == 0);
+}
diff --git a/src/ft_strnew.c b/src/ft_strnew.c
new file mode 100644
index 0000000..1bca6d5
--- /dev/null
+++ b/src/ft_strnew.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strnew.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:17:34 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:16:14 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strnew(size_t size)
+{
+ return ((char*)ft_calloc(size + 1, sizeof(char)));
+}
diff --git a/src/ft_strnstr.c b/src/ft_strnstr.c
new file mode 100644
index 0000000..4995637
--- /dev/null
+++ b/src/ft_strnstr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strnstr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:25:13 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:58:42 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strnstr(const char *haystack, const char *needle, size_t len)
+{
+ size_t needle_len;
+
+ needle_len = ft_strlen(needle);
+ if (needle_len == 0)
+ return ((char*)haystack);
+ while (*haystack && len-- >= needle_len)
+ {
+ if (ft_strnequ(haystack, needle, needle_len))
+ return ((char*)haystack);
+ haystack++;
+ }
+ return (NULL);
+}
diff --git a/src/ft_strrchr.c b/src/ft_strrchr.c
new file mode 100644
index 0000000..56c8be5
--- /dev/null
+++ b/src/ft_strrchr.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strrchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:26:24 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:36:47 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strrchr(const char *s, int c)
+{
+ size_t i;
+
+ i = ft_strlen(s) + 1;
+ while (s[--i] != (char)c)
+ if (i == 0)
+ return (NULL);
+ return ((char*)s + i);
+}
diff --git a/src/ft_strstr.c b/src/ft_strstr.c
new file mode 100644
index 0000000..4d4d403
--- /dev/null
+++ b/src/ft_strstr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strstr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:15:29 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:58:32 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strstr(const char *haystack, const char *needle)
+{
+ size_t needle_len;
+
+ needle_len = ft_strlen(needle);
+ if (needle_len == 0)
+ return ((char*)haystack);
+ while (*haystack)
+ {
+ if (ft_strnequ(haystack, needle, needle_len))
+ return ((char*)haystack);
+ haystack++;
+ }
+ return (NULL);
+}
diff --git a/src/ft_strtrim.c b/src/ft_strtrim.c
new file mode 100644
index 0000000..aa48826
--- /dev/null
+++ b/src/ft_strtrim.c
@@ -0,0 +1,31 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strtrim.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:24:16 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:52:58 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strtrim(char const *s1, char const *set)
+{
+ size_t start;
+ size_t len;
+
+ if (s1 == NULL || set == NULL)
+ return (NULL);
+ start = 0;
+ while (s1[start] && ft_strchr(set, s1[start]) != NULL)
+ start++;
+ len = ft_strlen(&s1[start]);
+ if (len != 0)
+ while (s1[start + len - 1]
+ && ft_strchr(set, s1[start + len - 1]) != NULL)
+ len--;
+ return (ft_substr(s1, start, len));
+}
diff --git a/src/ft_substr.c b/src/ft_substr.c
new file mode 100644
index 0000000..84d6c58
--- /dev/null
+++ b/src/ft_substr.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_substr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/17 08:28:49 by cacharle #+# #+# */
+/* Updated: 2019/11/20 03:57:58 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_substr(char const *s, unsigned int start, size_t len)
+{
+ char *sub;
+
+ if (s == NULL)
+ return (NULL);
+ if ((sub = ft_strnew(len)) == NULL)
+ return (NULL);
+ if (start > ft_strlen(s))
+ return (sub);
+ return (ft_strncpy(sub, s + start, len));
+}
diff --git a/src/ft_tolower.c b/src/ft_tolower.c
new file mode 100644
index 0000000..919469f
--- /dev/null
+++ b/src/ft_tolower.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_tolower.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:14:26 by cacharle #+# #+# */
+/* Updated: 2019/11/20 01:04:02 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+/*
+** E: 0100 0101
+** e: 0110 0101
+** ^
+*/
+
+int ft_tolower(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ return (c | 0b00100000);
+ return (c);
+}
diff --git a/src/ft_toupper.c b/src/ft_toupper.c
new file mode 100644
index 0000000..8579b91
--- /dev/null
+++ b/src/ft_toupper.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_toupper.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/07 10:14:10 by cacharle #+# #+# */
+/* Updated: 2019/11/20 01:04:51 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_toupper(int c)
+{
+ if (c >= 'a' && c <= 'z')
+ return (c ^ 0b00100000);
+ return (c);
+}
diff --git a/src/ft_vasprintf.c b/src/ft_vasprintf.c
new file mode 100644
index 0000000..85f66bc
--- /dev/null
+++ b/src/ft_vasprintf.c
@@ -0,0 +1,21 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vasprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:49:56 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:45:39 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_vasprintf(char **ret, const char *format, va_list ap)
+{
+ (void)ret;
+ (void)format;
+ (void)ap;
+ return (0);
+}
diff --git a/src/ft_vdprintf.c b/src/ft_vdprintf.c
new file mode 100644
index 0000000..a5e5ebf
--- /dev/null
+++ b/src/ft_vdprintf.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vdprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:40:03 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:46:00 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_vdprintf(int fd, const char *format, va_list ap)
+{
+ int out_len;
+ char *out;
+
+ if ((out_len = ft_vasprintf(&out, format, ap)) == -1)
+ return (-1);
+ write(fd, out, out_len);
+ return (out_len);
+}
diff --git a/src/ft_vprintf.c b/src/ft_vprintf.c
new file mode 100644
index 0000000..b98670b
--- /dev/null
+++ b/src/ft_vprintf.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:32:44 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:44:11 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_vprintf(const char *format, va_list ap)
+{
+ return (ft_vdprintf(STDOUT_FILENO, format, ap));
+}
diff --git a/src/ft_vsnprintf.c b/src/ft_vsnprintf.c
new file mode 100644
index 0000000..7db988c
--- /dev/null
+++ b/src/ft_vsnprintf.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vsnprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:36:32 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:45:14 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_vsnprintf(char *str, size_t size, const char *format, va_list ap)
+{
+ int ret;
+ int full_out_len;
+ char *full_out;
+
+ full_out_len = ft_vasprintf(&full_out, format, ap);
+ ft_strncpy(str, full_out, size);
+ ret = MIN((size_t)full_out_len, size);
+ free(full_out);
+ return (ret);
+}
diff --git a/src/ft_vsprintf.c b/src/ft_vsprintf.c
new file mode 100644
index 0000000..91b4815
--- /dev/null
+++ b/src/ft_vsprintf.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vsprintf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/11/21 02:34:17 by cacharle #+# #+# */
+/* Updated: 2019/11/21 03:44:24 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_vsprintf(char *str, const char *format, va_list ap)
+{
+ return (ft_vsnprintf(str, INT_MAX + 1, format, ap));
+}
diff --git a/src/get_next_line/get_next_line.c b/src/get_next_line/get_next_line.c
new file mode 100644
index 0000000..e51f152
--- /dev/null
+++ b/src/get_next_line/get_next_line.c
@@ -0,0 +1,115 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* get_next_line.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/10/19 09:08:36 by cacharle #+# #+# */
+/* Updated: 2020/01/15 07:26:50 by cacharle ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "get_next_line.h"
+
+#define HAS_NEWLINE(str, split_at) ((split_at = gnl_find_newline(str)) != -1)
+
+static int gnl_find_newline(char *str)
+{
+ int i;
+
+ i = -1;
+ while (str[++i])
+ if (str[i] == '\n')
+ return (i);
+ return (-1);
+}
+
+static int gnl_free_return(char **ptr, char **ptr2, int ret)
+{
+ if (ptr != NULL)
+ {
+ free(*ptr);
+ *ptr = NULL;
+ }
+ if (ptr2 != NULL)
+ {
+ free(*ptr2);
+ *ptr2 = NULL;
+ }
+ return (ret);
+}
+
+static int gnl_read_line(int fd, char **line, char *rest)
+{
+ int ret;
+ int split_at;
+ char *buf;
+
+ if ((buf = malloc(sizeof(char) * (BUFFER_SIZE + 1))) == NULL)
+ return (gnl_free_return(line, NULL, GNL_STATUS_ERROR));
+ while ((ret = read(fd, buf, BUFFER_SIZE)) > 0)
+ {
+ buf[ret] = '\0';
+ if (HAS_NEWLINE(buf, split_at))
+ {
+ ft_strcpy(rest, buf + split_at + 1);
+ buf[split_at] = '\0';
+ if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL)
+ return (gnl_free_return(&buf, NULL, GNL_STATUS_ERROR));
+ return (gnl_free_return(&buf, NULL, GNL_STATUS_LINE));
+ }
+ if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL)
+ return (gnl_free_return(&buf, NULL, GNL_STATUS_ERROR));
+ }
+ if (ret == -1)
+ return (gnl_free_return(&buf, line, GNL_STATUS_ERROR));
+ return (gnl_free_return(&buf, NULL, ret));
+}
+
+/*
+** if has rest:
+** if rest has newline:
+** push rest until newline in line, shift rest
+** return LINE_READ
+** else:
+** push rest in line
+**
+** while can read fd in buf
+** if buf has newline:
+** push buf until newline in line
+** push buf after newline in rest
+** return LINE_READ
+** push buf in line
+**
+** return GNL_EOF
+*/
+
+int get_next_line(int fd, char **line)
+{
+ int split_at;
+ static char rest[OPEN_MAX][BUFFER_SIZE + 1] = {{0}};
+
+ if (fd < 0 || fd > OPEN_MAX || line == NULL || BUFFER_SIZE <= 0)
+ return (GNL_STATUS_ERROR);
+ if ((*line = ft_strdup("")) == NULL)
+ return (GNL_STATUS_ERROR);
+ if (rest[fd][0] == '\0')
+ return (gnl_read_line(fd, line, rest[fd]));
+ if (HAS_NEWLINE(rest[fd], split_at))
+ {
+ free(*line);
+ if ((*line = (char*)malloc(sizeof(char) * (split_at + 1))) == NULL)
+ return (GNL_STATUS_ERROR);
+ ft_strncpy(*line, rest[fd], split_at);
+ (*line)[split_at] = '\0';
+ ft_strcpy(rest[fd], rest[fd] + split_at + 1);
+ return (GNL_STATUS_LINE);
+ }
+ free(*line);
+ if (!(*line = (char*)malloc(sizeof(char) * (ft_strlen(rest[fd]) + 1))))
+ return (GNL_STATUS_ERROR);
+ ft_strcpy(*line, rest[fd]);
+ rest[fd][0] = '\0';
+ return (gnl_read_line(fd, line, rest[fd]));
+}