From 3da275fc74041d58e04018f4b614e76234d405d7 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 17 Sep 2025 18:07:53 +0200 Subject: [PATCH 01/19] core(ignore): adding ignore to the repository --- .gitignore | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..047dce2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,61 @@ +to_do* +# Prerequisites +*.d + +# Object files +build/ +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex +.test/ + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf +.clangd + +# Nix files +*.lock +.envrc +.direnv/ From 51d05f5ba4f6ed2cbc6bcbbd5d4f760c995d53fa Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 17 Sep 2025 18:08:25 +0200 Subject: [PATCH 02/19] core(nix/flake): adding flake for developpement on nixos --- flake.nix | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 flake.nix diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b34baa6 --- /dev/null +++ b/flake.nix @@ -0,0 +1,23 @@ +{ + description = "Flake for 42 C"; + + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + c_formatter_42.url = "github:maix-flake/c_formatter_42"; + }; + outputs = { self, nixpkgs, flake-utils, c_formatter_42 }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in { + devShell = pkgs.mkShell { + packages = [ + c_formatter_42.packages.${system}.default + pkgs.clang + pkgs.clang-tools + pkgs.fastmod + pkgs.norminette + pkgs.tree + ] ++ (if pkgs.stdenv.isLinux then [ pkgs.valgrind ] else [ ]); + }; + }); +} From 72fe023c9f0dacc3c43ff79a233cba0500b564ff Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 17 Sep 2025 18:09:17 +0200 Subject: [PATCH 03/19] core: starting from zero wait from zero like nothing ? Oh no your first bra... --- libft/ft_strdup.c | 26 --------------- libft/ft_strlcpy.c | 31 ------------------ libft/ft_strlen.c | 23 ------------- src/ft_printf.c | 64 ------------------------------------ src/ft_printf.h | 35 -------------------- src/ft_put.c | 82 ---------------------------------------------- 6 files changed, 261 deletions(-) delete mode 100644 libft/ft_strdup.c delete mode 100644 libft/ft_strlcpy.c delete mode 100644 libft/ft_strlen.c delete mode 100644 src/ft_printf.c delete mode 100644 src/ft_printf.h delete mode 100644 src/ft_put.c diff --git a/libft/ft_strdup.c b/libft/ft_strdup.c deleted file mode 100644 index 2574a8b..0000000 --- a/libft/ft_strdup.c +++ /dev/null @@ -1,26 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_strdup.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/07 16:53:59 by rparodi #+# #+# */ -/* Updated: 2023/11/16 15:12:05 by rparodi ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../src/ft_printf.h" - -char *ft_strdup(const char *s) -{ - size_t len; - char *to_return; - - len = ft_strlen(s) + 1; - to_return = (char *)malloc(sizeof(char) * len); - if (!to_return) - return (NULL); - ft_strlcpy(to_return, s, len); - return (to_return); -} diff --git a/libft/ft_strlcpy.c b/libft/ft_strlcpy.c deleted file mode 100644 index c33887f..0000000 --- a/libft/ft_strlcpy.c +++ /dev/null @@ -1,31 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_strlcpy.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/07 16:55:25 by rparodi #+# #+# */ -/* Updated: 2023/11/16 15:12:05 by rparodi ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../src/ft_printf.h" - -size_t ft_strlcpy(char *dst, const char *src, size_t size) -{ - size_t i; - - i = 0; - while (src[i] && i + 1 < size) - { - dst[i] = src[i]; - i++; - } - if (size > 0) - { - dst[i] = '\0'; - i++; - } - return (ft_strlen(src)); -} diff --git a/libft/ft_strlen.c b/libft/ft_strlen.c deleted file mode 100644 index 58ae310..0000000 --- a/libft/ft_strlen.c +++ /dev/null @@ -1,23 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_strlen.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/07 16:56:24 by rparodi #+# #+# */ -/* Updated: 2023/11/16 15:11:46 by rparodi ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../src/ft_printf.h" - -size_t ft_strlen(const char *s) -{ - size_t i; - - i = 0; - while (s[i] != '\0') - i++; - return (i); -} diff --git a/src/ft_printf.c b/src/ft_printf.c deleted file mode 100644 index 940b566..0000000 --- a/src/ft_printf.c +++ /dev/null @@ -1,64 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_printf.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/14 17:27:44 by rparodi #+# #+# */ -/* Updated: 2023/12/14 18:17:22 by raphael ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ft_printf.h" - -int ft_check_args(char c, va_list args, int *ret_value) -{ - if (c == 'c') - ft_putchar((char)va_arg(args, int), ret_value); - else if (c == 's') - ft_putstr((char *)va_arg(args, char *), ret_value); - else if (c == 'i' || c == 'd') - ft_putnbr((int)va_arg(args, int), ret_value); - else if (c == '%') - ft_putchar('%', ret_value); - else if (c == 'u') - ft_putnbr_unsigned((unsigned int)va_arg(args, unsigned int), ret_value); - else if (c == 'x') - ft_putnbr_base((unsigned int)va_arg(args, unsigned int), \ - "0123456789abcdef", ret_value, c); - else if (c == 'X') - ft_putnbr_base((unsigned int)va_arg(args, unsigned int), \ - "0123456789ABCDEF", ret_value, c); - else if (c == 'p') - ft_putnbr_base((unsigned long long)va_arg(args, unsigned long long), \ - "0123456789abcdef", ret_value, c); - va_end(args); - return (1); -} - -int ft_printf(const char *s, ...) -{ - size_t i; - va_list args; - char *str; - int ret_value; - - ret_value = 0; - str = ft_strdup(s); - va_start(args, s); - i = 0; - while (str[i]) - { - if (str[i] == '%') - { - ft_check_args(str[i + 1], args, &ret_value); - i++; - } - else - ft_putchar(str[i], &ret_value); - i++; - } - free(str); - return (ret_value); -} diff --git a/src/ft_printf.h b/src/ft_printf.h deleted file mode 100644 index 3bc6780..0000000 --- a/src/ft_printf.h +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_printf.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/14 15:59:10 by rparodi #+# #+# */ -/* Updated: 2023/11/16 15:10:41 by rparodi ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef FT_PRINTF_H -# define FT_PRINTF_H -# include -# include -# include - -# define UINT_MAX 4294967295 -# define INT_MAX 2147483647 -# define INT_MIN -2147483648 - -int ft_printf(const char *str, ...); -int ft_check_args(char c, va_list args, int *ret_value); -void ft_putnbr_unsigned(unsigned int nb, int *ret_value); -void ft_putnbr(int nb, int *ret_value); -void ft_putchar(char c, int *ret_value); -void ft_putstr(char *str, int *ret_value); -void ft_putnbr_base(\ - unsigned long long nbr, char *base, int *ret_value, char c); -size_t ft_strlcpy(char *dst, const char *src, size_t size); -size_t ft_strlen(const char *s); -char *ft_strdup(const char *s); - -#endif diff --git a/src/ft_put.c b/src/ft_put.c deleted file mode 100644 index f2c269f..0000000 --- a/src/ft_put.c +++ /dev/null @@ -1,82 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_put.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rparodi +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/11/16 12:13:14 by rparodi #+# #+# */ -/* Updated: 2023/12/23 17:33:46 by raphael ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ft_printf.h" - -void ft_putchar(char c, int *ret_value) -{ - write(1, &c, 1); - (*ret_value)++; -} - -void ft_putnbr(int nb, int *ret_value) -{ - if (nb < 0) - { - if (nb == INT_MIN) - { - write(1, "-2147483648", 11); - *ret_value += 11; - return ; - } - nb = -nb; - ft_putchar('-', ret_value); - } - if (nb >= 10) - { - ft_putnbr(nb / 10, ret_value); - nb = nb % 10; - } - if (nb < 10) - ft_putchar(nb + 48, ret_value); -} - -void ft_putnbr_base(\ - unsigned long long nbr, char *base, int *ret_value, char c) -{ - if (c == 'p') - { - if (nbr != 0) - ft_putstr("0x", ret_value); - else if (nbr == 0) - { - ft_putstr("(nil)", ret_value); - return ; - } - c++; - } - if (c != 'p') - { - if (nbr >= 16) - ft_putnbr_base(nbr / 16, base, ret_value, c); - ft_putchar(base[nbr % 16], ret_value); - } -} - -void ft_putnbr_unsigned(unsigned int nb, int *ret_value) -{ - if (nb >= 10) - { - ft_putnbr_unsigned(nb / 10, ret_value); - nb = nb % 10; - } - if (nb < 10) - ft_putchar(nb + 48, ret_value); -} - -void ft_putstr(char *str, int *ret_value) -{ - if (!str) - *ret_value += write(1, "(null)", 6); - else - *ret_value += write(1, str, ft_strlen(str)); -} From c4578adb89eef161a4a024298b5d862013cb2300 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 17 Sep 2025 18:11:03 +0200 Subject: [PATCH 04/19] core: starting from zero wait from zero like nothing ? Oh no your first bra... --- README.md | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index f3dc15a..0000000 --- a/README.md +++ /dev/null @@ -1,6 +0,0 @@ -This project is pretty straightforward, you have to recode printf. You will learn what is and how to implement variadic functions. Once you validate it, you will reuse this function in your future projects. -## -| Keywords | Skills | -| ------|-----| -| Unix Logic | Algorithms & AI | -|| Rigor | From f92000241afc6726d215b1e4e7340701bf9564e4 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 17 Sep 2025 18:12:04 +0200 Subject: [PATCH 05/19] build: starting from my new Makefile template --- Makefile | 144 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index 564d4c0..40b8a6a 100644 --- a/Makefile +++ b/Makefile @@ -6,61 +6,127 @@ # By: rparodi +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/12 11:05:05 by rparodi #+# #+# # -# Updated: 2023/12/27 18:35:14 by raphael ### ########.fr # +# Updated: 2025/09/17 17:39:49 by rparodi ### ########.fr # # # # **************************************************************************** # -NAME=libftprintf.a -CC=clang -CFLAGS=-Wall -Wextra -Werror -RM=rm -f -LIBFT = ./libft/ft_strdup.c ./libft/ft_strlcpy.c ./libft/ft_strlen.c -SRC = ./src/ft_printf.c ./src/ft_put.c -OBJ = $(SRC:.c=.o) -OBJLibft = $(LIBFT:.c=.o) +# Variables +# Name +NAME = libftprintf.a + +# Commands +CC ?= clang +RM = rm -rf + +# Flags +CFLAGS = -Werror -Wextra -Wall + +INC_DIR = includes +CPPFLAGS = $(addprefix -I, $(INC_DIR)) -MMD -MP + + +# Objects +OBJDIRNAME = ./build +OBJ = $(addprefix $(OBJDIRNAME)/,$(SRC:.c=.o)) + +SRC = + +# Colors GREEN = \033[32m GREY = \033[0;90m RED = \033[0;31m GOLD = \033[38;5;220m END = \033[0m -all: header $(NAME) - @printf '\n$(GREY) Compilation $(GREEN)Done\n' +# Rules -header: - @printf '\n\n' - @printf '$(GOLD) ******* ***** ******* $(END)\n' - @printf '$(GOLD) ****** *** ******* $(END)\n' - @printf '$(GOLD) ******* ******* $(END)\n' - @printf '$(GOLD) ****** ******* $(END)\n' - @printf '$(GOLD) ******* ******* $(END)\n' - @printf '$(GOLD) ******************** ******* * $(END)\n' - @printf '$(GOLD) ******************** ******* *** $(END)\n' - @printf '$(GOLD) ******* ******* ****** $(END)\n' - @printf '$(GOLD) ******* $(END)\n' - @printf '$(GOLD) ******* $(END)\n\n' - @printf '$(GREY) Made by rparodi$(END)\n\n\n' +# All (make all) +all: header $(NAME) footer -$(NAME): $(OBJ) $(OBJLibft) - @printf '$(GREY) Compiling $(END)$(GOLD)$(NAME)$(END)\n' - @ar rc $(NAME) $(OBJ) $(OBJLibft) - @ranlib $(NAME) +lib: $(NAME) -%.o: %.c - @printf '$(GREY) Compiling $(END)$(GREEN)$<$(END)\n' - @$(CC) -I. -o $@ -c $? $(CFLAGS) - -dev: all bonus clean +# Bonus (make bonus) +bonus: header $(OBJ) $(LIB_OBJ) footer + @mkdir -p $(OBJDIRNAME) + @mkdir -p $(OBJDIRNAME)/$(SRCDIRNAME) + @printf '$(GREY) Be Carefull ur in $(END)$(GREEN)Debug Mode$(END)\n' + @$(CC) $(CFLAGS) $(CPPFLAGS) -D BONUS=1 -o $(NAME) $(OBJ) $(LIB_OBJ) +# Clean (make clean) clean: - @printf '$(GREY) Removing $(END)$(RED)Object$(END)\n' - @$(RM) $(OBJ) $(OBJLibft) + @printf '$(GREY) Removing $(END)$(RED)Objects$(END)\n' + @printf '$(GREY) Removing $(END)$(RED)Objects Folder$(END)\n' + @$(RM) $(OBJDIRNAME) +# Clean (make fclean) fclean: clean - @printf '$(GREY) Removing $(END)$(RED)Program$(END)\n' - @$(RM) $(NAME) + @printf '$(GREY) Removing $(END)$(RED)Program$(END)\n' + @$(RM) $(NAME) + @$(RM) ./.test/ + @echo "" -re: fclean all +# Restart (make re) +re: header fclean all -.PHONY: all bonus clean fclean re dev header +# Dependences for all +$(NAME): $(OBJ) + @mkdir -p $(OBJDIRNAME) + @ar rc $(NAME) $(OBJ) + @ranlib $(NAME) + +# Creating the objects +$(OBJDIRNAME)/%.o: %.c + @mkdir -p $(dir $@) + @printf '$(GREY) Compiling $(END)$(GREEN)$<$(END)\n' + @$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< + +# Header +header: + @clear + @printf '\n\n' + @printf '$(GOLD) ******* ****** ******* $(END)\n' + @printf '$(GOLD) ****** *** ******* $(END)\n' + @printf '$(GOLD) ******* * ******* $(END)\n' + @printf '$(GOLD) ****** ******* $(END)\n' + @printf '$(GOLD) ******* ******* $(END)\n' + @printf '$(GOLD) ******************* ******* * $(END)\n' + @printf '$(GOLD) ******************* ******* *** $(END)\n' + @printf '$(GOLD) ****** ******* ****** $(END)\n' + @printf '$(GOLD) ****** $(END)\n' + @printf '$(GOLD) ****** $(END)\n' + @printf '$(GREY) Made by rparodi$(END)\n\n' + +# Footer +footer: + @printf "\n" + @printf "$(GOLD) ,_ _,$(END)\n" + @printf "$(GOLD) | \\___//|$(END)\n" + @printf "$(GOLD) |=6 6=|$(END)\n" + @printf "$(GOLD) \\=._Y_.=/$(END)\n" + @printf "$(GOLD) ) \` ( ,$(END)\n" + @printf "$(GOLD) / \\ (('$(END)\n" + @printf "$(GOLD) | | ))$(END)\n" + @printf "$(GOLD) /| | | |\\_//$(END)\n" + @printf "$(GOLD) \\| |._.| |/-\`$(END)\n" + @printf "$(GOLD) '\"' '\"'$(END)\n" + @printf ' $(GREY)The compilation is$(END) $(GOLD)finished$(END)\n $(GREY)Have a good $(END)$(GOLD)correction !$(END)\n' + +clangd: + @printf "CompileFlags:\n" > ./.clangd + @printf " Add:\n" >> ./.clangd + @printf " - \"-xc\"\n" >> ./.clangd + @for FLAG in $(CXXFLAGS); do \ + printf " - \"$$FLAG\"\n" >> ./.clangd; \ + done + @printf " - \"-I"$(shell pwd)"/\"\n" >> .clangd; + @for file in $(INC_DIR); do \ + printf " - \"-I"$(shell pwd)"/"$$file"\"\n" >> .clangd; \ + done + @printf "\n" >> ./.clangd + @printf '$(GREY) Now parsing settings is set in $(END)$(GREEN)./.clangd$(END)\n' + +# Phony +.PHONY: all bonus clean fclean re footer header clangd + +-include ${OBJ:.o=.d} From 0f0e1707c1eb731acfdaec6e6750388b6ebad4bd Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:08:07 +0200 Subject: [PATCH 06/19] build(make): adding files to compile --- Makefile | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 40b8a6a..e1b5995 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ # ::: :::::::: # # Makefile :+: :+: :+: # # +:+ +:+ +:+ # -# By: rparodi +#+ +:+ +#+ # +# By: rparodi +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # -# Created: 2023/11/12 11:05:05 by rparodi #+# #+# # -# Updated: 2025/09/17 17:39:49 by rparodi ### ########.fr # +# Created: 2025/09/18 17:28:18 by rparodi #+# #+# # +# Updated: 2025/09/19 16:07:44 by rparodi ### ########.fr # # # # **************************************************************************** # @@ -21,6 +21,7 @@ RM = rm -rf # Flags CFLAGS = -Werror -Wextra -Wall +# CFLAGS += -g INC_DIR = includes CPPFLAGS = $(addprefix -I, $(INC_DIR)) -MMD -MP @@ -30,7 +31,10 @@ CPPFLAGS = $(addprefix -I, $(INC_DIR)) -MMD -MP OBJDIRNAME = ./build OBJ = $(addprefix $(OBJDIRNAME)/,$(SRC:.c=.o)) -SRC = +SRC = sources/print_char.c \ + sources/utils.c \ + sources/print_number.c \ + sources/ft_printf.c # Colors GREEN = \033[32m @@ -44,8 +48,6 @@ END = \033[0m # All (make all) all: header $(NAME) footer -lib: $(NAME) - # Bonus (make bonus) bonus: header $(OBJ) $(LIB_OBJ) footer @mkdir -p $(OBJDIRNAME) From 6de09d44e7cceaafa158206459f6c7ca2b1554aa Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:09:00 +0200 Subject: [PATCH 07/19] feat: adding the start of the header --- includes/ft_printf.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 includes/ft_printf.h diff --git a/includes/ft_printf.h b/includes/ft_printf.h new file mode 100644 index 0000000..b3f5c45 --- /dev/null +++ b/includes/ft_printf.h @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/17 17:42:12 by rparodi #+# #+# */ +/* Updated: 2025/09/19 15:53:37 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRINTF_H +# define FT_PRINTF_H + +# include +# include +# include + + + +size_t ft_strlen(const char *str); +void ft_putnbr_base(int fd, u_int64_t nbr, char *base, int *to_ret); +char *itoa_base(u_int64_t nbr, char *base); +int flag_c(va_list args, int fd); +int ft_dprintf(int fd, const char *s, ...); +int ft_printf(const char *s, ...); +int flag_i(va_list args, int fd); +int flag_p(va_list args, int fd); +int flag_percent(va_list args, int fd); +int flag_s(va_list args, int fd); +int flag_u(va_list args, int fd); +int flag_x(va_list args, int fd); +int flag_x_maj(va_list args, int fd); + +#endif From 0d58f8cf64a0a7ea0bff97bf1ea4844e832abcf3 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:09:44 +0200 Subject: [PATCH 08/19] feat: adding the t_func type - t_func type is for pointer function propose --- includes/ft_printf.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/includes/ft_printf.h b/includes/ft_printf.h index b3f5c45..81874d6 100644 --- a/includes/ft_printf.h +++ b/includes/ft_printf.h @@ -17,7 +17,13 @@ # include # include +typedef int (*t_func)(va_list, int fd); +typedef struct s_format +{ + char character; + t_func function; +} t_format; size_t ft_strlen(const char *str); void ft_putnbr_base(int fd, u_int64_t nbr, char *base, int *to_ret); From 6b031c344a7ba9c299435f0272eb3565bda5819e Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:10:29 +0200 Subject: [PATCH 09/19] build(nix/pkgs): adding lldb pkgs for debug --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index b34baa6..3b49413 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,7 @@ c_formatter_42.packages.${system}.default pkgs.clang pkgs.clang-tools + pkgs.lldb pkgs.fastmod pkgs.norminette pkgs.tree From d81193d6981dd717dd1eb0fd3d0b9e8234e4bd08 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:11:38 +0200 Subject: [PATCH 10/19] feat: adding functions around printf adding printf / dprint / vdprintf function --- sources/ft_printf.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 sources/ft_printf.c diff --git a/sources/ft_printf.c b/sources/ft_printf.c new file mode 100644 index 0000000..172e133 --- /dev/null +++ b/sources/ft_printf.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/17 17:44:34 by rparodi #+# #+# */ +/* Updated: 2025/09/19 15:35:38 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" +#include +#include +#include +#include + +static int print_buff(int fd, const char *s, size_t start, size_t end) +{ + return (write(fd, s + start, (end - start))); +} + +int ft_vdprintf(int fd, const char *s, va_list args) +{ + size_t i; + size_t temp; + int to_ret; + + if (!s) + return (-1); + i = 0; + to_ret = 0; + temp = 0; + while (s[i]) + { + if (s[i] == '%') + { + to_ret += print_buff(fd, s, temp, i); + if (s[++i]) + to_ret += flag_managenent(fd, s[i], args); + else + return (write(1, &s[i - 1], 1) + to_ret); + temp = i + 1; + } + i++; + } + to_ret += print_buff(fd, s, temp, i); + return (to_ret); +} + +int ft_dprintf(int fd, const char *s, ...) +{ + int to_ret; + va_list args; + + va_start(args, s); + to_ret = ft_vdprintf(fd, s, args); + va_end(args); + return (to_ret); +} + +int ft_printf(const char *s, ...) +{ + int to_ret; + va_list args; + + va_start(args, s); + to_ret = ft_vdprintf(1, s, args); + va_end(args); + return (to_ret); +} From 1b070bfda1ebf429731c4937d6f5f4460280d9a1 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:12:08 +0200 Subject: [PATCH 11/19] feat: pointer function now working --- sources/ft_printf.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/sources/ft_printf.c b/sources/ft_printf.c index 172e133..3ffd37c 100644 --- a/sources/ft_printf.c +++ b/sources/ft_printf.c @@ -21,6 +21,31 @@ static int print_buff(int fd, const char *s, size_t start, size_t end) return (write(fd, s + start, (end - start))); } +static int flag_managenent(int fd, char flag, va_list args) +{ + size_t i; + const t_format flags[] = { + {'c', flag_c}, + {'d', flag_i}, + {'p', flag_p}, + {'u', flag_u}, + {'%', flag_percent}, + {'i', flag_i}, + {'s', flag_s}, + {'x', flag_x}, + {'X', flag_x_maj}, + }; + + i = 0; + while (flags[i].character) + { + if (flags[i].character == flag) + return (flags[i].function(args, fd)); + i++; + } + return (-1); +} + int ft_vdprintf(int fd, const char *s, va_list args) { size_t i; From aa04d9a16cacd7cf36855b2c58fc95915d9cd1a9 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:12:52 +0200 Subject: [PATCH 12/19] feat(char): adding function for c / s flags --- sources/print_char.c | 39 +++++++++++++++++++++++++++++++++++++++ sources/utils.c | 25 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 sources/print_char.c create mode 100644 sources/utils.c diff --git a/sources/print_char.c b/sources/print_char.c new file mode 100644 index 0000000..b559e77 --- /dev/null +++ b/sources/print_char.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/18 14:49:02 by rparodi #+# #+# */ +/* Updated: 2025/09/19 15:39:41 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" +#include +#include +#include +#include + +int flag_c(va_list args, int fd) +{ + const char character = va_arg(args, int); + + return (write(fd, &character, 1)); +} + +int flag_s(va_list args, int fd) +{ + const char *string = va_arg(args, char *); + + if (string == NULL) + return (write(fd, "(null)", 6)); + return (write(fd, string, ft_strlen(string))); +} + +int flag_percent(va_list args, int fd) +{ + (void)args; + return (write(fd, "%", 1)); +} diff --git a/sources/utils.c b/sources/utils.c new file mode 100644 index 0000000..0dc8f27 --- /dev/null +++ b/sources/utils.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/18 15:34:52 by rparodi #+# #+# */ +/* Updated: 2025/09/19 15:53:15 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +size_t ft_strlen(const char *str) +{ + size_t i; + + if (!str) + return (0); + i = 0; + while (str[i]) + i++; + return (i); +} From 9c42c97214a3b6d4fe0dc5723d1b97ea82e4fe09 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:13:10 +0200 Subject: [PATCH 13/19] feat(char): adding function for x / X / p / u / (i / d) --- sources/print_number.c | 96 ++++++++++++++++++++++++++++++++++++++++++ sources/utils.c | 79 ++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 sources/print_number.c diff --git a/sources/print_number.c b/sources/print_number.c new file mode 100644 index 0000000..539f346 --- /dev/null +++ b/sources/print_number.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_number.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/09/18 15:00:27 by rparodi #+# #+# */ +/* Updated: 2025/09/19 16:06:27 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" +#include +#include +#include +#include + +int flag_p(va_list args, int fd) +{ + char *to_print; + int to_ret; + u_int64_t number; + + number = va_arg(args, unsigned long long); + to_ret = 0; + if (number != 0) + to_ret += write(fd, "0x", 2); + else if (number == 0) + return (write(fd, "(nil)", 5)); + to_print = itoa_base(number, "0123456789abcdef"); + to_ret += write(fd, to_print, ft_strlen(to_print)); + free(to_print); + return (to_ret); +} + +int flag_x_maj(va_list args, int fd) +{ + char *to_print; + int to_ret; + unsigned int number; + + number = va_arg(args, unsigned int); + to_print = itoa_base(number, "0123456789ABCDEF"); + to_ret = write(fd, to_print, ft_strlen(to_print)); + free(to_print); + return (to_ret); +} + +int flag_x(va_list args, int fd) +{ + char *to_print; + int to_ret; + unsigned int number; + + number = va_arg(args, unsigned int); + to_print = itoa_base(number, "0123456789abcdef"); + to_ret = write(fd, to_print, ft_strlen(to_print)); + free(to_print); + return (to_ret); +} + +int flag_u(va_list args, int fd) +{ + char *to_print; + int to_ret; + unsigned int number; + + to_ret = 0; + number = va_arg(args, unsigned int); + to_print = itoa_base(number, "0123456789"); + to_ret = write(fd, to_print, ft_strlen(to_print)); + free(to_print); + return (to_ret); +} + +int flag_i(va_list args, int fd) +{ + char *to_print; + int number; + int to_ret; + + to_ret = 0; + number = va_arg(args, int); + if (number < 0) + { + if (number == INT_MIN) + return (write(1, "-2147483648", 11)); + number = -number; + to_ret += write(1, "-", 1); + } + to_print = itoa_base(number, "0123456789"); + to_ret += write(fd, to_print, ft_strlen(to_print)); + free(to_print); + return (to_ret); +} diff --git a/sources/utils.c b/sources/utils.c index 0dc8f27..a23288b 100644 --- a/sources/utils.c +++ b/sources/utils.c @@ -11,6 +11,9 @@ /* ************************************************************************** */ #include +#include +#include +#include size_t ft_strlen(const char *str) { @@ -23,3 +26,79 @@ size_t ft_strlen(const char *str) i++; return (i); } + +void *ft_memset(void *s, int c, size_t n) +{ + char *str; + size_t i; + + i = 0; + str = (char *)s; + while (i < n) + { + str[i] = c; + i++; + } + return (str); +} + +void *ft_calloc(size_t nmemb, size_t size) +{ + size_t total; + char *to_return; + + if (nmemb == 0 || size == 0) + return ((void *)malloc(1)); + total = nmemb * size; + if (total / nmemb != size && total / size != nmemb) + return (NULL); + to_return = (char *)malloc(total); + if (to_return == NULL) + to_return = NULL; + else + ft_memset(to_return, 0, nmemb * size); + return (to_return); +} + +static size_t ft_nbrlen(u_int64_t nbr, size_t base_len) +{ + size_t len; + + if (nbr == 0) + return (1); + len = 0; + while (nbr > 0) + { + nbr /= base_len; + len++; + } + return (len); +} + +char *itoa_base(u_int64_t nbr, char *base) +{ + size_t base_len; + size_t nbr_len; + char *result; + int i; + + if (!base) + return (NULL); + base_len = ft_strlen(base); + if (base_len < 2) + return (NULL); + nbr_len = ft_nbrlen(nbr, base_len); + result = malloc(sizeof(char) * (nbr_len + 1)); + if (!result) + return (NULL); + i = nbr_len - 1; + if (nbr == 0) + result[0] = base[0]; + while (nbr > 0) + { + result[i] = base[nbr % base_len]; + nbr /= base_len; + i--; + } + return (result); +} From 75a218c47f32956767d52b358f3e3bd29b578293 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:21:43 +0200 Subject: [PATCH 14/19] build(nix/shell): Adding a shell hook to flake - Adding the CC environnment variable - Printing the message to announce the end of init --- flake.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flake.nix b/flake.nix index 3b49413..b6805de 100644 --- a/flake.nix +++ b/flake.nix @@ -20,5 +20,9 @@ pkgs.tree ] ++ (if pkgs.stdenv.isLinux then [ pkgs.valgrind ] else [ ]); }; + shellHook = '' + export CC=${pkgs.clang} + printf "\n\033[0;90mC env loaded for: \033[38;5;220m${system}\033[0m\n" + ''; }); } From 6cc7e2d8b4296581518de47bf5805afab70c817f Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:48:17 +0200 Subject: [PATCH 15/19] ci(norminette): adding the norminette action to my repository - Thanks to @Reach for this action --- .github/workflows/norminette.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/workflows/norminette.yml diff --git a/.github/workflows/norminette.yml b/.github/workflows/norminette.yml new file mode 100644 index 0000000..9dd4ac3 --- /dev/null +++ b/.github/workflows/norminette.yml @@ -0,0 +1,10 @@ +on: [push, pull_request] + +jobs: + norminette_job: + runs-on: ubuntu-latest + name: norminette + steps: + - uses: alexandregv/norminette-action@v3 + with: + flags: '.' From d0ebc74b4746451125dcf002a8a025431ab689e2 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:48:36 +0200 Subject: [PATCH 16/19] ci(make): adding the build action to my repository --- .github/workflows/c-cpp.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/c-cpp.yml diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml new file mode 100644 index 0000000..723bcb3 --- /dev/null +++ b/.github/workflows/c-cpp.yml @@ -0,0 +1,13 @@ +name: C/C++ CI + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: make + run: TERM=xterm make From a42240bc66697e1870d1ae13a085267c6935b96a Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:49:11 +0200 Subject: [PATCH 17/19] feat(utils): passing internal function in static - BREAKING CHANGES: - ft_memset / nbrlen_base cannont be used anymore in other files --- sources/utils.c | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/sources/utils.c b/sources/utils.c index a23288b..639128f 100644 --- a/sources/utils.c +++ b/sources/utils.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/09/18 15:34:52 by rparodi #+# #+# */ -/* Updated: 2025/09/19 15:53:15 by rparodi ### ########.fr */ +/* Updated: 2025/09/19 16:45:11 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,19 +15,22 @@ #include #include -size_t ft_strlen(const char *str) +static size_t ft_nbrlen(u_int64_t nbr, size_t base_len) { - size_t i; + size_t len; - if (!str) - return (0); - i = 0; - while (str[i]) - i++; - return (i); + if (nbr == 0) + return (1); + len = 0; + while (nbr > 0) + { + nbr /= base_len; + len++; + } + return (len); } -void *ft_memset(void *s, int c, size_t n) +static void *ft_memset(void *s, int c, size_t n) { char *str; size_t i; @@ -42,6 +45,18 @@ void *ft_memset(void *s, int c, size_t n) return (str); } +size_t ft_strlen(const char *str) +{ + size_t i; + + if (!str) + return (0); + i = 0; + while (str[i]) + i++; + return (i); +} + void *ft_calloc(size_t nmemb, size_t size) { size_t total; @@ -60,21 +75,6 @@ void *ft_calloc(size_t nmemb, size_t size) return (to_return); } -static size_t ft_nbrlen(u_int64_t nbr, size_t base_len) -{ - size_t len; - - if (nbr == 0) - return (1); - len = 0; - while (nbr > 0) - { - nbr /= base_len; - len++; - } - return (len); -} - char *itoa_base(u_int64_t nbr, char *base) { size_t base_len; From facbd7254083ca13c6961d4260188b62755d2487 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:53:08 +0200 Subject: [PATCH 18/19] fix(utils): editing the type of stdint - u_int64_t is now only uint64_t --- sources/utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/utils.c b/sources/utils.c index 639128f..5587063 100644 --- a/sources/utils.c +++ b/sources/utils.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/09/18 15:34:52 by rparodi #+# #+# */ -/* Updated: 2025/09/19 16:45:11 by rparodi ### ########.fr */ +/* Updated: 2025/09/19 16:52:30 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ #include #include -static size_t ft_nbrlen(u_int64_t nbr, size_t base_len) +static size_t ft_nbrlen(uint64_t nbr, size_t base_len) { size_t len; @@ -75,7 +75,7 @@ void *ft_calloc(size_t nmemb, size_t size) return (to_return); } -char *itoa_base(u_int64_t nbr, char *base) +char *itoa_base(uint64_t nbr, char *base) { size_t base_len; size_t nbr_len; From 329595802593a33ba1e82493492e92a6e0f5bb73 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 19 Sep 2025 16:54:40 +0200 Subject: [PATCH 19/19] fix: editing the type of stdint - u_int64_t is now only uint64_t --- includes/ft_printf.h | 4 ++-- sources/print_number.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/ft_printf.h b/includes/ft_printf.h index 81874d6..6fbcacc 100644 --- a/includes/ft_printf.h +++ b/includes/ft_printf.h @@ -26,8 +26,8 @@ typedef struct s_format } t_format; size_t ft_strlen(const char *str); -void ft_putnbr_base(int fd, u_int64_t nbr, char *base, int *to_ret); -char *itoa_base(u_int64_t nbr, char *base); +void ft_putnbr_base(int fd, uint64_t nbr, char *base, int *to_ret); +char *itoa_base(uint64_t nbr, char *base); int flag_c(va_list args, int fd); int ft_dprintf(int fd, const char *s, ...); int ft_printf(const char *s, ...); diff --git a/sources/print_number.c b/sources/print_number.c index 539f346..a1a19a5 100644 --- a/sources/print_number.c +++ b/sources/print_number.c @@ -20,7 +20,7 @@ int flag_p(va_list args, int fd) { char *to_print; int to_ret; - u_int64_t number; + uint64_t number; number = va_arg(args, unsigned long long); to_ret = 0;