From 7723c2b0c39440e0542be17d03ab0f7b815ed7ae Mon Sep 17 00:00:00 2001 From: lfirmin Date: Sun, 16 Nov 2025 09:51:24 +0100 Subject: [PATCH] push --- Makefile | 61 +++++++++++++++++++++++++++++++++++++++++++++ ft_adrr_len.c | 27 ++++++++++++++++++++ ft_conv_ith.c | 30 ++++++++++++++++++++++ ft_count.c | 27 ++++++++++++++++++++ ft_hex_len.c | 27 ++++++++++++++++++++ ft_itoa.c | 36 ++++++++++++++++++++++++++ ft_print_ith.c | 20 +++++++++++++++ ft_print_nbr.c | 23 +++++++++++++++++ ft_print_null.c | 18 +++++++++++++ ft_print_ptr.c | 30 ++++++++++++++++++++++ ft_print_unsigned.c | 23 +++++++++++++++++ ft_printchar.c | 18 +++++++++++++ ft_printf.c | 39 +++++++++++++++++++++++++++++ ft_printpercent.c | 18 +++++++++++++ ft_printstr.c | 27 ++++++++++++++++++++ ft_put_ptr.c | 28 +++++++++++++++++++++ ft_putchar.c | 17 +++++++++++++ ft_sorting.c | 34 +++++++++++++++++++++++++ ft_unsigned_itoa.c | 34 +++++++++++++++++++++++++ ftprintf.h | 43 ++++++++++++++++++++++++++++++++ 20 files changed, 580 insertions(+) create mode 100644 Makefile create mode 100644 ft_adrr_len.c create mode 100644 ft_conv_ith.c create mode 100644 ft_count.c create mode 100644 ft_hex_len.c create mode 100644 ft_itoa.c create mode 100644 ft_print_ith.c create mode 100644 ft_print_nbr.c create mode 100644 ft_print_null.c create mode 100644 ft_print_ptr.c create mode 100644 ft_print_unsigned.c create mode 100644 ft_printchar.c create mode 100644 ft_printf.c create mode 100644 ft_printpercent.c create mode 100644 ft_printstr.c create mode 100644 ft_put_ptr.c create mode 100644 ft_putchar.c create mode 100644 ft_sorting.c create mode 100644 ft_unsigned_itoa.c create mode 100644 ftprintf.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..88b4bb7 --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: lfirmin lfirmim@student.42.fr> +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/08/12 07:07:31 by lfirmin #+# #+# # +# Updated: 2024/08/12 09:15:05 by lfirmin ### ########.fr # +# # +# **************************************************************************** # + +NAME = libftprintf.a +HEADER = ./ +SRC = ft_putchar.c ft_put_ptr.c ft_conv_ith.c ft_hex_len.c \ + ft_sorting.c ft_printf.c ft_print_ith.c ft_printchar.c \ + ft_printstr.c ft_printpercent.c ft_print_unsigned.c \ + ft_print_nbr.c ft_print_ptr.c ft_adrr_len.c ft_print_null.c \ + ft_itoa.c ft_unsigned_itoa.c ft_count.c + +CC = cc +CFLAGS = -Wall -Wextra -Werror +INCLUDE = -I $(HEADER) +OBJ_DIR = obj/ +OBJ = $(addprefix $(OBJ_DIR), $(SRC:.c=.o)) + + +GREEN = \033[0;32m +YELLOW = \033[0;33m +RESET = \033[0m +WHITE = \033[0;97m + +LOADING_CHARS = ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏ + +all: $(NAME) + +$(NAME): $(OBJ) + @printf "$(YELLOW)Compiling ft_printf, Please wait...$(RESET)" + @for char in $(LOADING_CHARS); do \ + printf "\r$(YELLOW)Compiling ft_print, Please wait... $$char$(RESET)"; \ + sleep 0.1; \ + done + @ar rc $(NAME) $(OBJ)`` + @ranlib $(NAME) + @printf "\r$(GREEN)Great news ! $(WHITE)ft_printf compiled successfully ! $(RESET)\n" + +$(OBJ_DIR)%.o: %.c + @mkdir -p $(OBJ_DIR) + @$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +clean: + @rm -rf $(OBJ_DIR) + @printf "$(WHITE)Clean process completed for $(GREEN)Ft_printf.$(RESET)\n" + +fclean: clean + @rm -f $(NAME) + @printf "$(WHITE)Full clean process completed for $(GREEN)Ft_printf.$(RESET)\n" + +re: fclean all + +.PHONY: all clean fclean re diff --git a/ft_adrr_len.c b/ft_adrr_len.c new file mode 100644 index 0000000..47b4153 --- /dev/null +++ b/ft_adrr_len.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_adrr_len.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 05:16:57 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:50:34 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_adrr_len(unsigned long long nbr) +{ + int i; + + if (nbr == 0) + return (1); + i = 0; + while (nbr != 0) + { + i++; + nbr = nbr / 16; + } + return (i); +} diff --git a/ft_conv_ith.c b/ft_conv_ith.c new file mode 100644 index 0000000..472574b --- /dev/null +++ b/ft_conv_ith.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_conv_ith.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:46:47 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:46:23 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +void ft_conv_ith(int fd, unsigned int nbr, const char str) +{ + if (nbr >= 16) + { + ft_conv_ith(fd, (nbr / 16), str); + nbr = nbr % 16; + } + if (nbr <= 9) + ft_putchar(fd, nbr + '0'); + else + { + if (str == 'x') + ft_putchar(fd, nbr - 10 + 'a'); + else if (str == 'X') + ft_putchar(fd, nbr - 10 + 'A'); + } +} diff --git a/ft_count.c b/ft_count.c new file mode 100644 index 0000000..24e6e21 --- /dev/null +++ b/ft_count.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_count.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:52:36 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:47:07 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +size_t ft_count(long long int n) +{ + size_t c; + + c = 0; + if (n <= 0) + c = 1; + while (n != 0) + { + n = n / 10; + c++; + } + return (c); +} diff --git a/ft_hex_len.c b/ft_hex_len.c new file mode 100644 index 0000000..29baa8b --- /dev/null +++ b/ft_hex_len.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hex_len.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:45:50 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:49:59 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_hex_len(unsigned int nbr) +{ + int i; + + if (nbr == 0) + return (1); + i = 0; + while (nbr != 0) + { + i++; + nbr = nbr / 16; + } + return (i); +} diff --git a/ft_itoa.c b/ft_itoa.c new file mode 100644 index 0000000..138ed77 --- /dev/null +++ b/ft_itoa.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:51:58 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:53:33 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +char *ft_itoa(int n) +{ + char *str; + size_t size; + long int num; + + num = n; + size = ft_count(num); + str = (char *)malloc(size + 1); + if (!str) + return (NULL); + str[size] = '\0'; + if (num < 0) + num = -num; + while (size--) + { + str[size] = num % 10 + '0'; + num = num / 10; + if (n < 0 && size == 0) + str[size] = '-'; + } + return (str); +} diff --git a/ft_print_ith.c b/ft_print_ith.c new file mode 100644 index 0000000..e94502e --- /dev/null +++ b/ft_print_ith.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_ith.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:44:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:49:51 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_print_ith(int fd, unsigned int nbr, const char str) +{ + if (nbr == 0) + return (write(fd, "0", 1)); + ft_conv_ith(fd, nbr, str); + return (ft_hex_len(nbr)); +} diff --git a/ft_print_nbr.c b/ft_print_nbr.c new file mode 100644 index 0000000..b83098e --- /dev/null +++ b/ft_print_nbr.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_nbr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:44:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:52:47 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_print_nbr(int fd, int nb) +{ + int len; + char *str; + + str = ft_itoa(nb); + len = ft_printstr(fd, str); + free (str); + return (len); +} diff --git a/ft_print_null.c b/ft_print_null.c new file mode 100644 index 0000000..e596cd1 --- /dev/null +++ b/ft_print_null.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_null.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 07:01:50 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:46:39 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_print_null(int fd) +{ + write(fd, "(null)", 6); + return (6); +} diff --git a/ft_print_ptr.c b/ft_print_ptr.c new file mode 100644 index 0000000..3d68c29 --- /dev/null +++ b/ft_print_ptr.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_ptr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:44:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:51:10 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_print_ptr(int fd, unsigned long long ptr) +{ + int print_length; + + if (ptr == 0) + { + write(fd, "(nil)", 5); + return (5); + } + print_length = 2; + write(fd, "0x", 2); + { + ft_put_ptr(fd, ptr); + print_length = print_length + ft_adrr_len(ptr); + } + return (print_length); +} diff --git a/ft_print_unsigned.c b/ft_print_unsigned.c new file mode 100644 index 0000000..28c81f3 --- /dev/null +++ b/ft_print_unsigned.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_unsigned.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:50:53 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:51:31 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_print_unsigned(int fd, unsigned int nb) +{ + int len; + char *str; + + str = ft_unsigned_itoa(nb); + len = ft_printstr(fd, str); + free (str); + return (len); +} diff --git a/ft_printchar.c b/ft_printchar.c new file mode 100644 index 0000000..02180e7 --- /dev/null +++ b/ft_printchar.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:56:02 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:56:25 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_printchar(int fd, int c) +{ + write (fd, &c, 1); + return (1); +} diff --git a/ft_printf.c b/ft_printf.c new file mode 100644 index 0000000..033dc54 --- /dev/null +++ b/ft_printf.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:44:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:55:41 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_printf_fd(int fd, const char *str, ...) +{ + int i; + va_list list; + int count; + + i = 0; + count = 0; + va_start(list, str); + while (str[i]) + { + if (str[i] == '%') + { + count += ft_sorting(list, str[i + 1], fd); + i++; + } + else + { + write (fd, &str[i], 1); + count++; + } + i++; + } + va_end(list); + return (count); +} diff --git a/ft_printpercent.c b/ft_printpercent.c new file mode 100644 index 0000000..eccd4c8 --- /dev/null +++ b/ft_printpercent.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printpercent.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:47:38 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:50:08 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_printpercent(int fd) +{ + ft_putchar(fd, '%'); + return (1); +} diff --git a/ft_printstr.c b/ft_printstr.c new file mode 100644 index 0000000..7b8b4ca --- /dev/null +++ b/ft_printstr.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:55:08 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:46:05 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_printstr(int fd, char *s) +{ + int i; + + if (!s) + return (ft_print_null(fd)); + i = 0; + while (s[i]) + { + write (fd, &s[i], 1); + i++; + } + return (i); +} diff --git a/ft_put_ptr.c b/ft_put_ptr.c new file mode 100644 index 0000000..bcc1954 --- /dev/null +++ b/ft_put_ptr.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_put_ptr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:54:06 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:46:52 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +void ft_put_ptr(int fd, unsigned long long num) +{ + if (num >= 16) + { + ft_put_ptr(fd, num / 16); + ft_put_ptr(fd, num % 16); + } + else + { + if (num <= 9) + ft_putchar(fd, num + '0'); + else + ft_putchar(fd, num - 10 + 'a'); + } +} diff --git a/ft_putchar.c b/ft_putchar.c new file mode 100644 index 0000000..4c68cdd --- /dev/null +++ b/ft_putchar.c @@ -0,0 +1,17 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:45:04 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 04:49:11 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +void ft_putchar(int fd, char c) +{ + write(fd, &c, 1); +} diff --git a/ft_sorting.c b/ft_sorting.c new file mode 100644 index 0000000..4d456de --- /dev/null +++ b/ft_sorting.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sorting.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:56:45 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:51:17 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +int ft_sorting(va_list list, const char str, int fd) +{ + int count; + + count = 0; + if (str == 'c') + count += ft_printchar(fd, va_arg(list, int)); + else if (str == 's') + count += ft_printstr(fd, va_arg(list, char *)); + else if (str == 'p') + count += ft_print_ptr(fd, va_arg(list, unsigned long long)); + else if (str == 'd' || str == 'i') + count += ft_print_nbr(fd, va_arg(list, int)); + else if (str == 'u') + count += ft_print_unsigned(fd, va_arg(list, unsigned int)); + else if (str == 'x' || str == 'X') + count += ft_print_ith(fd, va_arg(list, unsigned int), str); + else if (str == '%') + count += ft_printpercent(fd); + return (count); +} diff --git a/ft_unsigned_itoa.c b/ft_unsigned_itoa.c new file mode 100644 index 0000000..5b897cf --- /dev/null +++ b/ft_unsigned_itoa.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_unsigned_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:51:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:45:46 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include "ftprintf.h" + +char *ft_unsigned_itoa(unsigned int n) +{ + char *str; + size_t size; + long int num; + + num = n; + size = ft_count(num); + str = (char *)malloc(size + 1); + if (!str) + return (NULL); + str[size] = '\0'; + if (num < 0) + num = -num; + while (size--) + { + str[size] = num % 10 + '0'; + num = num / 10; + } + return (str); +} diff --git a/ftprintf.h b/ftprintf.h new file mode 100644 index 0000000..d4dac01 --- /dev/null +++ b/ftprintf.h @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ftprintf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lfirmin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 04:44:27 by lfirmin #+# #+# */ +/* Updated: 2024/06/19 07:49:08 by lfirmin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FTPRINTF_H +# define FTPRINTF_H + +# include +# include +# include +# include "stdlib.h" + +void ft_putchar(int fd, char c); +void ft_put_ptr(int fd, unsigned long long num); +void ft_conv_ith(int fd, unsigned int nbr, const char str); + +int ft_hex_len(unsigned int nbr); +int ft_sorting(va_list list, const char str, int fd); +int ft_printf_fd(int fd, const char *str, ...); +int ft_print_ith(int fd, unsigned int nbr, const char str); +int ft_printchar(int fd, int c); +int ft_printstr(int fd, char *s); +int ft_printpercent(int fd); +int ft_print_unsigned(int fd, unsigned int nb); +int ft_print_nbr(int fd, int nb); +int ft_print_ptr(int fd, unsigned long long ptr); +int ft_adrr_len(unsigned long long nbr); +int ft_print_null(int fd); + +char *ft_itoa(int n); +char *ft_unsigned_itoa(unsigned int n); + +size_t ft_count(long long int n); + +#endif \ No newline at end of file