From 42653de246947fe3d5426194d24e7b3257ede6d0 Mon Sep 17 00:00:00 2001 From: Thomas Rieg Date: Fri, 28 Nov 2025 19:50:58 +0100 Subject: [PATCH] copy on git --- Makefile | 70 +++ a.out | Bin 0 -> 20864 bytes includes/ft_malloc.h | 69 +++ includes/ft_malloc_public.h | 25 + libft/Makefile | 79 +++ libft/ft_addr_to_str.c | 55 ++ libft/ft_addr_to_str.o | Bin 0 -> 5512 bytes libft/ft_atoi.c | 71 +++ libft/ft_atoi.o | Bin 0 -> 5000 bytes libft/ft_bzero.c | 18 + libft/ft_bzero.o | Bin 0 -> 2768 bytes libft/ft_calloc.c | 30 + libft/ft_calloc.o | Bin 0 -> 3240 bytes libft/ft_hashmap.h | 93 +++ libft/ft_hashmap/ft_hashmap.c | 156 +++++ libft/ft_hashmap/ft_hashmap.o | Bin 0 -> 11648 bytes .../ft_hashmap_advanced_type_hash.c | 57 ++ .../ft_hashmap_advanced_type_hash.o | Bin 0 -> 5992 bytes libft/ft_hashmap/ft_hashmap_basic_cmp.c | 79 +++ libft/ft_hashmap/ft_hashmap_basic_cmp.o | Bin 0 -> 4640 bytes libft/ft_hashmap/ft_hashmap_basic_type_hash.c | 57 ++ libft/ft_hashmap/ft_hashmap_basic_type_hash.o | Bin 0 -> 4240 bytes libft/ft_hashmap/ft_hashmap_private.h | 46 ++ libft/ft_hashmap/ft_hashmap_utils.c | 70 +++ libft/ft_hashmap/ft_hashmap_utils.o | Bin 0 -> 6952 bytes libft/ft_hashmap/ft_hashmap_utils_two.c | 85 +++ libft/ft_hashmap/ft_hashmap_utils_two.o | Bin 0 -> 7512 bytes libft/ft_int_utils.c | 80 +++ libft/ft_int_utils.o | Bin 0 -> 6264 bytes libft/ft_isalnum.c | 20 + libft/ft_isalnum.o | Bin 0 -> 2776 bytes libft/ft_isalpha.c | 39 ++ libft/ft_isalpha.o | Bin 0 -> 3072 bytes libft/ft_isascii.c | 18 + libft/ft_isascii.o | Bin 0 -> 2080 bytes libft/ft_isdigit.c | 18 + libft/ft_isdigit.o | Bin 0 -> 2264 bytes libft/ft_isprint.c | 18 + libft/ft_isprint.o | Bin 0 -> 2264 bytes libft/ft_itoa.c | 83 +++ libft/ft_itoa.o | Bin 0 -> 6496 bytes libft/ft_itoa_base.c | 120 ++++ libft/ft_itoa_base.o | Bin 0 -> 7296 bytes libft/ft_long_utils.c | 46 ++ libft/ft_long_utils.o | Bin 0 -> 4216 bytes libft/ft_lstadd_back_bonus.c | 26 + libft/ft_lstadd_back_bonus.o | Bin 0 -> 2960 bytes libft/ft_lstadd_front_bonus.c | 24 + libft/ft_lstadd_front_bonus.o | Bin 0 -> 2392 bytes libft/ft_lstclear_bonus.c | 31 + libft/ft_lstclear_bonus.o | Bin 0 -> 3040 bytes libft/ft_lstdelone_bonus.c | 24 + libft/ft_lstdelone_bonus.o | Bin 0 -> 2904 bytes libft/ft_lstiter_bonus.c | 28 + libft/ft_lstiter_bonus.o | Bin 0 -> 2880 bytes libft/ft_lstlast_bonus.c | 44 ++ libft/ft_lstlast_bonus.o | Bin 0 -> 3392 bytes libft/ft_lstmap_bonus.c | 63 ++ libft/ft_lstmap_bonus.o | Bin 0 -> 5816 bytes libft/ft_lstnew_bonus.c | 26 + libft/ft_lstnew_bonus.o | Bin 0 -> 2832 bytes libft/ft_lstsize_bonus.c | 29 + libft/ft_lstsize_bonus.o | Bin 0 -> 2640 bytes libft/ft_memchr.c | 27 + libft/ft_memchr.o | Bin 0 -> 2944 bytes libft/ft_memcmp.c | 31 + libft/ft_memcmp.o | Bin 0 -> 2864 bytes libft/ft_memcpy.c | 37 ++ libft/ft_memcpy.o | Bin 0 -> 4456 bytes libft/ft_memmove.c | 61 ++ libft/ft_memmove.o | Bin 0 -> 6480 bytes libft/ft_memset.c | 42 ++ libft/ft_memset.o | Bin 0 -> 4024 bytes libft/ft_power.c | 38 ++ libft/ft_power.o | Bin 0 -> 3232 bytes libft/ft_printf/ft_arglist_bonus.c | 104 ++++ libft/ft_printf/ft_arglist_bonus.o | Bin 0 -> 8064 bytes libft/ft_printf/ft_case_d_bonus.c | 75 +++ libft/ft_printf/ft_case_d_bonus.o | Bin 0 -> 6272 bytes libft/ft_printf/ft_case_d_utils_bonus.c | 115 ++++ libft/ft_printf/ft_case_d_utils_bonus.o | Bin 0 -> 9552 bytes libft/ft_printf/ft_case_lowx_bonus.c | 115 ++++ libft/ft_printf/ft_case_lowx_bonus.o | Bin 0 -> 8528 bytes libft/ft_printf/ft_case_p_bonus.c | 70 +++ libft/ft_printf/ft_case_p_bonus.o | Bin 0 -> 7768 bytes libft/ft_printf/ft_case_s_bonus.c | 64 ++ libft/ft_printf/ft_case_s_bonus.o | Bin 0 -> 6768 bytes libft/ft_printf/ft_case_u_bonus.c | 72 +++ libft/ft_printf/ft_case_u_bonus.o | Bin 0 -> 7424 bytes libft/ft_printf/ft_case_uppx_bonus.c | 115 ++++ libft/ft_printf/ft_case_uppx_bonus.o | Bin 0 -> 8536 bytes libft/ft_printf/ft_cases_easy_bonus.c | 52 ++ libft/ft_printf/ft_cases_easy_bonus.o | Bin 0 -> 6064 bytes libft/ft_printf/ft_cases_mandatory_one.c | 85 +++ libft/ft_printf/ft_cases_mandatory_one.o | Bin 0 -> 8808 bytes libft/ft_printf/ft_cases_mandatory_two.c | 58 ++ libft/ft_printf/ft_cases_mandatory_two.o | Bin 0 -> 7432 bytes libft/ft_printf/ft_padding_bonus.c | 66 ++ libft/ft_printf/ft_padding_bonus.o | Bin 0 -> 5888 bytes libft/ft_printf/ft_printf.c | 126 ++++ libft/ft_printf/ft_printf.h | 22 + libft/ft_printf/ft_printf.o | Bin 0 -> 13704 bytes libft/ft_printf/ft_printf_bonus.c | 139 +++++ libft/ft_printf/ft_printf_bonus.h | 30 + libft/ft_printf/ft_printf_bonus.o | Bin 0 -> 10624 bytes libft/ft_printf/libft.h | 49 ++ libft/ft_priority_queue.h | 47 ++ libft/ft_priority_queue/ft_priority_queue.c | 71 +++ libft/ft_priority_queue/ft_priority_queue.o | Bin 0 -> 6448 bytes .../ft_priority_queue_private.h | 26 + .../ft_priority_queue_utils.c | 118 ++++ .../ft_priority_queue_utils.o | Bin 0 -> 7944 bytes libft/ft_putchar_fd.c | 18 + libft/ft_putchar_fd.o | Bin 0 -> 2888 bytes libft/ft_putendl_fd.c | 19 + libft/ft_putendl_fd.o | Bin 0 -> 2960 bytes libft/ft_putnbr_fd.c | 33 + libft/ft_putnbr_fd.o | Bin 0 -> 3320 bytes libft/ft_putstr_fd.c | 26 + libft/ft_putstr_fd.o | Bin 0 -> 3424 bytes libft/ft_safe_int_math.c | 80 +++ libft/ft_safe_int_math.o | Bin 0 -> 4272 bytes libft/ft_safe_long_math.c | 80 +++ libft/ft_safe_long_math.o | Bin 0 -> 4632 bytes libft/ft_split.c | 110 ++++ libft/ft_split.o | Bin 0 -> 6432 bytes libft/ft_split2.c | 42 ++ libft/ft_split2.o | Bin 0 -> 3216 bytes libft/ft_strchr.c | 29 + libft/ft_strchr.o | Bin 0 -> 2920 bytes libft/ft_strcmp.c | 23 + libft/ft_strcmp.o | Bin 0 -> 2528 bytes libft/ft_strdup.c | 27 + libft/ft_strdup.o | Bin 0 -> 3352 bytes libft/ft_striteri.c | 30 + libft/ft_striteri.o | Bin 0 -> 2784 bytes libft/ft_strjoin.c | 42 ++ libft/ft_strjoin.o | Bin 0 -> 3688 bytes libft/ft_strlcat.c | 26 + libft/ft_strlcat.o | Bin 0 -> 3592 bytes libft/ft_strlcpy.c | 36 ++ libft/ft_strlcpy.o | Bin 0 -> 3368 bytes libft/ft_strlen.c | 23 + libft/ft_strlen.o | Bin 0 -> 2336 bytes libft/ft_strmapi.c | 35 ++ libft/ft_strmapi.o | Bin 0 -> 3416 bytes libft/ft_strncmp.c | 26 + libft/ft_strncmp.o | Bin 0 -> 2800 bytes libft/ft_strnonchr.c | 28 + libft/ft_strnonchr.o | Bin 0 -> 2624 bytes libft/ft_strnstr.c | 91 +++ libft/ft_strnstr.o | Bin 0 -> 5288 bytes libft/ft_strrchr.c | 29 + libft/ft_strrchr.o | Bin 0 -> 3176 bytes libft/ft_strtrim.c | 65 ++ libft/ft_strtrim.o | Bin 0 -> 5168 bytes libft/ft_substr.c | 46 ++ libft/ft_substr.o | Bin 0 -> 4720 bytes libft/ft_tolower.c | 18 + libft/ft_tolower.o | Bin 0 -> 2080 bytes libft/ft_toupper.c | 18 + libft/ft_toupper.o | Bin 0 -> 2080 bytes libft/ft_utoa.c | 51 ++ libft/ft_utoa.o | Bin 0 -> 4760 bytes libft/ft_utoa_base.c | 93 +++ libft/ft_utoa_base.o | Bin 0 -> 6704 bytes libft/ft_vecint.c | 93 +++ libft/ft_vecint.h | 31 + libft/ft_vecint.o | Bin 0 -> 6128 bytes libft/ft_vector.c | 111 ++++ libft/ft_vector.h | 32 + libft/ft_vector.o | Bin 0 -> 6744 bytes libft/get_next_line/get_next_line.c | 186 ++++++ libft/get_next_line/get_next_line.h | 43 ++ libft/get_next_line/get_next_line.o | Bin 0 -> 13736 bytes libft/get_next_line/get_next_line_utils.c | 97 +++ libft/get_next_line/get_next_line_utils.o | Bin 0 -> 6848 bytes libft/get_next_line/get_next_line_utils_two.c | 26 + libft/get_next_line/get_next_line_utils_two.o | Bin 0 -> 3232 bytes libft/libft.a | Bin 0 -> 435802 bytes libft/libft.h | 108 ++++ libft/sorting/ft_radixsort.c | 77 +++ libft/sorting/ft_radixsort.o | Bin 0 -> 6952 bytes libft/sorting/ft_sorting.c | 93 +++ libft/sorting/ft_sorting.h | 35 ++ libft/sorting/ft_sorting.o | Bin 0 -> 7864 bytes libft_malloc.so | 1 + libft_malloc_x86_64_Linux.so | Bin 0 -> 98320 bytes main.c | 419 +++++++++++++ main_bonus.c | 68 ++ result.txt | 582 ++++++++++++++++++ srcs/bonus_utils.c | 85 +++ srcs/bonus_utils.o | Bin 0 -> 3696 bytes srcs/ft_calloc.c | 29 + srcs/ft_calloc.o | Bin 0 -> 1272 bytes srcs/ft_free.c | 99 +++ srcs/ft_free.o | Bin 0 -> 2696 bytes srcs/ft_malloc.c | 35 ++ srcs/ft_malloc.o | Bin 0 -> 1600 bytes srcs/ft_realloc.c | 146 +++++ srcs/ft_realloc.o | Bin 0 -> 3680 bytes srcs/init_state.c | 267 ++++++++ srcs/init_state.o | Bin 0 -> 4192 bytes test_malloc | Bin 0 -> 25624 bytes test_show | Bin 0 -> 17256 bytes 205 files changed, 7459 insertions(+) create mode 100644 Makefile create mode 100755 a.out create mode 100644 includes/ft_malloc.h create mode 100644 includes/ft_malloc_public.h create mode 100755 libft/Makefile create mode 100755 libft/ft_addr_to_str.c create mode 100644 libft/ft_addr_to_str.o create mode 100755 libft/ft_atoi.c create mode 100644 libft/ft_atoi.o create mode 100755 libft/ft_bzero.c create mode 100644 libft/ft_bzero.o create mode 100755 libft/ft_calloc.c create mode 100644 libft/ft_calloc.o create mode 100755 libft/ft_hashmap.h create mode 100755 libft/ft_hashmap/ft_hashmap.c create mode 100644 libft/ft_hashmap/ft_hashmap.o create mode 100755 libft/ft_hashmap/ft_hashmap_advanced_type_hash.c create mode 100644 libft/ft_hashmap/ft_hashmap_advanced_type_hash.o create mode 100755 libft/ft_hashmap/ft_hashmap_basic_cmp.c create mode 100644 libft/ft_hashmap/ft_hashmap_basic_cmp.o create mode 100755 libft/ft_hashmap/ft_hashmap_basic_type_hash.c create mode 100644 libft/ft_hashmap/ft_hashmap_basic_type_hash.o create mode 100755 libft/ft_hashmap/ft_hashmap_private.h create mode 100755 libft/ft_hashmap/ft_hashmap_utils.c create mode 100644 libft/ft_hashmap/ft_hashmap_utils.o create mode 100755 libft/ft_hashmap/ft_hashmap_utils_two.c create mode 100644 libft/ft_hashmap/ft_hashmap_utils_two.o create mode 100644 libft/ft_int_utils.c create mode 100644 libft/ft_int_utils.o create mode 100755 libft/ft_isalnum.c create mode 100644 libft/ft_isalnum.o create mode 100755 libft/ft_isalpha.c create mode 100644 libft/ft_isalpha.o create mode 100755 libft/ft_isascii.c create mode 100644 libft/ft_isascii.o create mode 100755 libft/ft_isdigit.c create mode 100644 libft/ft_isdigit.o create mode 100755 libft/ft_isprint.c create mode 100644 libft/ft_isprint.o create mode 100755 libft/ft_itoa.c create mode 100644 libft/ft_itoa.o create mode 100755 libft/ft_itoa_base.c create mode 100644 libft/ft_itoa_base.o create mode 100644 libft/ft_long_utils.c create mode 100644 libft/ft_long_utils.o create mode 100755 libft/ft_lstadd_back_bonus.c create mode 100644 libft/ft_lstadd_back_bonus.o create mode 100755 libft/ft_lstadd_front_bonus.c create mode 100644 libft/ft_lstadd_front_bonus.o create mode 100755 libft/ft_lstclear_bonus.c create mode 100644 libft/ft_lstclear_bonus.o create mode 100755 libft/ft_lstdelone_bonus.c create mode 100644 libft/ft_lstdelone_bonus.o create mode 100755 libft/ft_lstiter_bonus.c create mode 100644 libft/ft_lstiter_bonus.o create mode 100755 libft/ft_lstlast_bonus.c create mode 100644 libft/ft_lstlast_bonus.o create mode 100755 libft/ft_lstmap_bonus.c create mode 100644 libft/ft_lstmap_bonus.o create mode 100755 libft/ft_lstnew_bonus.c create mode 100644 libft/ft_lstnew_bonus.o create mode 100755 libft/ft_lstsize_bonus.c create mode 100644 libft/ft_lstsize_bonus.o create mode 100755 libft/ft_memchr.c create mode 100644 libft/ft_memchr.o create mode 100755 libft/ft_memcmp.c create mode 100644 libft/ft_memcmp.o create mode 100755 libft/ft_memcpy.c create mode 100644 libft/ft_memcpy.o create mode 100755 libft/ft_memmove.c create mode 100644 libft/ft_memmove.o create mode 100755 libft/ft_memset.c create mode 100644 libft/ft_memset.o create mode 100644 libft/ft_power.c create mode 100644 libft/ft_power.o create mode 100755 libft/ft_printf/ft_arglist_bonus.c create mode 100644 libft/ft_printf/ft_arglist_bonus.o create mode 100755 libft/ft_printf/ft_case_d_bonus.c create mode 100644 libft/ft_printf/ft_case_d_bonus.o create mode 100755 libft/ft_printf/ft_case_d_utils_bonus.c create mode 100644 libft/ft_printf/ft_case_d_utils_bonus.o create mode 100644 libft/ft_printf/ft_case_lowx_bonus.c create mode 100644 libft/ft_printf/ft_case_lowx_bonus.o create mode 100755 libft/ft_printf/ft_case_p_bonus.c create mode 100644 libft/ft_printf/ft_case_p_bonus.o create mode 100755 libft/ft_printf/ft_case_s_bonus.c create mode 100644 libft/ft_printf/ft_case_s_bonus.o create mode 100755 libft/ft_printf/ft_case_u_bonus.c create mode 100644 libft/ft_printf/ft_case_u_bonus.o create mode 100644 libft/ft_printf/ft_case_uppx_bonus.c create mode 100644 libft/ft_printf/ft_case_uppx_bonus.o create mode 100755 libft/ft_printf/ft_cases_easy_bonus.c create mode 100644 libft/ft_printf/ft_cases_easy_bonus.o create mode 100755 libft/ft_printf/ft_cases_mandatory_one.c create mode 100644 libft/ft_printf/ft_cases_mandatory_one.o create mode 100755 libft/ft_printf/ft_cases_mandatory_two.c create mode 100644 libft/ft_printf/ft_cases_mandatory_two.o create mode 100755 libft/ft_printf/ft_padding_bonus.c create mode 100644 libft/ft_printf/ft_padding_bonus.o create mode 100755 libft/ft_printf/ft_printf.c create mode 100755 libft/ft_printf/ft_printf.h create mode 100644 libft/ft_printf/ft_printf.o create mode 100755 libft/ft_printf/ft_printf_bonus.c create mode 100755 libft/ft_printf/ft_printf_bonus.h create mode 100644 libft/ft_printf/ft_printf_bonus.o create mode 100755 libft/ft_printf/libft.h create mode 100755 libft/ft_priority_queue.h create mode 100755 libft/ft_priority_queue/ft_priority_queue.c create mode 100644 libft/ft_priority_queue/ft_priority_queue.o create mode 100755 libft/ft_priority_queue/ft_priority_queue_private.h create mode 100755 libft/ft_priority_queue/ft_priority_queue_utils.c create mode 100644 libft/ft_priority_queue/ft_priority_queue_utils.o create mode 100755 libft/ft_putchar_fd.c create mode 100644 libft/ft_putchar_fd.o create mode 100755 libft/ft_putendl_fd.c create mode 100644 libft/ft_putendl_fd.o create mode 100755 libft/ft_putnbr_fd.c create mode 100644 libft/ft_putnbr_fd.o create mode 100755 libft/ft_putstr_fd.c create mode 100644 libft/ft_putstr_fd.o create mode 100644 libft/ft_safe_int_math.c create mode 100644 libft/ft_safe_int_math.o create mode 100644 libft/ft_safe_long_math.c create mode 100644 libft/ft_safe_long_math.o create mode 100755 libft/ft_split.c create mode 100644 libft/ft_split.o create mode 100644 libft/ft_split2.c create mode 100644 libft/ft_split2.o create mode 100755 libft/ft_strchr.c create mode 100644 libft/ft_strchr.o create mode 100755 libft/ft_strcmp.c create mode 100644 libft/ft_strcmp.o create mode 100755 libft/ft_strdup.c create mode 100644 libft/ft_strdup.o create mode 100755 libft/ft_striteri.c create mode 100644 libft/ft_striteri.o create mode 100755 libft/ft_strjoin.c create mode 100644 libft/ft_strjoin.o create mode 100755 libft/ft_strlcat.c create mode 100644 libft/ft_strlcat.o create mode 100755 libft/ft_strlcpy.c create mode 100644 libft/ft_strlcpy.o create mode 100755 libft/ft_strlen.c create mode 100644 libft/ft_strlen.o create mode 100755 libft/ft_strmapi.c create mode 100644 libft/ft_strmapi.o create mode 100755 libft/ft_strncmp.c create mode 100644 libft/ft_strncmp.o create mode 100755 libft/ft_strnonchr.c create mode 100644 libft/ft_strnonchr.o create mode 100755 libft/ft_strnstr.c create mode 100644 libft/ft_strnstr.o create mode 100755 libft/ft_strrchr.c create mode 100644 libft/ft_strrchr.o create mode 100755 libft/ft_strtrim.c create mode 100644 libft/ft_strtrim.o create mode 100755 libft/ft_substr.c create mode 100644 libft/ft_substr.o create mode 100755 libft/ft_tolower.c create mode 100644 libft/ft_tolower.o create mode 100755 libft/ft_toupper.c create mode 100644 libft/ft_toupper.o create mode 100755 libft/ft_utoa.c create mode 100644 libft/ft_utoa.o create mode 100755 libft/ft_utoa_base.c create mode 100644 libft/ft_utoa_base.o create mode 100755 libft/ft_vecint.c create mode 100755 libft/ft_vecint.h create mode 100644 libft/ft_vecint.o create mode 100755 libft/ft_vector.c create mode 100755 libft/ft_vector.h create mode 100644 libft/ft_vector.o create mode 100755 libft/get_next_line/get_next_line.c create mode 100755 libft/get_next_line/get_next_line.h create mode 100644 libft/get_next_line/get_next_line.o create mode 100755 libft/get_next_line/get_next_line_utils.c create mode 100644 libft/get_next_line/get_next_line_utils.o create mode 100644 libft/get_next_line/get_next_line_utils_two.c create mode 100644 libft/get_next_line/get_next_line_utils_two.o create mode 100644 libft/libft.a create mode 100755 libft/libft.h create mode 100644 libft/sorting/ft_radixsort.c create mode 100644 libft/sorting/ft_radixsort.o create mode 100644 libft/sorting/ft_sorting.c create mode 100644 libft/sorting/ft_sorting.h create mode 100644 libft/sorting/ft_sorting.o create mode 120000 libft_malloc.so create mode 100755 libft_malloc_x86_64_Linux.so create mode 100644 main.c create mode 100644 main_bonus.c create mode 100644 result.txt create mode 100644 srcs/bonus_utils.c create mode 100644 srcs/bonus_utils.o create mode 100644 srcs/ft_calloc.c create mode 100644 srcs/ft_calloc.o create mode 100644 srcs/ft_free.c create mode 100644 srcs/ft_free.o create mode 100644 srcs/ft_malloc.c create mode 100644 srcs/ft_malloc.o create mode 100644 srcs/ft_realloc.c create mode 100644 srcs/ft_realloc.o create mode 100644 srcs/init_state.c create mode 100644 srcs/init_state.o create mode 100755 test_malloc create mode 100755 test_show diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..71e4056 --- /dev/null +++ b/Makefile @@ -0,0 +1,70 @@ +CC := cc +CFLAGS := -Wall -Wextra -Werror -fPIC -Iincludes -Ilibft + +ifeq ($(HOSTTYPE),) +HOSTTYPE := $(shell uname -m)_$(shell uname -s) +endif + +NAME := libft_malloc_$(HOSTTYPE).so +LINK := libft_malloc.so + +# --------------------------------------------------------------------------- # +# Sources / objects +# --------------------------------------------------------------------------- # + +SRCS_DIR := srcs +SRCS := $(SRCS_DIR)/ft_malloc.c \ + $(SRCS_DIR)/ft_free.c \ + $(SRCS_DIR)/ft_calloc.c \ + $(SRCS_DIR)/ft_realloc.c \ + $(SRCS_DIR)/init_state.c \ + $(SRCS_DIR)/bonus_utils.c + +OBJS := $(SRCS:.c=.o) + +LIBFT_DIR := libft +LIBFT_A := $(LIBFT_DIR)/libft.a + +# --------------------------------------------------------------------------- # +# Rules +# --------------------------------------------------------------------------- # + +.PHONY: all clean fclean re test + +all: $(NAME) $(LINK) + +# Build the shared library +$(NAME): $(LIBFT_A) $(OBJS) + $(CC) -shared -o $@ $(OBJS) -L$(LIBFT_DIR) -lft -lpthread + +# Symlink libft_malloc.so -> libft_malloc_$HOSTTYPE.so +$(LINK): $(NAME) + ln -sf $(NAME) $(LINK) + +# Build libft first (using its own Makefile) +$(LIBFT_A): + $(MAKE) -C $(LIBFT_DIR) + +# Object files +$(SRCS_DIR)/%.o: $(SRCS_DIR)/%.c + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -f $(OBJS) + $(MAKE) -C $(LIBFT_DIR) clean + +fclean: clean + rm -f $(NAME) $(LINK) + $(MAKE) -C $(LIBFT_DIR) fclean + +re: fclean all + +# Simple helper target to remind how to test with LD_PRELOAD +test: all + @echo "Library built:" + @echo " $(NAME)" + @echo "Symlink:" + @echo " $(LINK) -> $(NAME)" + @echo "" + @echo "Example usage (run any program with your malloc):" + @echo " LD_PRELOAD=./$(LINK) ls" \ No newline at end of file diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..2ba7b95e0589786b68f9d958fe338e69b1f21377 GIT binary patch literal 20864 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 literal 0 HcmV?d00001 diff --git a/includes/ft_malloc.h b/includes/ft_malloc.h new file mode 100644 index 0000000..4a756ea --- /dev/null +++ b/includes/ft_malloc.h @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_malloc.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/17 15:06:51 by thrieg #+# #+# */ +/* Updated: 2025/11/28 17:24:33 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_MALLOC_H +#define FT_MALLOC_H + +#include +#include +#include +#include +#include +#include +#include +#include "../libft/ft_hashmap.h" +#include "../libft/ft_vector.h" +#include "ft_malloc_public.h" + +#define TINY_SIZE_MAX 64 +#define SMALL_SIZE_MAX 4096 +#define ALLIGN_BYTES _Alignof(max_align_t) + +typedef enum e_type +{ + E_TINY, + E_SMALL, + E_LARGE +} t_type; + +typedef struct s_zone +{ + t_type type; + size_t size; + struct s_zone *next; // lock g_mut + struct s_zone *prev; // lock g_mut +} t_zone; + +typedef struct s_header +{ + size_t size; // lock zone_mut + bool occupied; // lock zone_mut + t_zone *zone; + char padding[8]; +} t_header; + +typedef struct s_state +{ + t_zone *tiny_zone; // lock g_mut + t_zone *small_zone; // lock g_mut + t_zone *large_zone; // lock g_mut, 1 zone per alloc for large +} t_state; + +extern t_state g_state; +extern pthread_mutex_t g_mut; // never lock this inside a zone mut, only the opposite + +void *add_large(size_t size); +void *add_small(size_t size); +void *add_tiny(size_t size); +void *add_page(t_type type); + +#endif \ No newline at end of file diff --git a/includes/ft_malloc_public.h b/includes/ft_malloc_public.h new file mode 100644 index 0000000..b82a6eb --- /dev/null +++ b/includes/ft_malloc_public.h @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_malloc_public.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/25 12:31:43 by thrieg #+# #+# */ +/* Updated: 2025/11/28 18:26:47 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_MALLOC_PUBLIC_H +#define FT_MALLOC_PUBLIC_H + +#include +#include + +void *malloc(size_t size); +void free(void *ptr); +void *calloc(size_t nmemb, size_t size); +void *realloc(void *ptr, size_t size); +void show_alloc_mem_ex(bool hexdump_free_zones); + +#endif \ No newline at end of file diff --git a/libft/Makefile b/libft/Makefile new file mode 100755 index 0000000..d19126e --- /dev/null +++ b/libft/Makefile @@ -0,0 +1,79 @@ +CC = cc + +CFLAGS = -Wall -Wextra -Werror -O3 -g3 -fPIC + +SRCS = ./ft_isalnum.c ./ft_isalpha.c ./ft_isascii.c ./ft_isdigit.c \ + ./ft_isprint.c ./ft_memset.c ./ft_strlen.c ./ft_bzero.c ./ft_memcpy.c \ + ./ft_memmove.c ./ft_strlcpy.c ./ft_strlcat.c ./ft_toupper.c \ + ./ft_tolower.c ./ft_strchr.c ./ft_strrchr.c ./ft_strncmp.c \ + ./ft_memchr.c ./ft_memcmp.c ./ft_strnstr.c ./ft_atoi.c \ + ./ft_strdup.c ./ft_calloc.c ./ft_substr.c ./ft_strjoin.c \ + ./ft_strtrim.c ./ft_split.c ./ft_itoa.c ./ft_strmapi.c \ + ./ft_striteri.c ./ft_putchar_fd.c ./ft_putstr_fd.c \ + ./ft_putendl_fd.c ./ft_putnbr_fd.c ./ft_int_utils.c \ + ./ft_safe_int_math.c ./ft_split2.c ./ft_long_utils.c \ + ./ft_safe_long_math.c + +SRCSBONUS = ./ft_lstnew_bonus.c ./ft_lstadd_front_bonus.c ./ft_lstsize_bonus.c ./ft_lstlast_bonus.c ./ft_lstadd_back_bonus.c ./ft_lstdelone_bonus.c ./ft_lstclear_bonus.c ./ft_lstiter_bonus.c ./ft_lstmap_bonus.c ./ft_vector.c ./ft_itoa_base.c ./ft_addr_to_str.c ./ft_utoa.c ./ft_strnonchr.c ./ft_utoa_base.c ./ft_strcmp.c ./ft_vecint.c ./ft_power.c + +SRCS_GNL = ./get_next_line/get_next_line.c ./get_next_line/get_next_line_utils.c ./get_next_line/get_next_line_utils_two.c + +FT_PRINTF_PATH = ./ft_printf/ +SRC_PRINTF = ft_printf.c ft_cases_mandatory_one.c ft_cases_mandatory_two.c ft_printf_bonus.c ft_cases_easy_bonus.c ft_case_lowx_bonus.c ft_case_uppx_bonus.c ft_case_u_bonus.c ft_case_s_bonus.c ft_case_p_bonus.c ft_case_d_bonus.c ft_case_d_utils_bonus.c ft_arglist_bonus.c ft_padding_bonus.c +SRCS_PRINTF = $(addprefix $(FT_PRINTF_PATH), $(SRC_PRINTF)) + +FT_HASHMAP_PATH = ./ft_hashmap/ +SRC_HASHMAP = ft_hashmap.c ft_hashmap_utils.c ft_hashmap_utils_two.c ft_hashmap_basic_type_hash.c ft_hashmap_advanced_type_hash.c ft_hashmap_basic_cmp.c +SRCS_HASHMAP = $(addprefix $(FT_HASHMAP_PATH), $(SRC_HASHMAP)) + +FT_PQ_PATH = ./ft_priority_queue/ +SRC_PQ = ft_priority_queue.c ft_priority_queue_utils.c +SRCS_PQ = $(addprefix $(FT_PQ_PATH), $(SRC_PQ)) + +FT_SORTING_PATH = ./sorting/ +SRC_SORTING = ft_radixsort.c ft_sorting.c +SRCS_SORTING = $(addprefix $(FT_SORTING_PATH), $(SRC_SORTING)) + +OBJS = $(SRCS:.c=.o) + +OBJSBONUS = $(SRCSBONUS:.c=.o) + +OBJS_GNL = $(SRCS_GNL:.c=.o) + +OBJS_PRINTF = $(SRCS_PRINTF:.c=.o) + +OBJS_HASHMAP = $(SRCS_HASHMAP:.c=.o) + +OBJS_PQ = $(SRCS_PQ:.c=.o) + +OBJS_SORTING = $(SRCS_SORTING:.c=.o) + +NAME = libft.a + +RED := \033[0;31m +GREEN := \033[0;32m +YELLOW := \033[0;33m +BLUE := \033[0;34m +NC := \033[0m + + +all: $(NAME) + +$(NAME): $(OBJS) $(OBJSBONUS) $(OBJS_GNL) $(OBJS_PRINTF) $(OBJS_HASHMAP) $(OBJS_PQ) $(OBJS_SORTING) + @ar rcs $(NAME) $(OBJS) $(OBJSBONUS) $(OBJS_GNL) $(OBJS_PRINTF) $(OBJS_HASHMAP) $(OBJS_PQ) $(OBJS_SORTING) + @echo "$(GREEN)finished compiling $(NAME)!$(NC)" + +bonus: $(NAME) + +./%.o: ./%.c + @$(CC) $(CFLAGS) -c $< -o $@ + +clean: + @rm -f $(OBJS) $(OBJSBONUS) $(OBJS_GNL) $(OBJS_PRINTF) $(OBJS_HASHMAP) $(OBJS_PQ) $(OBJS_SORTING) + @echo "$(YELLOW)deleted object files from $(NAME)$(NC)" + +fclean: clean + @rm -f $(NAME) + @echo "$(YELLOW)deleted $(NAME)$(NC)" + +re: fclean all diff --git a/libft/ft_addr_to_str.c b/libft/ft_addr_to_str.c new file mode 100755 index 0000000..012271b --- /dev/null +++ b/libft/ft_addr_to_str.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_addr_to_str.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/22 16:54:09 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:02:50 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +void ft_convert_to_hexa(char c, char hex_buff[2]) +{ + hex_buff[1] = c & 0b00001111; + hex_buff[0] = (c >> 4) & 0b00001111; + if (hex_buff[0] <= 9) + hex_buff[0] += '0'; + else + hex_buff[0] += 'a' - 10; + if (hex_buff[1] <= 9) + hex_buff[1] += '0'; + else + hex_buff[1] += 'a' - 10; +} + +//convert the address addr in hexadecimal and returns a standard c string. +//returns NULL if the allocation fails +char *ft_addr_to_strhex(void *addr) +{ + char hex_buff[2]; + int i; + int j; + uintptr_t address; + char *ret; + + ret = malloc((sizeof(char) * sizeof(uintptr_t) * 2) + 1); + if (!ret) + return (NULL); + address = (uintptr_t)addr; + i = (sizeof(uintptr_t) * 8) - 8; + j = 0; + while (i >= 0) + { + ft_convert_to_hexa(((address >> i) & 0xFF), hex_buff); + ret[j++] = hex_buff[0]; + ret[j++] = hex_buff[1]; + i -= 8; + } + ret[j] = '\0'; + return (ret); +} diff --git a/libft/ft_addr_to_str.o b/libft/ft_addr_to_str.o new file mode 100644 index 0000000000000000000000000000000000000000..171eb3e13ccca3a9fb33d502a17c22d58f089555 GIT binary patch literal 5512 zcmb_gZ)_Y_5udl~J)eEfz4Kj29O}|5Bx$J9wcUocfJyDdE_P}~Zc@uQATH5y?#=w(%=>qkq69O0l4nm*>SV;tOk04aum_t{QcI?I9WhR;4|OJ^fsH|N)u)*Ec;{MPQ3Cs*)i z)0WvyT)5;Fww$>pvF8f@ykX1iAN_7x>UQjwvhWXE7WZJNZTZTZwshb0jW!0BuXp2UD;V($D6QHu zyNbfQ_;cNs*|%&t{ufj(;twwC4=B82_sf&Nw);*3yJXD%$|3(#bD)4g=ppS+SFv8;RD31jk zXR%N7%^Ki_7^#p;6-P;Wn5+a0SNjN~)bfA=j&m1-P4?3CI!U``?ht_=+R(fb-I<$6HSmBuH&^oszBy~0e^)?f)x0#lD zn`y4MnP|PuMCxs(p}LvwU^7~UmC$AqTQ+lw9#M%}0mq&q@mxSXL*n-W>Uk1>5>TA7 zzX_-{60Zi-TO_^{P@D<;OzLEiXcc?nDMODZcHS0m70C#IwgU!Jdi)cyPsRZB-Jr)0 z#$qvm22-FxPunwxc6Fry3bsF%ns6sua`JE?t)IB`NpsWIyN0l<9#AVxnA0EQT`z2>nmVn+mj zw1jB%+b^M;FM3CiH%>%Ek#9mC5z%lkl(aNjHTyKG+XVnF+Jm+idjoaP-8Je*K2T%4 z8&z*}+K1Z(z&2bhLhIDy*y6IKw`fRs>oOWzab3xM0ziWl+C&?xujGX14ArcDf^<&l z1=2a6e@Hqf^Uq1=Ouj-or?Gb+0|4hRzhWvz#%CROHk~VEoyqiRt5nVxopjf|W~bS8 zPuIt1z25u4b~D+DiBiTbX3B2K%t6OgaoXx|r%HKivZK!`pK^;c9k!d9&K3&ATt^{4 zZo5z@I+N*Hr<|X3tci5qabY&^xHE1kc`mg@;txeR&0QNIA0Oz*K{yK!q zxUHozx*!1X+SE>cn52j{0O%wca}9dqiLYpSgBFj%i1#-1Vmb@)UVIxi_*w`6(J@;t zb>y8~VRpg-D7zDR$2F(0YfE$y4H`62jRepW!bmo!jMO7WWXwoLY$I~S0KKqaL?U{d z=`*GQ`qY9UB6@qb0k0a-=0}ajiV=x)8_9^Cw@(;pz5T3_)F<45ga0=<^^}nuGa`{_ z+DJvpMiM9deIOnQ#1I=2Lk7`q&p7gk(W2k3%?P9Es3C?l4MI2E`uH&h3^s16y}DPE zs&%G{cRi`Wd%j_85T6c{1Rbi6qXs&7m!mDv{pz&^dQhrrpa+$z20CC3t_5x@2^!ty z{hEh(iFgL*?03P>Wfez=zzA&vfcJ0u_^B5+tXuv+=G!R**kF-k{_YTuV=?d5Z>qsw z;U@4Yfwj3>xV^ReV16&@J3@T5o&&%KLp+Z20O=p17Pk?8Ivt9=L;C#+|2fh>MXfqc zMzNnGeNy4SPCDONcwgTn{>zH}dD6c|EzisM(?o^nU|BH}BG=;Ad1iTj+T*6xFLU$YJh< z!OxMuDH);vPVsQ3cm8Ze4;8wT)Rm-q%DIVm2?XXj&X4_JEKr`RQR4Zz{Q>!_SR((I zsb#49$J?pOA-+vX%kLXQwZ+e9l|!7RfOaaKit2s4Z#|^}o}>7^MC-@+;5nkk4?iu` zF%d7&p~JUnhH875{M9%gqKRH%M*{nEyZ;vc?O0R*;4boGuphU0p0FIoVe(g@+J4LT zpHUt&43PhTG62Vq@r_&L?+m>^92bl~-V@lL^Y`p6*1tgWk0}dQRKO3Vy3e2H=Xr2` qq}2KGJkp15VsnP~gy8p|!S9zk{|ddAD&D5c#xOZxgI|p5{Qm*Eu(~P$ literal 0 HcmV?d00001 diff --git a/libft/ft_atoi.c b/libft/ft_atoi.c new file mode 100755 index 0000000..ed894b7 --- /dev/null +++ b/libft/ft_atoi.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 18:37:49 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:02:53 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +static int ft_is_space(char c) +{ + if (c == '\t' || c == '\n' || c == '\v' + || c == '\f' || c == '\r' || c == ' ') + return (1); + else + return (0); +} + +static int ft_convert_to_int(const char *str, int sign, int *overflow_flag) +{ + int value; + + value = 0; + while (ft_isdigit(*str)) + { + if (sign == 1) + { + if (value > (INT_MAX - (*str - '0')) / 10) + if (overflow_flag) + *overflow_flag = 1; + value = value * 10 + (*str - '0'); + } + else + { + if (value < (INT_MIN + (*str - '0')) / 10) + if (overflow_flag) + *overflow_flag = 1; + value = value * 10 - (*str - '0'); + } + str++; + } + return (value); +} + +int ft_atoi(const char *nptr, int *overflow_flag) +{ + int sign; + + if (overflow_flag) + *overflow_flag = 0; + while ((*nptr != '\0') && ft_is_space(*nptr)) + { + nptr++; + } + sign = 1; + if ((*nptr != '\0') && (*nptr == '-' || *nptr == '+')) + { + if (*nptr == '-') + sign = -sign; + nptr++; + } + if (!ft_isdigit(*nptr)) + return (0); + return (ft_convert_to_int(nptr, sign, overflow_flag)); +} diff --git a/libft/ft_atoi.o b/libft/ft_atoi.o new file mode 100644 index 0000000000000000000000000000000000000000..7f2b5fcb1d4a5df8a14f0e798fcf3254585c214a GIT binary patch literal 5000 zcmb_gZ){sv6+hQE_r-}DJ8?D=w`GaOy0xr*iP!O`)Y{^tU7e^!gD!2@L@nEScHBC4 zu%AQAU@39i5ky!e{!RVRAtVr>jSodan<)LG7DZ*67(xQ^1tyTtwDMv5QaTM}bnZLH zetvNzB=|}3J?D4NIrrTA?mPFsEbTw|gii=y2zU&dS`+?IQy$ae7=%H1#dd|h zbA5GZSMAsJuglwAiQ0|&uWicS2|0 za13v63k{9I#OkK2`&MI#cx~;?(3NKej^FUZd4{gY*G2$N@3@}G+)Ctc<+9mqV&yl9 z>+d|Cxc>hA;&<^qzkTkt_?qG5A#cB;2l*}y@<`SU4V}>o5E|MCuwT>V z-hnN_J`pwme5R1WPX+b{9*Ru%4+j9G0*9FF2k3azrKkr$1|JIq0suw`u)Fg?-S|y` z!Nvx^Hy&vQdprWrrNB4P4A=c=iyHW_i1tqp%mh9cI2r)hgvQZ+fF1?DK@@^$k3wi= zSwOVEPXP3~6OKi2ls=`?fF}h&hn}lnufZmscMGlw03R|UlEGi;$j1SIM5IZ47AU0H zf-ETg(_xeVpwni;5C-=8u@iwqh@&Wp-PqCP(5T`tE*0ZN%X3--_$syhF8rNz-gRC~r>jM~ zI-Dt_in-xMt6a&Kio?-I%uzGCE4rtudv`t&ws+_P( z3nN)OIiD&NN|}*DKApAEJX0zzT4g(Fmy-FS4ft2F%aEB%m7$W)6`{0fm9vG?7n9jS zDhG?HLe)aQd}TJD%j*z0A`}zjH1wae{wo)JN0Eh>B z$Ag38!QpstdptN=Q{U`(L7wx;O9J&_-Paor^0vw9?Q7yT5#obj4>lMEHV#+YpJ%)TbtGbMs^3BNfvb-;*3`0gt<&(LXA=6nEHsrSRYQUI6+f&QRkiAo? zOD;?)pE0Ah8s}8Rh^Za63i`9kA5-@lqiSv*+y%FESO-ak#|!CHjCGLBV$lNGEDkM@&O6_NIRFT|^3i(^06qfrB75*O=~yDM1pTY- zV15Jsha2z%RC2s=><#!IZNTe0E!97#Y&+nxjdhW25Mk4gV8gC8&JnXTbCjAp0{sigc9v+Va1mB7{&r`(DP|N)Dq|bWz9O+dLk7o{oORzV8 zyci=mK3`@oxOjc65iYuTTpzyi;QmKo9JGI#^jE0m_&l#yT|C=+yzb)l zc}n=bi^n*Fv~S+=@E3`{OFXXwUsDzJGyes$<7*l7JkKGI{T9-9diay1*m#B-bm%vmd4%_URmblF-2vuqVorfr?H!OWEA=dGeXz4#y_ z<8rE)vns6NQRw(Nq4LFS3Cv>2w#);cp59flQ<)QdpnzE@EY2rWv$N$&KG)(_$QLal zthr>ioSL_IghDC90n7}T6}xPw(qL9j&13t2!O!^`=E0c0{s1&SvY^qTf8ZHIm9V?>G+$3;k7-m!Th%e9FMmtf1E$Av3LIZCd0v9c!M4YKL>`_7VlHY zaouM0P?6{JiNXHdV*PLDe~J7bVn+h|af|huWjFrhK4e_*+J4*dU+_F;c#Hh`JYewp zF|eMu+kd^Z|9PL``s10&{>;}l$p4dMc-)h)N7YyUcH?hvGd@z@@fYy@Jy^$MOaC8* e!S62v^GA5c|D~s1GJZ_oPwx_eemJ&w{Qm%bFf2g; literal 0 HcmV?d00001 diff --git a/libft/ft_bzero.c b/libft/ft_bzero.c new file mode 100755 index 0000000..e1c46d7 --- /dev/null +++ b/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:50:09 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:30 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + ft_memset(s, '\0', n); +} diff --git a/libft/ft_bzero.o b/libft/ft_bzero.o new file mode 100644 index 0000000000000000000000000000000000000000..f4be1406e49318d5c7fe0816b0917f4604276a73 GIT binary patch literal 2768 zcmbtWTW=dh6#m8=UlO;@#i(@}ge-9>63RF(5^A}W5J4fRAhn8tH{;9LUUj`2?XIH| z2@-;Y)INm=#O(!MfCmIfNIdfkcQl{${PD)}q5yJt z4+Jumk2WemUJC7Iv;1u0s*nY_n4JeO_XwQQ)nc&-6whI^oazGj0l-X>WFe`@89Vm` zw6~02Awj%Jl9+cyBb|IY_LK160LZ?pEdb=imRQS)hI3yua^i+_Uu*$+TFG1>+d}g5 z8O^>Vb~Y(zb|x9}gqTt9{v`2Fh0kKDem zx>aJdKSb~mxx1EctAzmHOAp6t`6NTHj8cr)82Uf29%ET1!Y?UQi9;K@&&<%f8rGd8RD#1#ID zj@yDQQYWt83n2X< zR`TW78>>;=>fC~)9&5I`-7s?d$J9O7S4^luvlq68N{8@*&NzhZKt^#Gx7v`=J3|`( zKfX4;Kql_-<^0(s(|6+-=sluZns<|se)BLsZw9>{nRvC)4;8-4~|p|8d^`KKr5lQ;qHYud>fI zE6%TMch}-|{(7W$gyy#WTii4k|Hc01DSIO9nN4Rv$JO{SwcobY_nENs()-t-cjmPF z^DW +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 19:42:05 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:37 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_calloc(size_t nmemb, size_t size) +{ + void *ret; + + if ((size == 0) || (nmemb == 0)) + { + return (malloc(0)); + } + if (nmemb > __SIZE_MAX__ / size) + return (NULL); + ret = malloc(nmemb * size); + if (!ret) + return (NULL); + ft_bzero(ret, (nmemb * size)); + return (ret); +} diff --git a/libft/ft_calloc.o b/libft/ft_calloc.o new file mode 100644 index 0000000000000000000000000000000000000000..8705130ac47599a287bdc843c8aed53a331a8131 GIT binary patch literal 3240 zcmbtW-D@0G6#w0w%w&^IH`%Oh6I08I)}ol%Y%HiX)Fd=IDM5oxs-Se;kJ%5hI~!(Z z(-;btgeWUmq7PP|1Q8Sz^~pCy@vDD<_+(!M6<;ca`k)XwckZ2?o!x-o?_uvfzkAL- z_ntZD?0tD*>4^wqkYG52w$w%?+Mdty=`0dpn7eR(+1TB8Ge+x{v3uLS-)Q}0{PpX4 z+8F-yhS9q58|fOmU%AH@Ti+Y4AB@(|ocbe?**A8+jXpnj@pn>L$lP9P-4x6>(pO4M z7*^%PfU>H{9^e&$|FQ?KCIbG@6>x3|v^bMEgR2ni| z6pKDsf}MybRV6-hbRwQ$qZ$wy2B7GSq}j1+^W#eVbnLO%$??VH1ppC6awM^5Nn*nf`1V|+XnEWDqAJZ;f|Rvaqzs^+twbCEJl!G_1EetU zHmwZu@U!2VH?8vh@tu<_Mb@>W}U*;1qykVvVAT`S{3Od~7bB+EK1X zF4JseJ|10&r_RYa*Z!J^xkNiM_ILac4fOdKz;vXWj!lN}$;>pL^RT78aHXqO zq1G&#=!g~o9ud7l`#5f~XqNN}BD65Te+kMkQ%46cX-ZvJk~8X%_JXQuCH1g2rAD=L zYQMIlYTAqnrKGD7O*uBBDaDV~n5G=oHD&Ebm1)ZHnMe$QF4T?p`2GIe?_L2E??hct z+KJZzrJaEtP`s?`f`UU`oDN{5iv?Z>Fd8@y|Aqi4$9w7DE%u-i836Flz6Z(!0`dI; z{%n8`>T80hD)Gw=@T-@2zwY=MJxKmOAs-3wa!d1Qm*+K0pP&{c-au8 zUt8!ch>>`|tpHdI@Z|ThkXHgc>F0&~T!1J2mXHepp7cKvayh`0{#7Awh*93_5h1@C z(&tSNz&j!SMIpZ*;mb1Bh-ZnR&+h#4NyXK|~z0j!F zP0N)Uj%&9&n5XBNR;^M4y47$^{mG|RCmlCeSc6U-A)6}}ZKqo9P_I=jQxIk)Te5R? z6JDEa_Xz2;)(DV#0lMSbZY~eqd8tn0{|9}qU|vXkNW}r*OGyY&{DPoDpDaPUZ-y{4_Ne2R72>)+NLO}YLBlRDehwYyh zNpVsd9$-)3NA4BGMz5smp-X*-0qen9C2R`&<>01)`%7FpAby)7e`TIf{OA=Hj^A33 zGZC%}|KCYR0^z&T%b-{O?)C6b|8`;j)K`_I{RV(5(g#7-pMa3PeNJLe9O|YZ K$c~N__Wv(Oh&9Fl literal 0 HcmV?d00001 diff --git a/libft/ft_hashmap.h b/libft/ft_hashmap.h new file mode 100755 index 0000000..900598e --- /dev/null +++ b/libft/ft_hashmap.h @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 12:14:47 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:06:02 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_HASHMAP_H +# define FT_HASHMAP_H + +# include "libft.h" +# include "ft_vector.h" + +# define HASHMAP_FILL_PERCENT_MAX 200 +# define HASHMAP_RESIZE_FACTOR 2 +# define HASHMAP_MINIMUM_SIZE 16 +# define HASHMAP_FILL_PERCENT_BEFORE_SHRINK 50 +# define HASHMAP_SHRINK_FACTOR 2 + +typedef struct s_hashmap +{ + t_list **table; + size_t hashmap_size; + size_t nb_elems; + void (*free_key)(void *key); + void (*free_value)(void *value); + int (*cmp)(void *key, void *key_to_compare); +} t_hashmap; + +size_t ft_hash_int(int value); +size_t ft_hash_uint(unsigned int value); +size_t ft_hash_char(char value); +size_t ft_hash_string(const char *str); +size_t ft_hash_size_t(size_t value); +size_t ft_hash_address(const void *key); +size_t ft_hash_list(const t_list *list); +size_t ft_hash_hashmap(const t_hashmap *hashmap); +size_t ft_hash_vector(const t_vector *vec); +// Comparison function for integers +int int_cmp(void *key1, void *key2); +// Comparison function for strings +int cmp_str(void *key1, void *key2); +// Comparison function for unsigned chars +int cmp_uchar(void *key1, void *key2); +// Comparison function for unsigned integers +int uint_cmp(void *key1, void *key2); +// Comparison function for size_t +int sizet_cmp(void *key1, void *key2); + +//returns 0 without doing anything if the allocation of the new table fails +//in that case the old table is still valid! +//returns 1 if the resize is a success +int ft_resize_hashmap(t_hashmap *map); + +//returns 0 without doing anything if the allocation of the new table fails +//or if the table is too little in that case the old table is still valid! +//returns 1 if the shrink is a success +int ft_shrink_hashmap(t_hashmap *map); + +//applies functions free_key and free_value on the element if they are not NULL +//returns 1 if the element has been deleted +//returns 0 if the element has not been found +int ft_delete_hashmap_element(t_hashmap *map, void *key, size_t hash); + +//returns a pointer to the value of key, or a NULL pointer if not found +void *ft_lookup_hashmap_element(t_hashmap *map, void *key, size_t hash); + +//frees the entire hashmap and then returns NULL once done +void *ft_free_hashmap(t_hashmap *map); + +// Inserts a key-value pair into the hashmap, +//returns 0 for an error, 1 for remplaced value for a key and 2 for new key +int ft_hashmap_insert_element( + t_hashmap *map, + void *key, + void *value, + size_t hash); + +//allocates an array of initial_size, and sets nb_elems/hashmap_size to 0 +//cmp is a function that returns 0 if both keys are the same +//returns NULL if any allocation fails +t_hashmap *ft_create_hashmap( + size_t initial_size, + void (*free_key)(void *), + void (*free_value)(void *), + int (*cmp)(void *key, void *key_to_compare)); + +#endif diff --git a/libft/ft_hashmap/ft_hashmap.c b/libft/ft_hashmap/ft_hashmap.c new file mode 100755 index 0000000..46d451e --- /dev/null +++ b/libft/ft_hashmap/ft_hashmap.c @@ -0,0 +1,156 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 12:14:50 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:34 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" + +//allocates an array of initial_size, and sets nb_elems/hashmap_size to 0 +//cmp is a function that returns 0 if both keys are the same +//returns NULL if any allocation fails +t_hashmap *ft_create_hashmap( +size_t initial_size, +void (*free_key)(void *), +void (*free_value)(void *), +int (*cmp)(void *key, void *key_to_compare)) +{ + t_hashmap *map; + + if (initial_size == 0) + return (NULL); + map = malloc(sizeof(t_hashmap)); + if (!map) + return (NULL); + map->nb_elems = 0; + map->hashmap_size = initial_size; + map->cmp = cmp; + map->free_key = free_key; + map->free_value = free_value; + map->table = ft_calloc((initial_size), sizeof(t_list *)); + if (!(map->table)) + return (free(map), NULL); + return (map); +} + +// Inserts a key-value pair into the hashmap, +//returns 0 for an error, 1 for remplaced value for a key and 2 for new key +int ft_hashmap_insert_element( +t_hashmap *map, +void *key, +void *value, +size_t hash) +{ + size_t index; + t_list *current; + t_hash_element *element; + + if (!map || !key) + return (0); + if ((map->nb_elems * 100) > map->hashmap_size * HASHMAP_FILL_PERCENT_MAX) + ft_resize_hashmap(map); + index = hash % map->hashmap_size; + current = map->table[index]; + while (current) + { + if (map->cmp(((t_hash_element *)(current->content))->key, key) == 0) + { + map->free_value(((t_hash_element *)(current->content))->value); + return (((t_hash_element *)(current->content))->value = value, 1); + } + current = current->next; + } + element = ft_create_hash_element(key, value, hash); + if (!element) + return (0); + if (!ft_add_hashmap_element(index, map, element)) + return (ft_free_hash_element(element, map), 0); + return (2); +} + +//returns 1 if the element has been deleted +//returns 0 if the element has not been found +int ft_delete_hashmap_element(t_hashmap *map, void *key, size_t hash) +{ + size_t index; + t_list *curr; + t_list *prev; + t_hash_element *elem; + + if (!map || !key || map->hashmap_size == 0) + return (0); + if (((map->nb_elems * 100) / map->hashmap_size) + <= HASHMAP_FILL_PERCENT_BEFORE_SHRINK) + ft_shrink_hashmap(map); + index = hash % map->hashmap_size; + curr = map->table[index]; + prev = NULL; + while (curr) + { + elem = (t_hash_element *)curr->content; + if (map->cmp(elem->key, key) == 0) + { + return (ft_delete_hashmap_list_node(curr, prev, index, map), 1); + } + prev = curr; + curr = curr->next; + } + return (0); +} + +//returns a pointer to the value of key, or a NULL pointer if not found +void *ft_lookup_hashmap_element(t_hashmap *map, void *key, size_t hash) +{ + size_t index; + t_list *curr; + t_hash_element *elem; + + if (!map || !key || map->hashmap_size == 0) + return (NULL); + index = hash % map->hashmap_size; + curr = map->table[index]; + while (curr) + { + elem = (t_hash_element *)curr->content; + if (map->cmp(elem->key, key) == 0) + return (elem->value); + curr = curr->next; + } + return (NULL); +} + +//frees the entire hashmap and then returns NULL once done +void *ft_free_hashmap(t_hashmap *map) +{ + size_t index; + t_list *curr; + t_list *next; + t_hash_element *elem; + + if (!map) + return (NULL); + if (!map->table) + return (free(map), NULL); + index = 0; + while (index < map->hashmap_size) + { + curr = map->table[index]; + while (curr) + { + next = curr->next; + elem = (t_hash_element *)curr->content; + ft_free_hash_element(elem, map); + free(curr); + curr = next; + } + index++; + } + free(map->table); + return (free(map), NULL); +} diff --git a/libft/ft_hashmap/ft_hashmap.o b/libft/ft_hashmap/ft_hashmap.o new file mode 100644 index 0000000000000000000000000000000000000000..1516cb56fe101120d3301f3bf0abb65b61006f4a GIT binary patch literal 11648 zcmbtaeRLevb-%N-Z?x9RE7`Jzgl(*V3I^LN$v9NT>kkRb%*t#0A;~DjSjf`q<9M}F zw6nsvv6a{s?PLwe2a={K!8wJ(X%783rJ-rs6Wei8OhQv92Mh-X$HCMws0T`^Wpe_k z=f1gj=Iu!8$vM4$Xzu&X@7{OcefPbcd83iW#KwT80gDD}!E1T4{#Heo>Ux+18r0ug zzoWjjzNOh5owSH*Jnxm7&hku1# z*jLQaiQ>a&06+$D*0g_T?zy|9%gk*FnSH-Fjigm)hKty*ncEaf*cZ%Mr_Ga>D--t0 zDrbi%5L=L|DfXWH*iHZK`HVVRqA z!=cTi6WQOI_6KHeWmUp{+a2>p)BZ`q{=l@)oA!?+T7NtM0HY_eOObA$mtbS<W|}8Y_PAHhkhJ#b8!Eu?r8Di!*UYFrpd=8nS%+Lk2j_MsZ7G? z%f*L(Ds%N(d{1LZmudgVob^-lbGn(UOV|_jldYJxrKbH>ck$v4 z0A}v~kU4tJs?DRA_WP#&*64}sh4Db`glYdeVZWWQ-=!R4QpWYh+R3Sz8FS0SsSfK) zahVCLFK&NAS+L4X`wS1O*tE~cVU34z9vZN9^}~2BSY_rGo{>(@SUx&0uA z(o%(E37feu;t;a$j0ZR8_J>1T1r{wzBG3HT$gw33$@AYGt*Pc0+AutFO6MEv#0$Ry$ZV2@1kT zTFWtRdG2@26x5%&?zge}GZ)&$Y6-ayz=N({?ncqVD));~Y;&Xdf?~|N7uoiiBKw9L z#&%Xct0`0S4zWGTlu8*V%4e?QT|o+s1J|ZjC6A3Wt-)4SJ*z3{{R%mL)=g3?tNU@6 z1^{hpglzRK*Q$k8&uYrLVXGHit8J{_>GrjQ)!hU+bHuGKkGPLi?$IGq&Rn@dodsRP zofSSqZR#w2?6V3$&9Oyf#sMP6`WIa9J6Pq2HE3a#gGWn$^xD+9`P3JL2F;)I#h^j+ zhAE?&vaoL@%I$8HTN9-2@E|v3Bx7{zd6&}4>RjF7Op`gbdd9VCVb!ymQW|XauddZL zR)0p2Grin;)g!XX?x(MVvt)3|GvtA?oabBa=$Z>ijd&2VSw12w?tYr(Qc2b;T`#Sy zzTiT;Sp6PBIF8mS^&F$SCS9?XSpT-`Y|8IQf^I$NQkq%a??O9S^&CwZZYQw^T&q^j z1WOOyVsDz~_>gNg#j!R=`-4cS&?6<+Er`s~<{AKjVgS&KAzlg)EQ5Hd9=S8TIt(C6 zH9ZmzI}Kwt=#h9SHtNCv1y!I&)`r7jfKXIJN9)V~w4uT=y`>^vx~>9XmVm%@4usAN zSLQXt_CZanEuEtQ6n*WW27&UU4dno{qnhU>R)KyZLIzii29GzCqeY2*Py^EE%-3$I z0GK;piUnVN;VuCXl!*(;)n3F&%#-iy00A9eC4#HzhIXAmtz0Gw;5OW-=YfHk z)aQq!-ivry2?R4_7l;<1RuID14Jr7uuicBPKKBj*FpF@|OVQeE&N~@UoAdLVW&aic zD0FSh(N*{ww*jC?YYiNLBCSQM1DK6Sa2bXg!O-L%aAOjh8`Cn}y}Tfn=Z6?Y58mDC z{ALXfz>8@`e)INRUc@Vx0zkN&mNQ430VvkoVlC2I0>c2|xAR!r0$;{E!K3g*2uF#G z09Crd;fE1e;LJRZ zPb~CiUMwn+9God}L%F9fu9P}XnW$U>I%Y!0O*r`HG_v5`vX_$JU6P4;4K_Nx{0s6n zhCoNIj{EeS2;K+%mjQseGG=T$pqy!~;!_-ni#pS-V=+7T7fUNy2{_yc(xDWcYS+t# zlLfaxioF8al3yTO@(W}O_URSKmi!Xfmfvj7uZZpW%@$c8h0b!7f|I=;3&eef!vZ-l z9THxUXSY4DABw1OTCvDz#@Bf>?u>p(1k>&Oans}F;W2OVrt(Lc%Fl!UZvMd2`OSg+ zfe+%qi#7LImImoX@l7v^ujWVbRgA)0frs+@Ih^0m!`P2U9>u#;mdgPwwAHw6;!;2n zpM%!j*|e3d>`Zl}dn$*MLz%vTbY<;|Xic&9c0zUU zK!38@>K*D!_Ec|3X7*SElF{FhN)2>Yr}}nxTd*hj5Da&uvPnQ6kQzw$RA$qezMgcl ztFkX`L8fnCvfYA=?4v!IO7hC@F0yCO{`v$L>@TItS7g8mE(c z(P64DgO22d$n9te>D|(C2D*om$##rTDo&W4{eu)tf5)KgcqrLnCG*4Uw%R+ox;O+i zOz8=GQ^8E{P+xiv)6u#snM#t={*FNzV|#j_E9vVHLvXW?_jnwA=}dCSQv2|Eei>l#?O{=t}N|&g{?-CY8+whmyk*lnDHuH6(>!+_in% zLEBrREhs7ojcEXN0I<-ZIB(Mpk&=c;c|)YKA+n@CQgg^SA|44osy`M8?20UraJi&} z05$+X8`LVfa^BwYoyX5cT z=i}-8;8^6*34q*X{*STjS0ZS@vBUtNir!vuZ-7lamU<@-;)s)l{n)IODMHIrul)Sq zk-k&Mr=n+ZSJAZJMP}m#-QlM1)ecl=GefvKt5d1r{^hkRq%QY>YG>_N_oX{iS*IAO z;HslhQ0s4SsBgH#N=AFpdB*DMN_IzkA)s=iop?{~0?}U3^KQvD1a+82n-PFsris$R z$Aw|U^zNt#8T!H>h=OC-7NB=VMTwy=j){4PM0k@Z*(By}62+UuY~!>jFxE&`*r+!2 z`wj}t(3eC7=(A3Xg2HnmY{c}YZvBp!-ZUoW8+zTCxXEY}HBDlnC5)KRjcQSLNE91Q zVvZ5GrBr~SH^xN3&|^(v`F*0!h>3!jXy_IN=(QnAw~F*xZKB{mD8L_#L`8w2pN5#B ze}Ckxej2)k5yhC$-#?B#FKP|_1hk2m5fi~CajUUL+-X=CY~fP^LdQix;jd(@-yP}J z&q7T9?#P%}fSOp+Bn)hKi!wuh17c#4(I#{wR4R|O|2M?+M@QPk0@R%NMX^z1=to9EZTkN}n}`@P z)|?aT1X$w6OHMFNqVk}V>OXeEnSdrScdyXy5%8ucC@hy5FET>&WaLInlo_>h`T{Zi zqXSV<-;Y7tBvGW78S2Ze6vV_Hm=(s4R5uM&&{GvOLsZ&Jv9vkvRcbYRo`L@-Gw?40z+7cqd;*GZLx}T{wQ`CM@!I3|U_$L({`F}y}pC~x; zx$g19D+nVQRe^59-d?fiX;mrRlYV$tCeBM76QM}CmTWT*+aEvEH z?PUs%@pC+XsNl%oK<(8Ej(o14jS7zZr>Whf;K=8?YE^LLuc18f*A|YS>#WPi&k(;? z!O{N>gl7~S{eOe-2NfLoRfHc@aOA&2_`?d0{AGlHop8J$^iMP|&-w6A2>)jv&fjR> z^5IcxU-jX4QM;J>$0n-V3Fj{voVORK-`j}KIM?ePKAhuO>%(6rKTSUTJ;M2`0sFs7 zIDhD1Tm}pPyl*qk>x(~vFwX1f>%M+@ojmEo@t+=0_zMI3kuMPd@OM7`>kb_*`tTbm zpE?$SvQMre{01MsmGBzEv57AEd10-O|1$C83XUot5^h#-tT$edZ3>QR9kucONR5-% zBcHru9*~kI9{)aaet3NiD}GSDNbP+JuCA|91xK}lehh5|NB&C6?-L4+>Qlu3rh+4X z74e@|a8!Rw{O1%L`CP9r63+R5lk$Aphx3Q8H+?wQ@%uh}h~f!T|D3lZ`CsV6d4H)R zoa5o=xQ#ykMe?&v!7+qII5+@kRd9s39v)C|Z*Dmd~t5dS+0j(ncqzb2gXIZ5;KLm$r1*RS~e z@E6qA6&(BRp?=RPIQGkVzNFyDe}VY#DY%-4D+-SM_lW~Jw*FQgpupgc;evjZdU5R!jcV~OrJ9h8JL%QftGSv~a@GvymInXc9RlQ@NX^s$Q zJ}8{|aB+rX&>0R*-2+GW6p}*DSVI`w)PqvrVJ{v8d*`uqLhE|Pwliuc5q;_I0f?pt ztYq}=ds>%gtd7n-5XECJjC&~4*ONz2^`(;pBzxPthdTO`@?;o$^<@ALm7N1y=d@b} z=A2Md->Cr!()n4m6QUVw$m-Y)(ab~rc>Vv&Q=0R8<(IKr9OQ4PPFZ|S`7VnXEjw47 z|Iq~b{ZtkIyE=Ynrlp!Em+8fBe74huIhK2awJhFvtG!{{zL3U#L|%N&l;M zm%6DaW92w7&8YkBgLKeNW#9_i@wIG*@h|0rdY`Zz3%;*t0E50Tp@!@q@EP#3rEJgjgU^}1E~Jdjcdidm9kKYiD`)6`FC~uq!T#~w#NYqTxc(B81NaEb geW39AW8rn +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 12:47:23 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:26 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" +#include + +//hash function for an address, returns a size_t between 0 and size_t max +size_t ft_hash_address(const void *key) +{ + uintptr_t address; + + address = (uintptr_t)key; + return ((size_t)address >> 3); +} + +// Hash function for a t_list, returns a size_t between 0 and size_t max +//takes the function to hash a single element +size_t ft_hash_list(const t_list *list) +{ + return (ft_hash_address(list)); +} + +// Hash function for a t_hashmap, returns a size_t between 0 and size_t max +size_t ft_hash_hashmap(const t_hashmap *hashmap) +{ + return (ft_hash_address(hashmap)); +} + +// Hash function for a t_vector, returns a size_t between 0 and size_t max +size_t ft_hash_vector(const t_vector *vec) +{ + size_t i; + int c; + size_t index; + size_t hash; + char *str; + + hash = 5381; + index = vec->index; + str = vec->buffer; + i = 0; + while (i < index) + { + c = str[i++]; + hash = ((hash << 5) + hash) + c; + } + return (hash); +} diff --git a/libft/ft_hashmap/ft_hashmap_advanced_type_hash.o b/libft/ft_hashmap/ft_hashmap_advanced_type_hash.o new file mode 100644 index 0000000000000000000000000000000000000000..c489238e1751c63a2e82cfcd3f358e42418d852b GIT binary patch literal 5992 zcmbtYZ;Vt|6+idAd2g2)*xB7-*@cC&Yi+kudBXs0imVkZ(6^MeKsp7)WSE_KvomGp z%{uSR3dBU^Ph};h8|@!WO!;7p)mUQ`6F(Rz#X?CmYE#AdrLCydnAl>IW=e~2^ zytyoC6VI1-&hMUo_ug~wJMVpI>yB-j5WpnherQQ8DyLffCdqDsZV+J4%-QGvpl6RbXxO4o(Wq*ZzDmnJ`&)?WO^YZ3nuj}@)|LR`yoY4o6dG}xLFOaz~cI=J! z2`YvDlV=xaWRTYlTg=(wcXsmZBN<`OT(Zx0O^lY)k;? z9|gVZ{zM`H5VHg-Y#Mmx(@Qfc0K)*S9~pB!F&&l&>_(Q3r9QQEC;`xEKmd)U02Zu| z2=OE!mbeoD7Dil0Jpe4iAT1AFD?}!RS?o>hOYBJiBn{98Fp2K<#Pnb`EsNeeWtdb- z=v|3KFsa3hK<^q$p>SUUpf3pkOZvpfQhfAQa;#Uqy{!zq-?t=JM4Iqvg#vj%Imh@vn5Z|u>4B!-`9DuTFj9B~&8bI$C zH303aI7h6I0h!m3*(-hH8kvh*d6|8!yv!v*UN50e{{Y01k)BNf*@>p>H-`$K20wJ340t$d+JvP$}|4K*BbG zU#{{hA#BS$dV2}OLyPn{o)fr?k%V}!YY{%MY6XBuH@!x>;ufmSq61Q>RwmNb>U3>& zX07C9b)|!<3N>4W6k*er1>pI`itAft^zQk^qEoWUpg}}!{?gL{WO-R-yx3a)Lpdmk zK!lhM3+OQ6ttyOV@lA$iZa2Vu+E^CXkBl1HE(4xI-XAqIebIK5lJR9mV%*ToQ3LdG z%h2?7qxyJfuc_bn$3asc-)?l6`aSwEE)agLvlznHyB{* z<9o^7QKR3~@3oAMtAQUMHO^@QBCYqlgsn{suHBe#P{%c#hxD+=Y$u)Gaw_RzyV_2A z>%9@u-2l)ViOY4DC7hd3#`_58mX`5tgme9JUCI|F-kx&aE#fyA;_|IZ)JspsvDH9Y zLQllmC(^PAj(&ELd>cLS3`AEot>~X5`CbK|CV8`he}iP3o~r--5q`gtWV2Rnje+?NR7 z5y3HTmgGGV9Q8*?-XFnH{}jok2#)%%ko;H#M}55ek(v=4^*gCZ4@Yp+f0E?m5ghf8 zlm5vFj`|MC-&F9YNq%0zuhTl5QSf&N|D}Teo$!|x{NIHCQ^6l1`E3Q?O!Az9FCaNa z^W%NwI_OsL<)pt{!S5jaE(Ny;U$5XB2(KzQ*V9)N{3z+4RB+zESq0xm`rlD--mm8r z{2=L{QSd3kFDm!}!ukB+FsVr5?@Gq`e&BnIakl5rWXAb?{fYJ&!$tjrRdgnrlezrF zM8lZ|%g08ptqrsa^;!*kJVv=$Bui|pc!*j<7P$qq8csD&>J_(C2g|Mdj`iSYva3Bm zUpNRBHZ{_*SD9>6uU1@#0H>TQHS#rw16S(>j#SIvqI0o4zv1U6!14~)@cDn!Yjppq zbckMn{Bwhewl^gF{zWYME<_6ceXV`)!+hvo5O5XMYthCjb~$ z1{Dz=yM=uWFEIf4%?HHCUsd4;dW2@Fv6v!1xK7A&pE5wY8!0~5HPi3uPv5tcgjwY0 zM{Z$Xk)OH{{-I-HJAPt+!F-fv$zCN@_lJS~l(I~reOYn9^Jl`oV7~R^28{nd;rihn z%=Wx~*r%vDA +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/08 13:18:52 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:27 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" +#include + +// Comparison function for integers +int int_cmp(void *key1, void *key2) +{ + int a; + int b; + + a = *(int *)key1; + b = *(int *)key2; + if (a < b) + return (-1); + else if (a > b) + return (1); + else + return (0); +} + +// Comparison function for strings +int cmp_str(void *key1, void *key2) +{ + return (ft_strcmp((char *)key1, (char *)key2)); +} + +// Comparison function for unsigned chars +int cmp_uchar(void *key1, void *key2) +{ + unsigned char *c1; + unsigned char *c2; + + c1 = (unsigned char *)key1; + c2 = (unsigned char *)key2; + return (*c1 - *c2); +} + +// Comparison function for unsigned integers +int uint_cmp(void *key1, void *key2) +{ + unsigned int a; + unsigned int b; + + a = *(unsigned int *)key1; + b = *(unsigned int *)key2; + if (a < b) + return (-1); + else if (a > b) + return (1); + else + return (0); +} + +// Comparison function for size_t +int sizet_cmp(void *key1, void *key2) +{ + size_t a; + size_t b; + + a = *(size_t *)key1; + b = *(size_t *)key2; + if (a < b) + return (-1); + else if (a > b) + return (1); + else + return (0); +} diff --git a/libft/ft_hashmap/ft_hashmap_basic_cmp.o b/libft/ft_hashmap/ft_hashmap_basic_cmp.o new file mode 100644 index 0000000000000000000000000000000000000000..19492c40f562776721a293b8fd2918a2b46ca0ea GIT binary patch literal 4640 zcmbtXU5Hyn6h3or?oBq?O?I2w-EE~!(ROL2H_f_AYu8$r*0#22(Jt+S5|f*|o4ENi z_hxAeRw;r%txzAND2SlwgZQAJ)rUSTRL}?UQAI)YMJpnrRr;V1Ig@j8C(~UO{2nsr zd~@c^nVB>9OrF?x_#Q(DUHT<d-@8O-GFL?QtYSpx^tX7Y~2t^|PP2(;TXc420`%T0_QOy4yQU|V2}bt!ZZoq|w_ zO@T2QssqoS5h9mw*v}8a-n`M)n>YF7cH*(Yf zh{#37WK!@h_oEE}Miu}}D)0jYcsP5yom%q2~<+^0ra+wo&yam4TF!{c$mCUKO)(an!tu zQ_6fZ??w-Un*{xUu~h&J;hKB%4TSSesPj#z^GPL1>)L|ZnWS}Xm8shErtHO}>TOc> zCYA19OyNFhqaJujN-7 z^-ONk+3w`F<#x7Z@2xNwVb+44^*Ra3ZsLyA5{mA&0Q(iv682q5+)|%)B zX9c&`L`t^pt|#uoF^tCZPaDaC6{J!hc*f0IbFz-04#ffH*NM)(u8u=LNtp z0NhA@c&-TKwv)_|yg8?g4p%r?13;dhQl4n6ygWQSD%=llyReW%m0iI2 zJ-+*p0VrvHUMGD)<6j`XMXesEeDo;(-y^%{spWXSBmHHK|DNj-%)s3Qwcl| z`~R8vC2BcN&b!ZuXZuT}f35Kx=M|0TIIj`U{x^|6jD)feZxO$pc(&(!->unyMD~X? zp5r;L@f?q*@xPFtmd5`^{AuE`!F=QUaZa=6{d!5`Ii5E)p5u8}dDGak_+vR|GwF6eo$~1z`+WfFO*6xzcSxvUaizU zBD`{bu2rac96+_`TQgjn|>u;`s=GrnXIRoW^rKW$^kLudJ|tO?s%DAVb_g{CmgaIe)O8>oFm| zr1=N6PECb#E6jg|=I42Ee!Nop{HO8$9qu#$w54iKM;wpP=l@*)-Vv_Qh1@{{u)+U( H`uu+b+<%&* literal 0 HcmV?d00001 diff --git a/libft/ft_hashmap/ft_hashmap_basic_type_hash.c b/libft/ft_hashmap/ft_hashmap_basic_type_hash.c new file mode 100755 index 0000000..2f58485 --- /dev/null +++ b/libft/ft_hashmap/ft_hashmap_basic_type_hash.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap_basic_type_hash.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 12:34:20 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:29 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" + +// Integer hash function, returns a size_t between 0 and size_t max +size_t ft_hash_int(int value) +{ + return ((size_t)(value * 2654435761u)); +} + +// Unsigned integer hash function, returns a size_t between 0 and size_t max +size_t ft_hash_uint(unsigned int value) +{ + return ((size_t)(value * 2654435761u)); +} + +// Character hash function, returns a size_t between 0 and size_t max +size_t ft_hash_char(char value) +{ + return ((size_t)(value * 31)); +} + +// String hash function (DJB2), returns a size_t between 0 and size_t max +size_t ft_hash_string(const char *str) +{ + int c; + size_t hash; + + hash = 5381; + while (*str) + { + c = *str++; + hash = ((hash << 5) + hash) + c; + } + return (hash); +} + +// size_t hash function, returns a size_t between 0 and size_t max +size_t ft_hash_size_t(size_t value) +{ + value ^= value >> 33; + value *= 0xff51afd7ed558ccd; + value ^= value >> 33; + value *= 0xc4ceb9fe1a85ec53; + value ^= value >> 33; + return (value); +} diff --git a/libft/ft_hashmap/ft_hashmap_basic_type_hash.o b/libft/ft_hashmap/ft_hashmap_basic_type_hash.o new file mode 100644 index 0000000000000000000000000000000000000000..5747da27df6b7f220f472f7d2863dde66a9edd27 GIT binary patch literal 4240 zcmb_fU2GIp6h3#RGu^h>-FBs=Kw#VOBbd&%fDoYk8N@-56tJ-m>Snq-+iuvOW@ol3 zynqT(6iwrcn3$?D`k*mHAB-f%SZdM|qwpj~6JrdC7$MQ95n^J^nK@^6_Ck#helPc& z@1CFgbMCz}#~;|gM-c)T0=7d{t72k7Ro>}|J0S)Fax?EA-84C!jV?dwv9fNaFPW!j z&8hD-bIt5@cH+6{$&2o4^XVD!k+u+E!aRM!occjC#RW6^$&@KBM?Z{W@5zgmtJ9vz zbk^YD(dA&CzG+Tf>oj|Bn&-bbGjQX|xr1|N^xUkM1o>I>{Nd}T7XN+z%g<{0=^mQF z7HS0yu(*S$I`~ZtyvEvK)sV%R0w8mc=3~I&bqCCEH`v3K(GV*?{V2@uh$|#Nz7#)z9KP z0dDEu*bP*!3u4$)Uv)DCKEHB4`97*7Rnu3DWxWxvryWUByZ@WwMRR4KZZ zL^^L3hZAFV*~yiPiQaWakI~!RySd`^u7|9f8nK*_f;F0~im4&X$)!{7(NWv$HPVnA zDHZIbJ5tWs!^z#YbHpuq9tA6(FQt?D+)&nqe5p8`s1%*taM8{razz)M+%Y@la+VZQ zlqOXPE9nud9P~JDIaeI6s(y?yD_^kzooX_8o{n1voCY4n|2FTtY1PHCLm)3sZVOlAJQ81&6=Y3 z>Cfou;e^^fsDb{i*3uZ)BD$+S+^4G>CbgD*p0=+~S2wbzDf%`=KNoIZ(>1`pNVV z?~uNYS~<=>$^H!Ke2#ehmx<3vad@4|Qk=7-<2obcIL{N$coQ^}s~J`eHU)lIk*;&J`2lm1PJM|-?65Z_VDKF+Q(Pm&AWXan?vY&$CD3e*16P5*TqK-r@`>Lip2{IWl=dQgcOm?L z9tb{Z8C(yHkI7%g&qTZ+C6rW8mpQ~Z73GssVA&S`6=V)^i~M&z=WNK8F8fg24H?HRkc}#bf}mn*12-$8Bkz`45u64EAH-Jt_c3 zX}JQh|A~O{!SiRlH{beE{f(0$t{>j5?9c1>#ysQyn#LcK1}v%Y>OA>RP=3yX`SF)W o&i^8wpZ#;Vj5Sl`^TR-Ygq$DW6?yFt*XTec$N?Mt_K@@c1HxFWp#T5? literal 0 HcmV?d00001 diff --git a/libft/ft_hashmap/ft_hashmap_private.h b/libft/ft_hashmap/ft_hashmap_private.h new file mode 100755 index 0000000..d61db25 --- /dev/null +++ b/libft/ft_hashmap/ft_hashmap_private.h @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap_private.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 13:49:11 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:30 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_HASHMAP_PRIVATE_H +# define FT_HASHMAP_PRIVATE_H + +# include "../ft_hashmap.h" + +typedef struct s_hash_element +{ + void *key; + void *value; + size_t hash; +} t_hash_element; + +t_hash_element *ft_create_hash_element(void *key, void *value, size_t hash); +void ft_free_hash_element(t_hash_element *elem, t_hashmap *map); +int ft_add_hashmap_element( + size_t index, + t_hashmap *map, + t_hash_element *elem); +int ft_add_hashmap_element( + size_t index, + t_hashmap *map, + t_hash_element *elem); +void ft_copy_hashmap_table( + t_list **new_table, + t_list **old_table, + size_t new_size, + size_t old_size); +void ft_delete_hashmap_list_node( + t_list *curr, + t_list *prev, + size_t index, + t_hashmap *map); + +#endif \ No newline at end of file diff --git a/libft/ft_hashmap/ft_hashmap_utils.c b/libft/ft_hashmap/ft_hashmap_utils.c new file mode 100755 index 0000000..688e91c --- /dev/null +++ b/libft/ft_hashmap/ft_hashmap_utils.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 13:51:48 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:32 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" + +void ft_free_hash_element(t_hash_element *elem, t_hashmap *map) +{ + if (map->free_key) + map->free_key(elem->key); + if (map->free_value) + map->free_value(elem->value); + free(elem); +} + +// Helper function to create a new hash element +t_hash_element *ft_create_hash_element(void *key, void *value, size_t hash) +{ + t_hash_element *new_element; + + new_element = malloc(sizeof(t_hash_element)); + if (!new_element) + return (NULL); + new_element->key = key; + new_element->value = value; + new_element->hash = hash; + return (new_element); +} + +//returns 0 for allocation fail without allocating or freeing anything +int ft_add_hashmap_element(size_t index, t_hashmap *map, t_hash_element *elem) +{ + t_list *new_node; + + new_node = malloc(sizeof(t_list)); + if (!new_node) + return (0); + new_node->content = elem; + new_node->next = map->table[index]; + map->table[index] = new_node; + map->nb_elems++; + return (1); +} + +//returns 0 without doing anything if the allocation of the new table fails +//in that case the old table is still valid! +//returns 1 if the resize is a success +int ft_resize_hashmap(t_hashmap *map) +{ + size_t new_size; + t_list **new_table; + + new_size = map->hashmap_size * HASHMAP_RESIZE_FACTOR; + new_table = ft_calloc(new_size, sizeof(t_list *)); + if (!new_table) + return (0); + ft_copy_hashmap_table(new_table, map->table, new_size, map->hashmap_size); + free(map->table); + map->table = new_table; + map->hashmap_size = new_size; + return (1); +} diff --git a/libft/ft_hashmap/ft_hashmap_utils.o b/libft/ft_hashmap/ft_hashmap_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..c23f24974f4e234c4384f53747e3d6e84534862c GIT binary patch literal 6952 zcmb_heQX@n5udl~U0;0h`s}lla}$z-ggB*S&kiUGiR0!RlH4Uun#3^#fqXsNd-jq0 zFn8yW04gaVZ4XOnpj53?A<_?3w56qjRt>ZYpMri!ZPZEymrAr!D^XOWqEti`D5>V{ z%EGI_K=R)elRST1fWGaidTgkEJTz3Fj@+3XO=e#0d&w>5`M;U2e~A8(p#OD4 z_08#7D>d6Wm#QBKrRq&{=~KHR;yeyeAyneIlA6tgQsV6kA&jN|ju%rRU4J7zyD2@p zKa{G!k*fbmwxnkVWVx?Ckgku07U)0@764jE5ir7Pp9hVyl`3p1;4rHR&udtl+NYGnRKq zS>ZVjGuIj)Vr!OvlJajV1sq^?wda*#qU$_p-k3$ZxZa8yx)oWz!fF>CCV*xORJO;y zHrTCOTf$qzJ>8$~2G9-Amb*YY3eZ%4NWfPHW90W`^J49RI)%5&TxxQH4fn*c!Ejy2Jy zGbq~rBLD)`6cP(>#sexC>=aK8aY#&+i%z08RmnS(iCdlO(OOyB6|;pxc|1|bkL7AeF)r&+D3>PV zGo@;NvgAy}^Ch>fJbi-u$kei91qa5OG(hT# zldUQ6QRf64%NAxFz}TUhzt71a5!O6kcVJ#MSIcB4CcHqn2MV&{ND`U~z*Z<`r@@W4 z=7vbE88n5`nB=H}j2a`7iW}B=ahk%BBpz?cxi`@BgmYXXrSgO$6_?n#m!|1|TtZhm zsTB7e0&zSdRxE7}ofQCU0bnJy;jIIMRwQY~l2-hbenz_+waB0qf|~*0R>f}6wQD+~ ze_5NbVuR8$X~lQ24j}y=AV0i+kU!`*!?p|f{e=AFqeb!4b}j7qd4bpV(|9Kd@sZVv z1s(zcAp9L1+}E}ZiJ58zcWa_hI9A-yw^8cyWF*`Zk;s?E3o{cA1RT9nAOPe}x2Nz^ z;CGUluH=tpYmPmICe_-+gp;$U@Lu(8Tps|wZUFQ)VT4m*7`oYSgw2Et zbW325p_vH-LSHl@EptXQ8uuGfv)Aa_W_0c~#E_}qmDAVS2ACfjt-eX8*=xkM8Bw#} zXy0RWntP45y@ohv>icr~O=$g|(b4h+W3{=*u*_{n^RFZ^=tUY zsrf@gGy9EJ^A4kPn;{-E^%ow@>92#WnGnc^=F1YfJ|A42--2Hp?^D_!I(>*$(fyB5 zgXn-eZ@%atKM@UrX@|T{6lR# zuwQ<3@`L^TMff)o0X|il0pR1St{e{FRser|5nQHU_}!wT{GSQ%pgpf6Kh4=bN%o&5dyW$mb`(F2bK~zJ+)oN!oZ~x1?aa^V6DLL- ze}U{CQ|#ZS`V#>h`f|}pZ5c% zFeq%llQv^l07w4sQvF&gu|QKk_X)-R2C8of;5gp3jS@vb(#<6mjl7|Q}7SSzC*$J9IaAtJ});YIG>BH3jQAP4=VUNiu;g) zKSKB&3VxFCtb*?(yr|%Z2tT3V8NyF1_!QxfD)>EwKcV0c5Pn|4_Yxkbabq)?NJ%L; z-+O!?uszq$EB1Vj{GWOn`N5uW#%3ln*|D*Ta}4Z?Q^?viOgQZEa*?x(g;Ih=l8#($ zfdqv*sn#mku4EBzpKciWQmzbksa$jH-TOy2RBPGsqhRB66l17V^OFtcg?z~&z?sVA zD%qkVpKVb%d|J|->POpJOhlqJZC3#WBJsWGAOc_`C8 z$)eg~UByt|q@ega!=l=LX%YW9yo>?hFTumJfGxfk78-v<{vH9)OB0LZM^znvjyQYW z?mT&(3|~!?ZbM!5zaKAN0PnrS!hT%hyOs5ze2e^5QEh+e`cEs<1W%DazZY0| z{4Dqnh=t~FJMCY7*Wvty7nr}FEfW7(GzNgvO2A4Lo?WE>bJRcYQ|uqJ9FCvy@8ElO k=xQ0jyE3Kl`C~zU6t(}g!5=yU5~Gxg&jI>jKA`shU;bSD1^@s6 literal 0 HcmV?d00001 diff --git a/libft/ft_hashmap/ft_hashmap_utils_two.c b/libft/ft_hashmap/ft_hashmap_utils_two.c new file mode 100755 index 0000000..2a37c43 --- /dev/null +++ b/libft/ft_hashmap/ft_hashmap_utils_two.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hashmap_utils_two.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/07 16:04:36 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:31 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_hashmap_private.h" + +//doesn't allocate anything no error possible +void ft_copy_hashmap_table( +t_list **new_table, +t_list **old_table, +size_t new_size, +size_t old_size) +{ + t_list *curr; + t_list *next; + t_hash_element *elem; + size_t i; + size_t new_index; + + i = 0; + while (i < old_size) + { + curr = old_table[i]; + while (curr) + { + next = curr->next; + elem = (t_hash_element *)curr->content; + new_index = elem->hash % new_size; + curr->next = new_table[new_index]; + new_table[new_index] = curr; + curr = next; + } + i++; + } +} + +//helper function for delete_hashmap_element to delete the node once found +void ft_delete_hashmap_list_node( +t_list *curr, +t_list *prev, +size_t index, +t_hashmap *map) +{ + t_hash_element *elem; + + elem = (t_hash_element *)curr->content; + if (prev) + prev->next = curr->next; + else + map->table[index] = curr->next; + ft_free_hash_element(elem, map); + free(curr); + map->nb_elems--; +} + +//returns 0 without doing anything if the allocation of the new table fails +//or if the table is too little in that case the old table is still valid! +//returns 1 if the shrink is a success +int ft_shrink_hashmap(t_hashmap *map) +{ + size_t new_size; + t_list **new_table; + + if (map->hashmap_size == HASHMAP_MINIMUM_SIZE) + return (0); + new_size = map->hashmap_size / HASHMAP_SHRINK_FACTOR; + if (new_size < HASHMAP_MINIMUM_SIZE) + new_size = HASHMAP_MINIMUM_SIZE; + new_table = ft_calloc(new_size, sizeof(t_list *)); + if (!new_table) + return (0); + ft_copy_hashmap_table(new_table, map->table, new_size, map->hashmap_size); + free(map->table); + map->table = new_table; + map->hashmap_size = new_size; + return (1); +} diff --git a/libft/ft_hashmap/ft_hashmap_utils_two.o b/libft/ft_hashmap/ft_hashmap_utils_two.o new file mode 100644 index 0000000000000000000000000000000000000000..96077965d90ec8b9ddb12f728cddc6214b0545ff GIT binary patch literal 7512 zcmbtZeQ;b=6+idAyq8V3-E6XHKHAbQ@=;K_NlMW|Lupczz70v~SNbVkHpxq}X0sc2 zU)loNDk07+i&&je#1WAZX8eO09YJMqghHiI9BP4)&taUwVXQ_*5T`{^>YV$|dGF;W zb!0q$}R=MJpWT`XMTdIGh zuk?D~^c&7I$+Fg0-V?IQ>!VibsotumtSA2*pFGv}V#nEcXHFht4;?$UZBCX>TBQ%I z@^w~uL&%ywt zO3!0XpRvkaV3qs)g#1$`wdT0DxWD_Bm(waK%5S01?*vUqX+F})%U$e^?fk`Nx#=- zQvF_g)m~T4>9s|r^b)Y0S^@0WlL^vp@hJVQKI}o;JUR*Yy2GPvXZ22kD&T#w{XVw7 z?Gsu3`79zCp701q2obP_Rd#?QY&ma7o`ry|tYX=t2-ruOCto7%erg5ud%uw!rS^4d z1@yCeC+#QmIDV7ZGhVOFtoprD^rI&qkXGS2-ps1sYtE{KiCs@EmNx4LJx^Q=o-pNd zkFsMWsat%A)tw%+l~v#O4$mpcYGUv9d!))&M}|#h^#l zg~MThP(q-i^-XtoHn+t9stnMYP^mURYeXfynv?|rsyoz*=IfdP79!IHFq8=LeY2)? zn-FcWS^*Hf<2C_W(>FSs0BRG0eY8t2b%vZsY>`;e3{byFBx9&7@_E-a$HM>(2Kde! zR|kxydE!gPFv8{wWCV5QuJG>g&M?4Y-)l1Fjt^rxK!sedkX(TUymqtX9s!`W0DyiC z;i6IYY7%t@BDlYadhqo{A*qid-Vg;-FH%P>QHfe*i1&DxvvZjSP$l{=mCg1x4WJr% z?b6=5Q3D90y_J<4Ss7)e$jTuNz@JDrhOiU+>IvTcL2o%KzvZOUknD%)=S#C9&WnO+M0E{JWzHlsK zsh=<7f~e%2LC&%!Utb=Vx~2gb@ykHNn6;+`fPRW%sn{r2C0emTGI3QZy4+FT!w|Yd zpdnZLPyod07tFky4WW)VLqV=|De3)FW3eQ%U_2Lv)7>uUHHq=jWIQ29kGn#YHil4#5T9A`mwC4 zM9M9yT_3-wYAl_7Eh^kdZNWwQG6ywAZLzYc%v4OUxcan4zl-_>OU5_5B8z zdQZDyn)+vY%yy&7Y%z69cDg2kzjc4#&`f=8`;<{LWr*Ddgf2D0)d!6xbJ#F@^hXa5 z8_P}oIcPV`YmLaOM&${^G}{f(e|mV>xXjc~LA$ZeY&XKD-X|mF*#GwNVo!4H3ru}w zC?V&((A;g*Uu%eOYPhCUMRVm{+^FEab8~+I&~b6*5uMHms_5>!Wsd0HWp1|U{$}pU zW4M)imM?Fd2Y&!}*Fc>7>^wm@-#Fy+0{|DD$Ik}h^L;=*M*wgyg@A8TJaYW&oGT9o zaC|*7{`UZm4;bTL1f$ybzafZ<0D{8NZZl`N{?Nn8ZF&UU-R&bS96VCoIzbI>|W&B%YW8P30$CoV14b(FJ1+w|V%lHApxgX(zNsg22QGNso z-$3mckf5w<(2amBi?fg|1I+Wf`a3|hVq(%pCtTk1%H|FCdw<1+ep0S3VsRU zD-?V!;j0v!>+M4@d>8rIrr`WNV4s3>-DVV==jAB)DEU9E;9Ngt!jXn5@89<* z{CmmI0|6ZCGf(!90(h{V9}eKie~|271aRbYex3^8$bWw_9Y7bZ?dnXmgC`XR>=S#<3B+8998hg36E2q;`C^W zQuzJCIPZs_Q~11&_#Q{$csxlA*#na!sr0}Ap2`yiJDW~8c=JdM=EvpDW!|d_bt^iB zc@Frl7uRtnH=Kt=F7Mchjhp&c7M=9q7$orcn@SH26^faWS@disXA@wLriKgYae0H7 z=jMW!9US|=T|DS|LZM{y@}|P)=-?SSQFIDUdH@o|o5!*JzoimCAk625F66w=u+VaQ zg7+K5f@csE_kS-Sza0fdJ?r78x!^g7Wt50F5r8Jv5Pvt~?*(tu_^R;!8dsdF@uRI` zDF48s2k^d7vZ!4AH-L(v?2zA30P;$5RW5#@Rzj5WEY1H_N-UbFs`JOYAo}EcBg@mc zVF19h%7AQgi|57p`hSfMq$}7V3HRf6_&oD}gb%cea6gvsy8S1Ddj`s*)Sv%dz{2xq z!E@<+`TK$V +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/30 10:11:17 by alier #+# #+# */ +/* Updated: 2025/02/16 19:03:36 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include "libft.h" + +size_t i_drep_len(int n) +{ + size_t len; + + len = 0; + if (n < 0) + len++; + while (1) + { + len++; + n /= 10; + if (n == 0) + break ; + } + return (len); +} + +/* + * Reimplementation of libc atoi() but sets `errno` to `ERANGE` if an + * domain error is encountered (overflow, underflow) or `EINVAL` if + * no digits characters or invalid characters at end). + */ +int ft_atoie(const char *nptr) +{ + int n; + int mult; + + n = 0; + mult = -1; + while (ft_isspace(*nptr)) + nptr++; + if (*nptr == '+' || *nptr == '-') + { + if (*nptr == '-') + mult = 1; + nptr++; + } + if (!ft_isdigit(*nptr)) + errno = EINVAL; + while (ft_isdigit(*nptr)) + { + n = safe_int_sub(safe_int_mul(n, 10), *nptr - '0'); + nptr++; + } + if (*nptr != '\0') + errno = EINVAL; + return (safe_int_mul(n, mult)); +} + +unsigned int ft_max_uint(size_t len, unsigned int a[len]) +{ + size_t i; + unsigned int max; + + i = 0; + max = 0; + while (i < len) + { + if (a[i] > max) + max = a[i]; + i++; + } + return (max); +} diff --git a/libft/ft_int_utils.o b/libft/ft_int_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..3372703badb587550a48f652e3339d6670b75a64 GIT binary patch literal 6264 zcmbtYeQX@X6@Rnq**kya#$N=dREb(e)GdhMkOJknoNt^H=Ua2P z7eY#tC|3s#N}8%Aty+~xNd1q}uRo{|waz4jgoFYWB?*Q)38+eNsR^d31BI>L?wh;4 zO;1JYPqJs;Z{El3o7tJSw{_LPjT&R1z~DNlNEOVrRr)KP?n-C{2F1CFQwwESEc~8B z?ur&lESh*FnmRWurHmFoj!wLHeRRUUgdHhN)ECaR-v9RAin`o2*t2#`wD^fs4#fD1 zQ|KvL*vrOB`41ks!S24&3U)6RV~+wri_(^ouu zXV2Z=K20;Ud&X_swmoxr==A-zZF}NH$81YP3wAKq6e&dxo_>n~L`r+3#dFcZiMi-w zJ#+oVQvbv$y&n@dRubPk%m4<8rD);!XVHHhm13q8`Lpa3CdZ&s%p9zE7YjiO^OWon zGpA;S*}i*Lm=Er5o)zZM?#@|Z-nDy)6y}FG{(%(opHfV|A;r`OQcQm+g*kx(B`M4! z*m+e7`KlC?A4@UyniSJVq%i-40|%rq_mQfckYe(<6jS@9nBFIac@hVXOJN=&Re4y7 z$zxJXy(Go-p=jax=4hd$iLo`dZTFllG3$0U)4O&zOJQE>K9+e}ikZJlVa`f1^ASz< zuTo5%kz#sQ3iE&zGl!*^IVpuaA;skDQcN9}V)~>rJDjR8FCbsXq?mbA3iCMWzaz!u zJ}IV7NHKj}iqU=lkitY~FG*oyir6>la z#>pbK`TiVy$!&napz2;pR2|H+!97Y^T2Z9ld2n_P0BEpekLp*mDV1L?nZ|m3QUR(NjXj|J`NB1m*vi zBuZ(Py1XhDD5^$P%W4%&q-)!znCx3o&+#qA6t zZ7mGIC~jxW?FJs%&Oqzi8(SV=gW5&_KI$2$vJd)9 zv@M`)ykVdoBWr7MG7Y`xtkIcDozoc19lpRB#($(AFB4w&9v@rI?L}HSx4rK%fF|Y~ zDXbS$*~D(ckgWHUs&w_?n7f8Jx(e-J-aGWXdf1s@Am}!Ap|cD?-~)sl#liLYjFs<9 zq~n?4&W*`zE@fsqBUgo&gd>Y1%ks|X)gY}{Dr3d+Rw|tfC!lMCIg;$MHe^%D;jX@9 z?q16r?UGh(B%V&2iLP{Ny|f&gTy8X;NJ1)OL1IHZ>vBV>;gkirxJ)`uNAl^4kjt-! zRBR}l9F3)u8AzL%;m&*}mm1C_hdR+sF10xsbDYO5GnGV-Bk@hKJdRZh!+j1tq2}ID zM^C7;P`6Xxp=nQtI(kFRJ)z*LP$#%P?je0#bHqkx8B-XMu}?ztu)#%S04xk$`CJwg z+m%jl99bN>%IQ0+*5$5NS1OZ8=ZBKuUn~G{79_j@UFEEyp`;9NaQ9q&dFSaZj2jK} z&vO2CULPFh0Yh@lh;Y#B5AgPeIbLsc^MLU!uJv;0(#xNS_(REzYuMP8d<8S&)M-Pp+k-{AGDxn`{6O~%dKFuKdO z4aTsc_q@Sd4gH!Yc);l9VCeIL+j(O{2iJ^l{h6)X4gD2(O5fbc16qH(u`4KfouO@Q z=YimI<0-Bg+CVc8XggRtZ^CJZd7W_`Z@dxBjirYE+pV3v&d^_mCo}<`()+&x@2omF zQ!W-1<~wg#`NgY(UU{XfpqDFwYUp5869nBoM$Ur{q4T)4w6Fa5BLK95RxT=>{RseF zHT3t_;J-kA)J3ZH?J)5Q>Yd2e@H1V5cMdlv*Y4T+Z!GL>+jc)|+#?P@92EZ;1;iBy zdibAvc(48+JUnJk`FX*^3lIOghxht9>EXR`&w6;TfA?ZNfByH<35~BH{;B!&(mUzr zch=z5&cQjV+7h9za^#f`qSg5iW&Sdf@uLla`T^=AaNQBg&sRxSMKL}``7Q@27s-Bp z8QCd6KO(u$!+YPRsE5b-A0t^+wCD%*2Z(n{63;v*iBC|g=A(-1`-oTbd4}W%Jv{m^ zkc=M*2&F$oGJX^z)O-~G0}qe$f0yK+d3f}HJ?(=hJiPaLe?`2S|2mSN_3;mr{GyLn zm9W~+%FlD8_r6d6AjzsgSNcbZ572xSukikx`dS8Zo`YLZ5 ziN`QrKM)>DuFnt0;_KIElN%wNO{U{vE4j%j-pVywIAM;ABr{Ylx}_l*=BzAPxsFm9 zX+kWP%w{uYENv#@R?5tHtHr94GMq83WO(&A2N&n8c;a3NW8oBw4-I8=so^TW=~O03 zL~=t+X5%AHSy`?xRTWFqNSg_NiB%4a40BI>#pDvo%$9z+*@9#^;RF#3Rw4gfp;bDS3iRDT;^H|*g|^@ z?@B}mwRkV0in@;!w$Uc?$5XOuUvq2Y^RSETFQNNV!TwA3n`va6Zg$uJqO^ zert{A-%a*@sJIHhckM@gX@Z}U{isqTsOMLBx<>vs(S}m>1LhBFA!V=j-;*`wAH<6a z05=WS^HR6{jzKVnKaY_C0u|CiTY?FR_EJMA&3TTh;$4A1SJH*4zmp;HYGQb97 H`{VxyIh%lJ literal 0 HcmV?d00001 diff --git a/libft/ft_isalnum.c b/libft/ft_isalnum.c new file mode 100755 index 0000000..f3c9bec --- /dev/null +++ b/libft/ft_isalnum.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 12:44:53 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:40 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalnum(int c) +{ + if (ft_isalpha(c) | ft_isdigit(c)) + return (1); + return (0); +} diff --git a/libft/ft_isalnum.o b/libft/ft_isalnum.o new file mode 100644 index 0000000000000000000000000000000000000000..b3d2091d4d9a5ae7f0661e492091357415c74900 GIT binary patch literal 2776 zcmbtW--{bn6#i}|lg&2mY<9D@St}B;T0uH#?2A=dcT3e)RuN0kB1@QLC&|!BW=SUN zR+LIBLIg$8qE9M5_~L^Pz7%{Cf1oeof8c8$l|EKjIWy-ZHXVj_uws?E#<`2VPFWmSk z``Y%8A~d<9P?hcjBkGcLA7m@>S6&%53eg#DJ(0%eDAtKs`$~lB9O7wSoYK!2^UO|AbSFa zwVuo60DJ`?9ql3;9nWFe(FADoDPhP^uaKpd-UndFKy0Sp6dQo4s>U5vMf#ITGSvqV z9erw*)>xn)WFtvB=I-Iqd3F5oLiR%ioB(hik434lY2`Pq;-*!)VZ58#re1#2%Hnc#9~D|b zsk_z@YUpAVplry7;}8KvVc6|BwHHTMWGpE&bLg^pG!vSup{X*jrxu}A!!$mR{Qi9~ zJwg{eT6h8mXHF8vs3ay~#1}jT14pK~=K-u}ex-cA2aundjc9xpFXc@+PU-c}L5w9{ zgZM>_m-&ZAbrD1Af_SNN!U~TI|1jG}HD1;v+^g}l&Kb7v=a%kTKkY~7@Mjb2^w>VH z@uR{7a6#kA?^|p~bsXncAr-(tJOEyb$GyUx7$ z9l_pl>w{L!sn>h%9_*g$J9g;qhp-z#r{hjmFHi1=J)Rkhy>2tmN(gp02wnTR7ptfG zq0_hm+xPc6HD_n1*Y{czO5f|cOt|e@v*&bNapDIJZB4rYyC3#Krw+S+wL>jGOZ3S6 ze|)1qxElW8r2IwW2y~7*=zSti&q+f3?ThP3N3y1_mPI82AS#VW^jO1L(uOvr!gvqZ($Vkqmx| +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/06 12:44:45 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:42 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isalpha(int c) +{ + if (c < 65 || c > 122 || (c > 90 && c < 97)) + return (0); + else + return (1); +} + +int ft_isspace(char c) +{ + return (c == ' ' || c == '\f' || c == '\n' || c == '\r' + || c == '\t' || c == '\v'); +} + +int ft_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + return (c + ('a' - 'A')); + return (c); +} + +int ft_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + return (c - ('a' - 'A')); + return (c); +} diff --git a/libft/ft_isalpha.o b/libft/ft_isalpha.o new file mode 100644 index 0000000000000000000000000000000000000000..ed31452d425639e76d99dff383ae908563837d8a GIT binary patch literal 3072 zcmbtWPly|36n|ePldhX4v)y#vf8s`|7L`smR>W3pgRbrtsueNRLm^IPC!3*@Oq`i) zxBj7v>p_KBQL%U`SUn1QDQls0mpxRA(1M3vJ$V-|6%Ua&^IkIf+<@SZ!1ul1_x^l& z^WK}e@Z!mr5<&n&z%l4cF^u&0rEptfbsP@^`#?5axx~g_*JHM@6-QLmW zK8Uo|yZLi7o9MEnUA?_@4W5QDz>;?5mM?aSTc!1GTKi&ar>4y<0CY~>=q%Wk_DP_oC;=`;ZR3ING4#z>emzRVyR z0FYn`?^OxzX&BoP2VOO<><7%M*D!NpY z;gS+iuC|*&J8wEhb0xoOdA{v7^Tj9idA)e3c%&Vk9)?;_v3WRjZ@&g&ZA{GW-81s302l*+2k4Az1-W_RFx?2`7HE&TMIiSE?U`E(AN>K$z7T(B zGq_+42>cDCCd7Tc2c~3%nin`{vyw@MyU5-HM*TVpmeiaTtq2iXIz#f?jq3qHC+W;^gi_5wH zg!nvp;`~2G{Hw%szMmrgO^HvDJlbo;2;7RuhjmRDrtz`tOl^UE?=02W(tP=$DtjGCep8xL|NuTdu zB%br!gT8E4+bb2LTJ@||&;x5N0Nr#O4XYXOp&!s3``1X*JXn*jG{U)Q(+DM}j%yB%AKeeUz^H=mpKsvW zpH02L^ndV!RJV+I8WF!RLBM>*p+z%upyv?LHwJ_+&p2=v$MF@}%lM86?mLDYA7z +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:10:04 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:43 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isascii(int c) +{ + if (c >= 0 && c < 128) + return (1); + return (0); +} diff --git a/libft/ft_isascii.o b/libft/ft_isascii.o new file mode 100644 index 0000000000000000000000000000000000000000..58f2fb9ee2099806daffa4a3d09876b9ce4c2bb5 GIT binary patch literal 2080 zcmbtV-)j>=5T4C7wQZWDZT!(%kvvq3NH>jrYK2;)Rx3rYP=7qd%k`2Rz1)?%O=$(O z;y+MC(8oUZP5*>~e~+MVf)ACs%p{xDpx{SfcfQ@3Z)bLH^ZMS#T1p6D2v~-$)y0c} z?tCSgu0S3HluzHB9Rfi9-RT!GF0SPYX)8B&X*xG9CI$ggQs87|^26OJE4P%notd3l zFWi{|u+os4Y*Xt6fPopXa?6=a1^~7Ipe;9)9A&gCtpV8-+h~ZVXo>7&0I&oGA)_5E zJpfzPR-jr%$G3xeanFrnFAR$1TXJ5O=gNz%WOV^*s^Z0V?0BAZpwtMPZb>yF&#jkM z-FQcZyQP|{G;QAxos#cWYfAF~FHqpXKPmyhdCEY%+yt>dCZz#<9!^_)DxaHm36R;05dg|zsT5};kUfwxKg?`H;`!0Oh!2Nqa8Hp7BJ zp7y{3yyadz1b_)GKIhC4M(|QK7hXqRYfYG-Jtt^lyhC=8M%2`G%fy@K0lDo~TlI=vtw!!1NagM;kWScax`E=w zSVbTs*SBf27t}(KL8x4L|IyZ5tZZjTYaWokzt^nT+uKp>)q6aBFK~%)8&y5As|Ax`ujALq!Z$#v1-w@f8G-4lP%z1Vse5KK2g24JbUg+chgf`5w zV;}#eKKZ|50Rtv|(DvWezXil0Z8Y=Z{28iG{f?-AxK3EVVStW5^Nl{||4jOSyMO$y y_4kQ!@&|o<75V(EkAGv<##x9dvoC`CpMmE`nDzT;yd#VswDE)pH1Vx9^?w1bADzzt literal 0 HcmV?d00001 diff --git a/libft/ft_isdigit.c b/libft/ft_isdigit.c new file mode 100755 index 0000000..e47bbd5 --- /dev/null +++ b/libft/ft_isdigit.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/08 12:57:11 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:45 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isdigit(int c) +{ + if (c < '0' || c > '9') + return (0); + return (1); +} diff --git a/libft/ft_isdigit.o b/libft/ft_isdigit.o new file mode 100644 index 0000000000000000000000000000000000000000..620afc92f4481329223cd397a87c79d589abee92 GIT binary patch literal 2264 zcmb`IF>ljA6vyAiNn4sWO&g#sMW{oeMW{|gSqf6APzzM57=Q>QhRAW8#HwRg_N8iB zK&n^~urM$%Ffy<*R$^d6V&o$*f>@9kik|(RV;_oO;HM~e@9%r}?w;SBA8l-1&jW21O8X@bPoy@Ze~8?8V^+9-&c3K$W{ABxT`;sJ`Zbj2IVZ3#FV^ zC{E54#>K<{Kt>nXS(|!!ZCWc_&R@yTPj8m4P6KE;$V^7kW(goW2U=k@pU(rpJphQ- zITY@JqozSM!x9<-{XmS~0f^U5W;9(c3)OnpmEBp>G2GVduH^@|=gw9x>PvcMv9i() zpDsgF*6g5Rw`{4KP;Pr2t1R2TZMDklRwTX4$dpO_}fj+m&F#KSnxE z8xRj~gV-yInUTSvX97a~G(Aghe?3gi9PU$yUxiU@Fh>G^sbz;8ixZ@cidbvOOz1o(aw?(YJj-O`dJxQcoLd065Xpb&E2MMW`()#LL{R6$h1?APBOT+m z$iA!SCfT#p;#!jHsgSO&6ZD2v@3v}2z3yAPpi65{f^K@9j^(DRn8pRt2i>Z9uR}CoirVuOe~BH51qx)dKyZ9+PxSGB zP6OuIv5)^opZ&k*01B$SANlVj&lbY|>b`jYjO>%YpLFOsPgrMo7qCC;?LO=ON(=ql z`^S4C@yU-VlE`r|KHi;b{3@QGts@Tr9>>lA@%drUA5ru7M!A=mB}(Wa3FwDk1vUO} DGdrb& literal 0 HcmV?d00001 diff --git a/libft/ft_isprint.c b/libft/ft_isprint.c new file mode 100755 index 0000000..383b8c1 --- /dev/null +++ b/libft/ft_isprint.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:14:35 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:47 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_isprint(int c) +{ + if (c < 32 || c > 126) + return (0); + return (1); +} diff --git a/libft/ft_isprint.o b/libft/ft_isprint.o new file mode 100644 index 0000000000000000000000000000000000000000..701285bda7a4518cd0d5a93d5bbe8ce9dee60618 GIT binary patch literal 2264 zcmb`IF>KR76o%i$2`x>NrVY@RB9x)fB2=fLECs1ls0Auj3_t`DL*%$lV%4!L`%<+m zAXTggSQr=>7#Ua@D={#!Gcq!QSdbWsp8cL1*xq;HWY7^6(?i(5NGz&fQUxvhY*X-|$36jEi%{a!xCj zCTEJ{V&WJ;MidCn!R?zXf}Oo7j$XurHWTKy>8cXCC>|_54vwT2HDwe%LCo@ zq@~}yU0(>KVQz!&IJ@13v9;v~b~`oQv0aMXh*(7(NZ zyeAT${FoAn><9hh-KqMoe9|r9aHGglFdx=@3gdUQBcKB6L{r>^N Cf~Iu< literal 0 HcmV?d00001 diff --git a/libft/ft_itoa.c b/libft/ft_itoa.c new file mode 100755 index 0000000..7ec2d70 --- /dev/null +++ b/libft/ft_itoa.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 15:29:15 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:49 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void ft_swap(char *a, char *b) +{ + char c; + + c = *a; + *a = *b; + *b = c; +} + +static void ft_reverse_buff(char buff[11], size_t(len)) +{ + size_t index; + + if (buff[0] == '-') + { + index = 1; + while ((len / 2) >= index) + { + ft_swap(&buff[index], &buff[len - index]); + index++; + } + } + else + { + index = 0; + while (((len - 1) / 2) >= index) + { + ft_swap(&buff[index], &buff[len - index - 1]); + index++; + } + } +} + +static char *subfunction(char *ret, char buff[11], size_t buff_len) +{ + ft_reverse_buff(buff, buff_len); + ft_memcpy(ret, (const void *)buff, buff_len); + ret[buff_len] = '\0'; + return (ret); +} + +//only works if an int is 32 bits, I'll maybe change it later for the bonuses +char *ft_itoa(int n) +{ + char *ret; + char buff[11]; + size_t buff_len; + + if (n <= -2147483648) + return (ft_strdup("-2147483648")); + if (n == 0) + return (ft_strdup("0")); + buff_len = 0; + if (n < 0) + { + buff[0] = '-'; + buff_len++; + n *= -1; + } + while (n > 0) + { + buff[buff_len++] = (n % 10) + '0'; + n /= 10; + } + ret = malloc(sizeof(char) * (buff_len) + 1); + if (!ret) + return (NULL); + return (subfunction(ret, buff, buff_len)); +} diff --git a/libft/ft_itoa.o b/libft/ft_itoa.o new file mode 100644 index 0000000000000000000000000000000000000000..ac4552be1cb9c580c917ed875079157745fb464d GIT binary patch literal 6496 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/11 11:50:53 by thrieg #+# #+# */ +/* Updated: 2025/11/17 17:14:48 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include "ft_vector.h" + +static int ft_is_sign(char c) +{ + if (c == '-' || c == '+') + return (1); + else + return (0); +} + +//converts nbr into a known to be valid base, then append it to vec +//returns 0 if the concatenation fails, or 1 if everything goes well +static int ft_put_ok_base( +unsigned int nbr, +char *base, +size_t base_lenght, +t_vector *vec) +{ + char buffer[32]; + int i; + + i = 31; + if (nbr == 0) + if (!ft_vector_pushback(vec, base[0])) + return (0); + while (nbr > 0) + { + buffer[i] = base[nbr % base_lenght]; + nbr /= base_lenght; + i--; + } + if (!ft_vector_concat(vec, (buffer + i + 1), (31 - i))) + return (0); + return (1); +} + +//converts nbr into an unsigned int, +//append a minus sign in vec if nbr is negative +//sets flag_pushback_failed to 1 if ft_vector_pushback returns NULL +static unsigned int ft_transform_int_to_unsigned( +int nbr, +t_vector *vec, +int *flag_pushback_failed) +{ + if (nbr < 0) + { + if (!ft_vector_pushback(vec, '-')) + *flag_pushback_failed = 1; + if (nbr == -2147483648) + return (2147483648); + else + return ((unsigned int) -nbr); + } + else + return ((unsigned int) nbr); +} + +//returns 1 if the base is valid, and 0 if it's not +static int ft_is_ok_base(char *base) +{ + char used_characters[128]; + size_t i; + + i = 0; + ft_bzero(used_characters, 128); + while (base[i] != '\0') + { + if (used_characters[(int) base[i]] == 0) + used_characters[(int) base[i]]++; + else + return (0); + if (ft_is_sign(base[i])) + return (0); + i++; + } + if (i < 2) + return (0); + return (1); +} + +//returns a standard C string of nbr converted in the "base" base +//base have to only cointain ascii characters +//returns NULL if the base is invalid or if an allocation failed +char *ft_itoa_base(int nbr, char *base) +{ + unsigned int unsigned_nbr; + t_vector *ret; + char *ret_str; + int flag; + + ret = ft_create_vector(2); + if (!ret) + return (NULL); + flag = 0; + if (!ft_is_ok_base(base)) + return (ft_free_vector(&ret), NULL); + unsigned_nbr = ft_transform_int_to_unsigned(nbr, ret, &flag); + if (flag) + return (ft_free_vector(&ret), NULL); + if (!ft_put_ok_base(unsigned_nbr, base, ft_strlen(base), ret)) + return (ft_free_vector(&ret), NULL); + ret_str = ft_vtoc(ret); + ft_free_vector(&ret); + if (!ret_str) + return (NULL); + return (ret_str); +} diff --git a/libft/ft_itoa_base.o b/libft/ft_itoa_base.o new file mode 100644 index 0000000000000000000000000000000000000000..4b3cb9414f07154adc0ee03a828f3ed0687e0f68 GIT binary patch literal 7296 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/30 10:11:17 by alier #+# #+# */ +/* Updated: 2025/02/16 19:03:51 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "libft.h" + +/* + * Reimplementation of libc atol() but sets `errno` to `ERANGE` if an + * domain error is encountered (overflow, underflow) or `EINVAL` if + * no digits characters or invalid characters at end). + */ +long ft_atole(const char *nptr) +{ + long n; + long mult; + + n = 0; + mult = -1; + while (ft_isspace(*nptr)) + nptr++; + if (*nptr == '+' || *nptr == '-') + { + if (*nptr == '-') + mult = 1; + nptr++; + } + if (!ft_isdigit(*nptr)) + errno = EINVAL; + while (ft_isdigit(*nptr)) + { + n = safe_long_sub(safe_long_mul(n, 10), *nptr - '0'); + nptr++; + } + if (*nptr != '\0') + errno = EINVAL; + return (safe_long_mul(n, mult)); +} diff --git a/libft/ft_long_utils.o b/libft/ft_long_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..6ec619b52041a4aa2e0205e616ea20f6b33ab4e9 GIT binary patch literal 4216 zcmb_fU2IfE6h5=Jb9cAf?)Fz&FcL16}z~HXIo!f^?HzIdD<*<>3{$H>& zJolxTKVQ6h;z2vQ$_hlgBl9l;K<_uv?#N3QMo+E{j?7)OPiT>a>yG~X`C`cFEW#}S zuA9xh_WXIPKWVW4g?a!OE!pKDk%cwGa~CfUmlhp)q_h}WI4UqUJH2$gA1tru(ULt{ z`fJbNzQNcPny5Xpc+s|PyE2!^{88JsuN<&#+gTL=1gIlmjJs!DYWoH1epR8qrS4A^ zih3^C(FS5PXg+p^g-?kTu#dg7OGl4|ivNACV*>k6lB_{9oMGWjA_c_QKf7}D*a<^4 zi@U?EQVTaNSsHE@EjobD5ZD>$cx9+l3$G9LhgNouv~KJK&?NYll&O(cfV#C+qAbk{ z=xuEl0D5Uwh;r9|Vpf2!{b1mM%O^niluYesaVlUr3*#^dZu$3v&Wjwr_8CIO=jVMm7D2FTCq$#oz5kC(y580 zg+{4DVJ4n1A(gctF&)pBxyjU2%7Q{XX_mcaifKUiU8q)}3&jc4k6XF43E3Gd51C@x zf-L;UNh8{vFMv4mD2PK%Vrhdv@PYui4*+hXG3UArg`0-L9fRSnxw_}IQ$F8E;SPri zYz}t;I9Ij~)}kjNZiE}L!Oa%{!hoCh2LPNsFs92{IOrZutzF2r`s*^NN2OnXO!`Ko zJ}O)FsBF~FNxyE%7X4}I*Tp#d<`q#2|tMqS` zZTdUXzfA_WNS{6~8}vt{u18(ldVNaQwqKJiy0-jX>DQya7Vs1b1s4Ht#P4pp^g^p# zu_|blJ5&V?WR=X&+=NyQ4H~Nn0N4ruO*gRsZvjAyXFiLJG{UAQ>M62;|u(;#TKd=F!gsB;QUg-ZA&?0Klpm zd>`=~m&+diF37ue0N*u={@WyTZD;+x#5?80Gtc*kpP-iY&ymd4ndkE%@kMHRT^%IP zDm>5cl)}eIeqG_8Ao&x8KS}Zz3jYSlmlU3#5YC&boZp=N|Bm$jpqAI=o?~2)XMcG8 zA%%aO>{}E*NBlB{KSF$;!aqy=fWn_99&uE>0BairE*zMLBl#{WOJ5j zY&0&{ah|EpCaeY35fE46L9l7L#+i7B`-0iG3f!o zRU*(1e{X(D^S%3w;;XomCK^;GtcZ@Ra)^8BaJ{cMR(0`Tg32L&B>Vl!pdvbX&zqMS z +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 12:41:51 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:52 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or new is NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_lstadd_back(t_list **lst, t_list *new) +{ + if (!lst || !new) + return ; + if (*lst == NULL) + *lst = new; + else + ft_lstlast(*lst)->next = new; +} diff --git a/libft/ft_lstadd_back_bonus.o b/libft/ft_lstadd_back_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..20a117a0c6f2e2da4fad076ed97296694174c4da GIT binary patch literal 2960 zcmb_e-)kII6#ni^W_OcqHb1tuO)46Nnj&`6=u3aZnyP6xB}lLhLVZ|fHY_%sHFMH48rY!S221yXV|< z?wND$%zJYS7c8Y9P&kKOX%~z6-T7=Xoy7|{p^wX8CN0rS#^?2oOzOwn99;$3@ z|4K@gt?kOjcA>KM9#KHfRiZdw zo=KGR4oImmlnni4WtWOY+6x#Mgk731lW?jC6c1s(oSFmp20&jDX(37S0W<0Z&jPS) zSt3cjL6RCxZIkI2-K`SwO8`zFHiR7gSqtw1$kQJRw}CW?!`3SU#3YX9kjzQNx==uY zb}D=gph)@z>mrtFoltis>VX%oPOSUwxEX~L)6csn-RTq4r#s2&3s}+BAlBaUa<%5w z*Q&KB?8I&zQ;n$QPw7Ux>90<`>c?w3x;C|DBT!m!zBIgHHA)56 zzm=r>Eah6Mze^#aPso^PKu<8fuu&e)em$#hiW$)?P#(~s!#kgEFa47 zvL}J!A;>;2vit;(^o+CFd#(q6hI!fNeU{H>_-;!Bn9J}K=RKAeGd$^^X8B5nC;d-Y zuJb5yO580&zsB;0!QW*0uEC4_eS`0?{LtV(VtIl`%2_sV73L+*F5G3m)>*B3wOZR> zhuii8&(+lU>1C2!2yQ)Uwdh7*%+x|f<8>$di4aO1aIH2zQcmR?c&>~)Ka_9tVF z@|gwQZ^UJ5oRGe=`EJX=>_vJ-X8TNVhsh&MkR3f=xese=cgQ-=Xcrv$*dCqliUpE*Nym>kv@fJ zZrcCI_LIiGVkhIJ9_Rlp+l(2Ao#4aN{+g-&I}@iwks;?7-06|OMJ`CG6UrZb5sAI< z@AQcOI5))y;)r3!f4ztQ#y +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 12:04:47 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:53 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or new are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_lstadd_front(t_list **lst, t_list *new) +{ + if (!new || !lst) + return ; + new->next = *lst; + *lst = new; +} diff --git a/libft/ft_lstadd_front_bonus.o b/libft/ft_lstadd_front_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..d802309b33ae1e3ae0cfc50def53f2079e61a2fa GIT binary patch literal 2392 zcmbtV&u<%55dNOmYrAo}No`sZijXg*2h?=~2l|_+(A0qnDnx`-A+6T-`iHXKjdq{Y zlmq2JC8}NuNR%T-jvP56A@2McT;aflL(uHb*qhf_Lh5(edGo!QH}mGrd;9R#ovo5m z5GdThT$|$udp_RGhMQP{Lg&$;Ugaqj(au^(Yw!!}fbYx~t>8_CR|RKMdnuI~;ch+H^*k zYV_hr2a!e;9B8CoI8HTmE~4N*{%2Z@msqOLKZZJ3RcDv0wWkUh|0>T>Ed|5uD6Uam zmHO8?NrKKq0m_A$?`*RGvJJVTy!%ef4$5jMyS{YYcJ}S%$~C)M`M_4!OA3XaJq}-I zdHi*F+?+LUgCnqD9nl3AvJ-y}7V6J&REtJoeW{JCutY6Z@RC*~K5yY14VJ>c&ia`G zU$~NZrNGlVH&}m-C7r>nrU2epz+Yxw;`Ug-Y49oQ9~u0&td9-;3F~_X{}t;827jM* znU{PXGT&lJdn)d0n|X7;aQi`bI`sT*HwpIPYPuZ8)q~rMClk6lY@F%@ZW4q(>*Ht; z!;NAcxVJytxsYnVw+lB6_a~m;?4OQ$ z7sZc8p9%itCi__kM)qzNK<_GX(zk;A?Z>RI1*E`;z?&9xSNeFI-fq6V>koF!L9FvLOGv9Di2=G0gl&3*!HA uOniEUC4Y&Z{mSng(tr3%i9wM57f}8LGyYG;yCV3N^QU +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 13:00:50 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:54 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or del are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_lstclear(t_list **lst, void (*del)(void *)) +{ + t_list *next; + + if (!lst || !del) + return ; + while (*lst) + { + next = (*lst)->next; + del((*lst)->content); + free(*lst); + *lst = next; + } +} diff --git a/libft/ft_lstclear_bonus.o b/libft/ft_lstclear_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..33a483d560c9e67e460b38589e4a78a9e5062680 GIT binary patch literal 3040 zcmb_eO>7%g5dNMwyK&-VlQ?baP-rb72m-oE072UX5{IU>)e0m^C@4}b+gT@W*6Yf< z4xs`SwTe)PXpxXWy&+Cq_&LCV0|&&VM@|Td3n$bomx2V6(X8LBU!EL^1K;Jn`F3XB z%zHCqUthj(HX#HU0xzH|b@6F`cfS~I7cmBb+@;)W7xO#qaHg<(KfiN7e5|nB&hH)1 z@BA7*G;$pIy}A6}YBJaUxv;lzj|>aD^s)8(YVLBb_#=BgEH?rxygeOLMb^?W9IL#_ z+pg7RU3*FrU6qTviWn1**yE;Qj~+Q{kBPJeBpgAT#mpy5lZJgdHJ6&2T$lt56Nw`o zqA(8hJ+n_VcW(%Mw3HbWfHeZr=$}Agykh_)$Aw|1QsfR87=~dN#z{Dt0tQC_qz;Rz zNnpr~Z1FvSz9`yc^gKg)I_aNSsU3ZZz@Y0IgrrnahawU(x<-5`z{gTi;P0L!5aHCms*Qd|8!DiUFI$aHm z^^)f`D$`!ATn$x2ctMCt!w+3Qgzs*L2#Q`U2oZLcHP`#E;Q)uC-~n;%6^QLoadfCZ z`Jn)w1n{8z7WKoDJ-TFPa(4D+-!0>IV$04%OmtNM-ixmJBzY3zZ+n;)dPo5X2Wt3n z-TOw1csUN;9UBQtL%ta)?9+A-5}rg7d(K5rV< zyqUD#FcZ(2qL{Ft^m;GciQ@dD-Rqmtt*w19WM%3wVCqx^1AHs{VZ{C1#V%D^SB&8R zNGtJlW)dQvK)pgE>z{T9mb4sH%N>aOhy z2jGbV_*0r69(|l2#Tj=mfHRu@rj%b+c+!7X$~^Hn-}fcY9nbzf$(I#Bl-HY5ZpfAM zdR)p>=LGhDQ_8pG%KY0>{#fJL?`Im%=Vm2Ocd6dzvgA3Q7|xnoZmkzf<#N;Ag41-p zk`vNUa4L;@okoPz2*Re?hEla-UGu9AIDR8^opUd(oCv~FWfP9)ZPkmVwY6qYTi>Vd z)qGbH?nbfNEY)39o36`8d5wyCRNV1S5H`b78BXw4o!0*WUugBh_)Qis{jR8>`%^*l zk2tl~30#l7GW1@hpR&&H)_(jX$&94Qj^2|e1M^fjdQ60OrQL10GIU*%b&fD1Nt$;m zblrsm>_3-^Kd8n%bZHLs%Kx4u?@B+EKi#pO|HIPfjCM{<7C-kDgX8Cw<`V67`#+^U z|0iOw9k1tm$GG0HzpC~sAuH|ktSG_xGp-$Qe_zXj6 z +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 12:53:23 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:55 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or del are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_lstdelone(t_list *lst, void (*del)(void *)) +{ + if (!lst || !del) + return ; + del(lst->content); + free(lst); +} diff --git a/libft/ft_lstdelone_bonus.o b/libft/ft_lstdelone_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..57fa2be74d6a8c57fa7245095f7df45543fe42b1 GIT binary patch literal 2904 zcmbtW&u<$=6#mAWb)2|y9UGd20*ZtnNT} z(joyW${~OtzySmYdf|W&aOB8=KY$zJ#+f5Rs*s9g^mga1#}iv1@m=Phi=0Cl%VCA05Udk>ltS$hSjnrIBY!-ouquTr1%Rd;ziO# z!D3Pr+5j~54oxfuJGXrR>6^+vbuGH#eCnADF`v`?>xkqpNZ!a`$|hs`D~dTw20*3W z^JQkaZ7Tq z+je(LSKaWs3~rQKvf8P6UeG9c?RrZNdBO`N8i6leU&40}B*LoK4kctfG+pn%1_a!v zwk>YG0CA8PXHQLLjs>E`;pB-@@7Y}bozzw?vmR%&8{N)DI%*;ANpW$faoeq_-vIu2YeU3faek*|E2hw$}Jy$sw%39+(9M9YDRBO#< zH*D_?RoRfQ*Y=rk_o}UKt>dEAbzNS|3mQYtNr^h4?8;glPI$9JN6yp{y!`KrGN2X9kD0EUA_1;@Vbn*WB(hb`Cp2-z=jIEf5sbQ&hK%Rkb3@PN1R_U zCjMpB6zShYhZ+BCW7c0Au|B;<96!fJebw6PQy6p<3Ap|kTsP+WKNx+EaYx1ft0Ksc J-Y;|ge*lKr?iv69 literal 0 HcmV?d00001 diff --git a/libft/ft_lstiter_bonus.c b/libft/ft_lstiter_bonus.c new file mode 100755 index 0000000..bdd0af4 --- /dev/null +++ b/libft/ft_lstiter_bonus.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 13:11:26 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:03:57 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or f are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_lstiter(t_list *lst, void (*f)(void *)) +{ + if (!lst || !f) + return ; + while (lst->next) + { + f(lst->content); + lst = lst->next; + } + f(lst->content); +} diff --git a/libft/ft_lstiter_bonus.o b/libft/ft_lstiter_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..b560c0dc04d0177de9783901a54703051c3d212d GIT binary patch literal 2880 zcmb_e&u<$=6#mAW-8gZ&actVgEh@f1K+tsq2wD&VMSw^GNR?`AXB}Hvdn4~S zYKp|K5UC-e0-*|VLOp;$Tv~|(N2GG*i1-UC#0^!-rH7!mp65(9vBZJzGVgu!-n_Rn z@6GIoGxJwsLVzJ~5&POcrusEG6sM4cKw)c7zFOGYmFK75UU;*x{iv|{ejM`5@Drbg zR)w93x$WJ(Kjyc03p-ci;cWZw!p=lt^SAib>1%rr?(@PUN)T9L@nV-+$Sd(ums(QN zA&hoS7N1t)OKR-HL$Ubn;k6c{i--~Nq@6YmJ9+Z7Jt9&T5OV|xQ=?z!Glu<2Vj?k? zc`XANCSoT$#9SKa+x|r0tNiGQ08Ay{&SyxqhCvqnCoq@pH~{gqFziHvmIDTk!LaAj zq?}IxgTnw4$HiC%7&1d&{0yKk%r+jL(@-??5VT7%o*_lNLz+k#Op25Qps7F6!lJto z=DrAP13-W0K!Mn7oEAyOE)CH59Z@p~{UAnDe*>AQ3r-EF~Z@4*GYt`MA++{admHt|; zDvOPh=lPYKS1(tk<_9m3sQ69kHYJ+wb%~(p)dLCH8LIy^l@1=r|r>cJG*JziuoiZ^L9Lc|M!m3jquoBrZW)Yk$sE?IzIsj2U`B! z?*e{XI2uo_z7GMtHvZK8URIvC_99Jk>4Xb2W0F4W)k*;oC~js*(0g z-#7kV&a(?=*)6wMiluV7<*vh#)VWT@Z#1Zn)np)BTBpEixn4<4)tglxPScmJGyD3| z*+7;mt8hGTy-_SJFSmmF$^mn)-gFh=){50uso`=E&#!1fy6xx$vL#DpIKf7P#{UU- z^h;R7O;w!tG>$;~rh{Gx;`CZ3aJ_N=Fp?}NY#y;Dfq24gH8P^{Nsn@bQAKinFrv29 zFHw$gPm#Z{qe9g7#mIfY_@VPg;;wR_eWHE|pDxNz8B%|f$vJjZsH>v=j0pvf&*SkP z{tuP^7(4dxpXu@ar}Rrg1IK01%PfF3y~hYy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 12:21:13 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:00 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns NULL if lst is NULL +t_list *ft_lstlast(t_list *lst) +{ + if (!lst) + return (NULL); + while (lst->next) + lst = lst->next; + return (lst); +} + +/* + * @return the element of `lst` at position `i`, NULL if doesn't exist. + * `ft_lstat(lst, 0)` returns `lst`. + */ +t_list *ft_lstat(t_list *lst, size_t i) +{ + size_t j; + + if (lst == NULL) + return (lst); + j = 0; + while (lst->next != NULL && j < i) + { + lst = lst->next; + j++; + } + if (j != i) + return (NULL); + return (lst); +} diff --git a/libft/ft_lstlast_bonus.o b/libft/ft_lstlast_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..9d954a1604d3394db9114777cd7cdbc43789b904 GIT binary patch literal 3392 zcmb_eOKclu5dMB|cJ0Ki*8HU zB@$|(^bi%K0*4B5fD0F12gHd}p%N+rA#p(*cu8>J$m&?x;)`kEfJ^K;aG(gS^yBP?2d>Jb(n?Ncm8kU+DM$r%yFdjNl^GjE92k98&r!jR1z zh+>@*QM?sSi?u*)Qg`PHx|Yjt9m{P}BLD9ne&AO9pi*mlUEi#uw9szZrC_1s*z={Mwtp^YpD#6oN~`L+?Rv>| zYRw?#hkDx!Y%hRkUkKn=T*nU(^d7zF)c~#^z=7NL=8Ij=cji62QFOcjzO!Uk0z8HP zxZNH``KgvpLtV(Lu?^|WH3j4W+{tUw@Wkz5j!uT~LwI~GIwz(6&TXUz^??GEiBi|^ z&|8*Vcd<25-W$qc8B4wLl^n0`b{jTgRfwtwAgqwNK;itL(XgB50#dXv82%EpywcM{ z1>G>FH1C$4GqlkuJ!Q=3%6QDsoT9eX)M1S4LqnTGn~JFq7}|JdL?1h$r;I5b+T*64 z(ss@08RH21?C;N9mG&|LnEs@=JJ+^~r zDw%%J392=i{xdCl{y%s-(Z7OA;YSPjNC*biFAnPe399+T4Nf~4)?b@ESgQ~fNCjHLfViTNd1q02*c;5bw#qPVQs#)f-2 zzkJ^WJ9wzPF9bvK%ai(>_0A!>-e8s=ly?Y|0E=@;Q5~a`S=|qtgyfIfk570 zKyxHM{{{QmP~MB`M>9tJrG7L&l6xZT=b%4HKt|HmT_^tnCz3prpT14W{PaE0W>?z) gE=dl8+#dn?6O#EqNX#!mk^AQxCdiMz#>xEu0D{ylivR!s literal 0 HcmV?d00001 diff --git a/libft/ft_lstmap_bonus.c b/libft/ft_lstmap_bonus.c new file mode 100755 index 0000000..4cdb53d --- /dev/null +++ b/libft/ft_lstmap_bonus.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 13:22:26 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:01 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static t_list *ft_safe_create( +void *(*f)(void *), +void (*del)(void *), +void *content) +{ + void *temp; + t_list *ret; + + temp = f(content); + if (!temp) + return (NULL); + ret = ft_lstnew(temp); + if (!ret) + { + del(temp); + return (NULL); + } + return (ret); +} + +//returns NULL without doing anything else if any argument is NULL +//returns NULL if any allocation fails +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) +{ + t_list *new_list; + t_list *new_node; + t_list *temp; + + if (!lst || !f || !del) + return (NULL); + new_node = ft_safe_create(f, del, lst->content); + if (!new_node) + return (NULL); + new_list = new_node; + lst = lst->next; + while (lst) + { + temp = ft_safe_create(f, del, lst->content); + if (!temp) + { + ft_lstclear(&new_list, del); + return (NULL); + } + new_node->next = temp; + new_node = new_node->next; + lst = lst->next; + } + return (new_list); +} diff --git a/libft/ft_lstmap_bonus.o b/libft/ft_lstmap_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..2f5f00043ffbf5fd562708906c5dc3e7676903cb GIT binary patch literal 5816 zcmbtYU2Ggz6+U;yGhS!y@z2KgI%$igHh--=wu7N*vk>pLPG=)iOp{H5YG=D%&)O#Y z6YY+Zv{hS_#6?R;leTL6P*4j}k)XU%Rq%pHqxPW>RaGJ+KOkNJQ2|0i6%dNixpU6U zcxJZ(@jdK4_q*qud+)h_XZD$y*~5wuz!30d@M}H}4EXZ26sKVT1mw~u(#O-e^s%FJ zGn1Rv`eyH?7XTpJ{F}A@N$;g+rF_#`|FHMc698Z}Z&{ZQr8hsa)_>uwW}7#x=DUAD zcUYg!Hs7_H9d}umAB|b-8_w)(^Hb~cLDHTGY45O_Gcl>!ykV_xto`ca+h&`8NpIf# zxZf?U=I>{lpGfaBlbf^6zgrjIi9MR0PcNiTrSl8dc|!Y15RhZ>m`5EwN#Zj;b&T>tnw_fBL&WR9vDRuo}^O1si>#OGDfZDqgIh+WUG?b zS7aHvsp_fBvFML*A=+1D8P7)MH5awwFnVAsUX{;YAdYW~{UG|qE+e6-M&IyGqhAc@ z0E#J8(X}X2kFR&Ha0bh~m7Ig?`) zC$J`VVP^(6M5;LKKr0R%S5`voMO(kRXKQsIR{QQ|<*}ZA6u$@nQb@Bf3jp#_#Q{lS z5fy#Qscrw8WkPu8eEYCm3K#A8LE+sdLn5a<1udB2y#Yr<;+XQZ)O{WRlIUH@;xf2l z9+AXX0$+tild^zzo!+Lzk!^kbJRh_lbV!2RV9zAQ<8>_YI z=;VHL!kiqNyl+jmejZ9rzT9vsg){lZT6L{q7GZp)R$s{ut0-?EH6fcvrD|W=i2YNZP~5db zh+9Sv7I^vvfH1+IhZju%kP$Oi-2Ac2+c@ejp>=NC(BgVZ&6U)9Qfls+`>XBK)v=V; zrG6u&b$&_H^^^wcimAnPbw^6;yhw~~YH?kiNNJ#}b4N5qSN9*$)rU`NyLEL6&5NI5 zKA@|gGtu&}Yw2jJdfL&|VoAN-REs68Ls#!j>1y_ZCUo^sN*RDaIvl}UGA@7Jj5Ns0 z&71QUsC0dXp@J5sBvki;i$I002!~MptIES+yh^;9k4NNXf?Sw-~+G? z0RFY`Q^73gQaCXi5oQ2*&?YMXS zSp(b?@Pqww+H!A*{}$CVA-+j4<@-(eO@PO^;dwy(kxKM~`ur6AIl!YnkNY11 z9`!j6p9Xl;=Qz8mhr0(+|E5eu0J^E<@#C|P7!L5LKSPVZGr*&N{tDb3;8Fj3_yYiU z2YA%yb-XXY2TyT2z@v+QyKdk}h<}gxqal8Z>hmG~1l8>j|2owh0UpOQLH?f%@Hn0u z6o*S8{wncTLi{b_Uk>qiP<&ns@yo=&Njw(lg3sgIA)Y_-u7`O3{P-Zm^LN2Ui06I( zrx4FcgP?g}Gm88rmL#6{&&w3IeIZ_EG5|12?bu8z5)Tm1{yn&P2j&6hlD)XLoG&ac z*6p)k*6nh^bTE%Fi?vDxvkKCv7plv4gKG_k(}r*g;kt0Wu2xGmFsn7kHXnL8H`Z_p z#nWJx%V#V3!qQT`vAVoPy}VkriLh7lrFx-abARPpvBmRlHk`UsSOl~2cm>P<7r6gv zt8BqzGUo;O^%hp<9b16+I>s8$WDxvU1HWsG@LPznuMxIO_#~ zH(QJeaZCOJ{4O*(+Lj*TZR~$bgUW;qLRBcVvA>f7G9BEUEp+jIZZ-cEn*V#$i1SC6 z;rWlX@QEmrBLC;Y2#^0D+4DWcxK8%(GeKZ`F7Ik%f0a_CJ#5&{A`84b42~P)a-06G7X9Og qaJc`c@chnh)&RUzMS{;SgWN^>$GjsPJ46x>2KGk-#sd2e_x~TJ_yDs2 literal 0 HcmV?d00001 diff --git a/libft/ft_lstnew_bonus.c b/libft/ft_lstnew_bonus.c new file mode 100755 index 0000000..d06f4b6 --- /dev/null +++ b/libft/ft_lstnew_bonus.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 11:54:17 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:02 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns NULL if any allocation fails +t_list *ft_lstnew(void *content) +{ + t_list *ret; + + ret = malloc(sizeof(t_list)); + if (!ret) + return (NULL); + ret->content = content; + ret->next = NULL; + return (ret); +} diff --git a/libft/ft_lstnew_bonus.o b/libft/ft_lstnew_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..531718f5f2874d32a1c709bec5c2a372bafb89f7 GIT binary patch literal 2832 zcmb_e&2Jl35dXd1tmD+l#)(mrvE~c^R-`AizHvWvvT{| z9kCqaiNc0VA55urnJzLlhQHOuEs;(Q6lMDGkRl5yY@R*Dqryw+nou+95xZiUc6sik zJ)>p|fZ-^btj>S+!h&f(U3#W;dZAuMX6o z+5%7rS;@FOPP4MH7T*pT7#9)Gzo7Z0A||X@d85_$b$_w#HT|u{JvWTHfxo!&xU=l6 zEUldF$E#1EqZ?kNefP~qEAab~(?)eW=($zB9d_NV>IFC2(ZO!DqZ_@Z=LPMm*KKw5 zzzprc*RHSOyZahZ!|O&GIvGM&<3EN$xQ~yh-hLTszpPG9ju$^u!2L*mg!sXnx62S?0y>Yb;;L@M*14r_1o9+b?jb^JAx_fX!*K0bO3e{-` zy&jbh4hctLv*S6Ycqq(j|o!HM4L(fGgM`)p6mpv;f%#|%fH{AEG!j=1a_B_!WW?m-#k zYiS`@CxRLm&pZ=kNB0>wZy@DAJt8K;Cfj|@qaYuDX@vbfHh51A8F~A2BkZrU;?nB&L)u@DT2U&i?R3LLWkj_ps2;RyTsi1YuP zExruIui$!OznfS8l?mx@0y)26e? +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/16 12:13:44 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:03 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns 0 if lst is NULL +int ft_lstsize(t_list *lst) +{ + int i; + + if (!lst) + return (0); + i = 1; + while (lst->next) + { + i++; + lst = lst->next; + } + return (i); +} diff --git a/libft/ft_lstsize_bonus.o b/libft/ft_lstsize_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..1a8a1f3381ec9d212dffa20ff2dd7d4522467b1d GIT binary patch literal 2640 zcmb_eL2nyX5dNMwb{xCixG`;#mO>6KrK-BF0SQ`AiJ(oBszS6TYTj`x%V*pZVyOV+JV6iZE8o4h>bTd+ZpM&FGFPFn6RRCcFJG=+tfm=|h?9*4nbs^P?zf)uOQ3mWCg~ zSRzU#T1hN}SRxMgCDKL|rV?@_Lj1>cfUHHt<9iVM6>;X+eDPZ`;$I{KK-E#Bt4jAK z)lGyFcQsP5P*6KuRCh+h3xw{6;W~$FYh|bf97+A+j%(QJ9$xX&fd=n z7{f6I->5wP8ctb)Gj4$iIB+I(4Tl@ch66oFlW?Xq-+cf}MqKJWf*#+J*>XU(1M#Z$ z7)vZQ{|f7;3|{X^IBoE>&sEl6VoBd7D>#5lGkEQ%<33=!4VIekv3}R!&8n&i12X%s z+0HlYDbJAgPc8nC^?i%~ob>~X*Zw+=&hru5t+AvUn02_pyj>r7J3({MY52`%KiGpO zX}r8v((BQ%@nS0b@cKdIvmVCn1YVrTz`OOq_T^Oit%vZUXs_4scXs+|*f9oU!ZQkE zO$6OWyYKe`9VALxhF3ODUMl<2Z^BC-^+^6t_=(QPDSJKR=KR%KQ)jRNI-`j*dy_D_ zvnJ0FLPhT}3}`s^&A9g0Jl#unPK4h$K3(f3Y}?k1_y<$s(_are{%x9{ kJHrIXjwl5^KN{-4%#>VzvCb!rSGj+Vn4rArR +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 17:19:34 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:05 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + const char *str; + + str = (const char *)s; + while (n--) + { + if (*str == (char)c) + return ((void *)str); + str++; + } + return (NULL); +} diff --git a/libft/ft_memchr.o b/libft/ft_memchr.o new file mode 100644 index 0000000000000000000000000000000000000000..6f09b7841d23969e7e2105aba1dc09e0232e34f1 GIT binary patch literal 2944 zcmb_e&u<$=6#mBRwet%*X&^rcB0iKBkg`tFf+&Szp%M~WA%qer2+6Y7YkS-EI_$2a zP$9JGjHC! znb~WvT--=01%bjj^sPRwXZzo!__Ks*C~V%iA1!a*{Hv6|b1%PKLjKO`nFmpR^Wg5$ z=E0%bym7zt$J*g9;ylJ53On*S)uY}JRT6#4_AK|!bDPGWYWsH5K_HF>-oJKxnb{NE z#-u2dkm$5PkF!SoJ5V*Fp2*FbMs9k3DL12zWq?#3TeE<1B5u;hVdTzDPEG=59ze!Y zBr7f4dU?^vJwJJN^5o*y>`RM4)c<`f}fbf)@)Y-;70)IIJB{N<7CZ) zI0+zC1Yn#NeMXrX5mC2#n=F+-3!t~#D*xG_`T3wp36xwx%{)y*q;3Hik7F{^6W{S1 zDJy2OW7w&7{HRl~y^7x`>^VW`w*A7|y0vPpt*o8t#J#6bkIF5lWj6!MMzPs$ImM_M zxK5*Z-U+Wn?cE{?DxTN2i=JDpN3fffpznncHe5e~53lVv3LQUm8@^L35Er^vopOXQ z3h*DJd6-wBuD%JiKdqLgvSXhr#QbC2M@bY=Ueb7n5~|eSxreBs?NNX#cEW&SE_&Wx zYh`Uc{*JRz>}H|p`nK1pIp{CPvT5Wns@0sj)$AV8@s!MF+GBX)t;Wab05qGPMv1Fwbv@<^ppTzM$I2zVxpf~XV3>X8pz~K5!!swUT z0E{6u{1kv=+Pso$so)8zYKEKw;!PprF}e_5E`vFZmoW*CYCMgz&i3Qn(w^$scqXBb z&lG?cN9Zpk^zX6#md5K@eOKcto;ur(#*_Y8wq1=UeUt4-<4NCUdtc*8@3VcN@udHj z?TG<_+7RO+)|G9Jj=S1`G-|=s+~r;QmqEg9<0dOk6_vD zR?G1t>7;YtyIx=gj#ptf*RQu>`R&NDUVVLMC5$Te6-@^MvjjkKQ>G zOv?v@_Afamp~3yXaVtn_$xd>F4JJPnM@CZn+z9`>Ec{6vNBEyg+#7fUV*O7JD~cgnI`0bD)z20| z{FCdF^$Wrg`TLR!O7cYcqdQmpg{L}^wdlCS@qew8L$q{|c&i5R^N{)JO-RnaP3Pz0 i5nX@R^#SDk2q=C+GS;sW_fiiW)FBh(M?Y1``TqePz39>a literal 0 HcmV?d00001 diff --git a/libft/ft_memcmp.c b/libft/ft_memcmp.c new file mode 100755 index 0000000..5c63833 --- /dev/null +++ b/libft/ft_memcmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 17:39:59 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:06 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + const unsigned char *st1; + const unsigned char *st2; + + st1 = (const unsigned char *)s1; + st2 = (const unsigned char *)s2; + while (n && (*st1 == *st2)) + { + st1++; + st2++; + n--; + } + if (n == 0) + return (0); + return (*st1 - *st2); +} diff --git a/libft/ft_memcmp.o b/libft/ft_memcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..b0c9e053c0f25c3b665be657e0ea01459fb0dd17 GIT binary patch literal 2864 zcmb_eO>7%g5T3W|b(}bOouuT4B4Pn;RiwO)-6FM6N`y>Fs;UA+L^&YKUa#$K*SnE- z9i>HrioY9Dk&yTiAR#UwA;f`J95|%vi5`35!l74=oO>vm-I;jzC6+kwUEa>TZ|2RL zH}l@U_wt2vnh?Mca27_=2&)sL@3r`I4ay*3{iA!)lhr>u=JJQJ*1VN7>*lRoseWpA zIKBSCZLxm(?(pyG?w$Ja-8<}qoe6l2RVqf5O?8SfqP)Q>hL{mYN^^!@DlZ%^&4}4N zfM&wR9Dsf_9&%5EUOHPW76A+?kg>M-`AbWB>AB+b#bZkwb1yCdsLn_2Mo#yZ|kN}`r0HB{_enA*a!CCPpO2Yga0P-Tv zhcLg7g?Q(Q!07;C{s;gC_8?}S$%wNkCUF@#?FRsuocfi>nvCO}D8OcG=tskf?KS;w zW!o8qZs1p{HMuIQE7jA(c=iNzqDJ58+x;zRgVhWAjurI=uG6*ZPIx5>wk#wxJuk2= z&uw)g82X{x^__Ob?llJ^b8!6#!YYI{@WBiGZe@=c&$!o|Mg(D0g)pkYe+&+Bh&Cp! zy$)ihEDldk6mEz_|2WNIiWy(Usd)?2EyRP;BRJsM2>@XY!vSu?^1SW-O0^b$#|g5M z#8|Fxd&9N^qm4-$J%>@d?Q~=>X{||(SJO>l6sH#R`sGW8sn7ppESxtET{5&YMp5dQ zZx|x4FH6H*HpB~>fK;3A!zXdv|2*6`fprCY3ud5$o{k0GLg! z%Q?=IQMsAr#u$5MLqQzQ8a8u2XC*?3mr$DIZMXU6c) zD}0A!w&OTM(zg}pP@ydX3JY*>`viFR(LR zE5m3IHCrIVt9=~*Cwxigq2f9fG2Yy1#P3E5W^xy0Y95ii$*|XFj52=^uwGQ32%qL% z8W}1VWmSjxlMFs)LxRdZHOBsJBL2>XW9&~T_XcAtd1v81`N2G4KkzHKNJP8`kh02# zge59gd}7n!_<4MEjQvfrKbAI5?Un88DP0-P>=AKwIZef;0iFFeHS>3Vu8?jHum Yk5KdXopLWRexdkxNr86wL#3|&F98 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:52:40 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:07 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dest, const void *src, size_t n) +{ + char *str; + unsigned long long *str_packed; + char *str_src; + unsigned long long *str_src_packed; + + str_packed = (unsigned long long *)dest; + str_src_packed = (unsigned long long *)src; + while (n >= sizeof(unsigned long long)) + { + *str_packed++ = *str_src_packed++; + n -= sizeof(unsigned long long); + } + str = (char *)str_packed; + str_src = (char *)str_src_packed; + while (n > 0) + { + *str++ = *str_src++; + n--; + } + return (dest); +} diff --git a/libft/ft_memcpy.o b/libft/ft_memcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..970048266e868d0666efa2db2dbf16c6bc5aa7d3 GIT binary patch literal 4456 zcmb_fVQgDh6+ZVp-{+Ua^Yd$}HfclcjjdZjb?Ub3<}QqQWbD4wsnXJlPDDx^$4){W zC)m%Wt2CJQ+R0Ys;eRlMy6_7SLxMjQDiW$wkuHEV79?QpkF{kJgdwdh(wdbjM(6on z`}w66{NR)F?m6E(=iGDex%c?x+t0_pED-_%1fGSa*2L69O}XC|`yl`XzQRhY%(|=Q zHpI(^R}JfKS3Y2rsw*1_0FI9m09JaJS=U!txzEp{mrn#3sj}#;6Dq#{Cjc1Lf5?Wl zK!!?xFsy6$jPl8Qtn?|Xu1L(Pl2~aeW?h$=RrBRNk=jQoW?jF>?z|VNX~BNb0-iN3 z5MK*ux@T3>IpJ%t}1 zEcg5dmpOE1$=t`vzEx&b1FYP)h9*Y!I*nY_f&&0rU?6x?3;2SXKG1zr(|z5{x)d^^ z?-f2AEbm=BSoU3v@3=A)T`)gm+q1KNW-Y2lsm-veDzg@F_q^ZyJ3F(io&Gfd*qgb9 zm3^Dy(IxG*pW*(LeL9QY(q5a#_oX}W(vneH9x6XqiX(+Ao@Hj6d&V@>_THrsErSXDn()jwymV>Ua-td&=ob=gyxA3C#a z?la1LZFZ^2Ei9{1y+I>a)1sc;SkG=v$HMBqV7;DK3LnO!3)<wl^FP3DN0z z=*>Oc;2TXtU8;NUZsc`Hh$2;-^w7FV#ezhN1dfRCPc_0H+0RARq(rs?B9KUxz_19^ z^mb^vJG1V(4w z4gjt;&W~#EolmU11z01g7Xa++y{hz#kQE{});1zvML(ip^P?ifI(4!2?e76VX&7(( zT#LG)Rqfo@@>WL`ywdM*b!~sVF9P!o~anOOiFoug3fVfU^YK2p&m7 z$iMv$;eh9X0Fd57K8Ne>&16o@?2PQTWqU_^>pR&yolRy66Deq}J)Fdu^5(=uDjlAx ze-gCu9snR~gm$zarjjx!PhF6^Zp%}uX%Et8iQF|vJC)y3U8&H{3f0fi&U1~YoL2j2 zr@Tdaf>6C8r_~UZ6uIjy+Br`jQTnJpNd0}3DhFuC3mBeuC{I#J>5~)Eb|MEWa^h|3 zQ{;y$v|SmblCocs6RK%b>IR$h_0jfY)HnFwpB)OLl42@*b|`WpEeBtf6PSK*kouH) z+OAZn?=9MXj`}V%p7N-AjQZq<)emTUg-VLLjryd=Hu7W^6*=)I$q$b2DL2aYb-mSS z{Z7cx*x(k(^;^3Ra-%1tEudJI*1OeV*$h4xV>-8)FV0 z^L&}>#~nP{+ieU0W*t1*zsmJf4j%1=-M1V(+P}v2l7mP454eu!2O;+Phg|<2ACX7< zow#rS_<@7R_&?|Rj~qPOC%OGk9X#6qitFbcJlem(?JqcZw7aE16A(62Crt<^XJ=+oSyQ~k9vsf4G6`-xolVa| zI6G^m!Y>>=x-)MklE)#8{c$ugF_FtpPqvt6rn4zdq^3sGxx`FLM9$16o4JIO5YC%9 zGcgX~{7W-9{-5xM_`P=Fm;6Hh#KrUSG|*lDEoixei2DC>{5QpcfI~*$Id;cHyo`qd z0N!!Ebg6)!DsB!D$3p`Eh5FEd+xF=P_*c3A`wh=J-2Qu9eN3PWFAM<8@k57SSr}5~ z23>r7g3mAdkia}|YL^AUA?6oj@B#jlyj4Fg93S96@PPHde*aeAm{;Ir-Cr!TfeQD> z{dGdDUjX}L<3rJbB0qm(pK$+hONGDSCm)di+kF1-h>hZKsel*he)G@YXMUvI^W!JJ n9Is*9wf|2R5cfv_^GCSn$3E-qO9IE*>e59{pdT*DJ^z0IFj`mJ literal 0 HcmV?d00001 diff --git a/libft/ft_memmove.c b/libft/ft_memmove.c new file mode 100755 index 0000000..a2b7492 --- /dev/null +++ b/libft/ft_memmove.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:00:16 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:08 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void *ft_optimised_revcpy(void *dest, const void *src, size_t n) +{ + char *str; + unsigned long long *str_packed; + char *str_src; + unsigned long long *str_src_packed; + + str = (char *)dest; + str_src = (char *)src; + while (n % sizeof(unsigned long long)) + { + n--; + str[n] = str_src[n]; + } + n /= sizeof(unsigned long long); + str_packed = (unsigned long long *)dest; + str_src_packed = (unsigned long long *)src; + while (n > 0) + { + n--; + str_packed[n] = str_src_packed[n]; + } + return (dest); +} + +void *ft_memmove(void *dest, const void *src, size_t n) +{ + char *str; + const char *str_src; + + if (!dest && !src) + return (NULL); + str = (char *)dest; + str_src = (const char *)src; + if (str > str_src) + { + if ((str + sizeof(unsigned long long)) > str_src) + return (ft_optimised_revcpy(dest, src, n)); + while (n-- > 0) + str[n] = str_src[n]; + } + else + { + ft_memcpy(dest, src, n); + } + return (dest); +} diff --git a/libft/ft_memmove.o b/libft/ft_memmove.o new file mode 100644 index 0000000000000000000000000000000000000000..57bbabc0951edb26cef92130710462a9b0f4d129 GIT binary patch literal 6480 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 literal 0 HcmV?d00001 diff --git a/libft/ft_memset.c b/libft/ft_memset.c new file mode 100755 index 0000000..e181a44 --- /dev/null +++ b/libft/ft_memset.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:40:57 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:13 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *s, int c, size_t n) +{ + char *str; + unsigned long long *str_packed; + unsigned long long cccccccc; + size_t i; + + str = (char *)s; + while (n % sizeof(unsigned long long)) + { + *str++ = (unsigned char)c; + n--; + } + str_packed = (unsigned long long *)str; + cccccccc = 0; + i = 0; + while (i < sizeof(unsigned long long)) + { + cccccccc |= ((unsigned long long)(unsigned char)c) << (i * 8); + i++; + } + while (n >= sizeof(unsigned long long)) + { + *str_packed++ = cccccccc; + n -= sizeof(unsigned long long); + } + return (s); +} diff --git a/libft/ft_memset.o b/libft/ft_memset.o new file mode 100644 index 0000000000000000000000000000000000000000..dcfddd6d44d19122eeeca0bcab57d5da67475d05 GIT binary patch literal 4024 zcmbtXeP|q25TCc3z1#Hc-6bh)sznd2wHC9Nv_V@xVp6Mp7Z0h%)UVihx$GrpFL&W? zQ)@+{u2Bz(mZ~TsDhT?AC`Cl@49V{LXV6wfcDUPAMxS= zUOKMx+5^1!F)w`^=Cz-eZH>J4_p&YG*p@rCW?uSgHLv}R*B<2KT{GN1)fjr@0tUcK zKdRi`#bU)zV)o>j6c1%fsnGDmy4d*e8D5;`rC$|p?`6e5?Qi_t{%c9W-*WPY7Xg6V z-_7vpV=X6BM(Bb^Ma`-0Cqkn&Qzt^B>!!lu8WGoKacvjZ4dQx_xDKBPjXpZ{5C8~a zI|;9nu#6FRqd&v5&+|Gr=2#i_eGHr>6O z9``v?V9-tCXL5ru*hDNZh|1tr5CTZ%_2CW=L< zkpcyD)lrGP=~~H(%W;m#2Nt9rJx4e0)YTPjlu9%d*kzK7puW516KtuSsZJ)b}@ja zfwHJ<0JRGt)=;(qz%c;1l)9KAEoU`w`brc4RJ8k;7<8s!c|!K< z^gINY-G)3C+6Mp{h5CoOzxpno5T8S?TT!LfUjqPs5w!ucR)`DG4|FjNt)})189_1R z#Gt!xBx{XCl9@zyAhN~G7t*@-6h4ety?2ia7lgkc7#Kp0vvsNWE6d(y` z$(E^AtU`L5*=s?;%HywhIFa0J_Crzv((oS(DPw^g*|uANZ4I;Y&hhKp8Ng)#uteSy zo3bMqUK?!e2uAFhr_{$3^&ks2t__Aeg1TTG7W?B4e431%4$j8`Hwpt_(UC$P7bBX< zY#C~5St(?(%+d1lM$_43W~ASQ$`Tk!3|p}J`^}UwSbindDsn=ghM1pb>*rQRt=Z~WUm{D-A3wjY3) zzi1E=19GH#pOkvuWk>$yQs3gTW4+^2r#u)3`59>+^YEXMI(|AJh>sl;@vIzaK5t8% z-X6rS6I~nNH4pzCsgobY`9Rv=ckywacgi?)pZI$u?|_Ss^*$~2BOd!3QvcFpe@^NV zIpSV$?}wDMd!Hj1{bt|DKyRY2FK=!EBX4FBhGlNGz)0qXhRmw=D!JG~%fzy8I-AOY zkRM9i(tSJrVU~ej)7&0kxCYP*gWk$iuTZuj} z3il7;`2X=Ty-_{bhYtk6d7cFM*c@QrN1OX>BFf+P<+rmN-X4Nq2+phAg&Fbgt@Ic4 z!{g#{;UwxMP!?MsP zWF1&PuCcfNCYhi58zCT@E1how&6P&%qbPg*4@v(^$Wem)XpEhu{!`N53-Tl2`Z9oF z_t_MX8;TQAg6b!1J +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/07 14:57:23 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:15 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +ssize_t ft_power(ssize_t nb, ssize_t power) +{ + ssize_t answer; + ssize_t i; + + if (power < 0) + return (0); + if (power == 0) + return (1); + if (power % 2 == 0) + return (ft_power(nb * nb, power / 2)); + answer = nb; + i = 1; + while (i < power) + { + if ((power - i) % 2 == 0) + { + return (answer * ft_power(nb, (power - i))); + } + answer *= nb; + i++; + } + return (answer); +} diff --git a/libft/ft_power.o b/libft/ft_power.o new file mode 100644 index 0000000000000000000000000000000000000000..8285f43741d2c1e997ea7502998d1c482bb28ed8 GIT binary patch literal 3232 zcmbtWU1%It6h3z+cM`L4C&_Alnqn7PtyMCcjiELgYNCnmrZJ}4RPbflpV`gQ+1a== zlRv7~#(+^D@(>#kY4yp+yo!jVDQMoLFMYOxAOwV32#R3j%-%CIJ0>dlz1(xYdw%ZE zId|rrv56N$i~)hcS@1LupEY^%up?!ZR4FF?_tuN6rxw2;!3aWDKy_(hD zx6D40R5tgMw|}wk?Vj_dlw+d+$>l#omoI*Wo~hN}3u_~*zm8n_k?n0WW&P&pncKE9 zp=^GiT;68M!8`Wd-Qy``^JenYoyCpao)ITuO4;1H!obLa_vE{7{yr0uppf_&C-&Vwtz+>3rN9_O+=$iqzoJS2}xc~v@kop;J}yis1`&2m3)ILE`%;y4e< zLp&-^@)pTLmmv<4KF*`E6f1BxB};F_9OWu!Qyg4%2-T>x6yt0v#K8A(2Jn$nSNHY< zv;)bj+d4>I+15ewDzpv~G}h?^>41(o1pw{7ymZ%2RRch?zYhT12*`5^?8K;n_{W6a z;o~VL;)svOIP^9>B6zGR_lg1F$wT zX>z*Pv@*F%pz8WuIi1Ppt7fTKXRenFO%U2lx=_uOHA;K~4A9xpBh$i0=3Gtk;PU$zXOBiCGqe-9ZSVO+9QXWw4Q{{_p#R0bSHE!15Q;461e{f&4e**Ti`+woXj;KF6CpNewS~*St literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_arglist_bonus.c b/libft/ft_printf/ft_arglist_bonus.c new file mode 100755 index 0000000..c5b95a7 --- /dev/null +++ b/libft/ft_printf/ft_arglist_bonus.c @@ -0,0 +1,104 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_arglist_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/27 17:04:47 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:39 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +static void ft_set_default_flag_values(t_arglist *arglist) +{ + arglist->width_mini = 0; + arglist->precision = -1; + arglist->flag_hashtag = 0; + arglist->flag_zero = 0; + arglist->flag_justified_left = 0; + arglist->flag_space = 0; + arglist->flag_plus = 0; +} + +static void ft_handle_overriding_arguments(t_arglist *arglist) +{ + if ((arglist->precision >= 0) || arglist->flag_justified_left) + arglist->flag_zero = 0; + if (arglist->flag_plus) + arglist->flag_space = 0; +} + +static void ft_handle_width_precision( +t_arglist *arglist, +int *i, +const char *str, +va_list *args) +{ + if (ft_isdigit(str[*i])) + { + arglist->width_mini = ft_atoi(&str[*i], NULL); + while (ft_isdigit(str[*i])) + (*i)++; + } + else if (str[*i] == '*') + { + arglist->width_mini = va_arg(*args, int); + (*i)++; + } + if (str[*i] == '.') + { + (*i)++; + if (str[*i] == '*') + { + arglist->precision = va_arg(*args, int); + (*i)++; + } + else + arglist->precision = ft_atoi(&str[*i], NULL); + while (ft_isdigit(str[*i])) + (*i)++; + } +} + +static void ft_handle_flags(t_arglist *arglist, int *i, const char *str) +{ + while (str[*i] == '#' || str[*i] == '0' || str[*i] == '-' + || str[*i] == ' ' || str[*i] == '+') + { + if (str[*i] == '#') + arglist->flag_hashtag = 1; + if (str[*i] == '0') + arglist->flag_zero = 1; + if (str[*i] == '-') + arglist->flag_justified_left = 1; + if (str[*i] == ' ') + arglist->flag_space = 1; + if (str[*i] == '+') + arglist->flag_plus = 1; + (*i)++; + } +} + +t_arglist *ft_create_arglist(const char *str, va_list *args) +{ + t_arglist *arglist; + int i; + + arglist = malloc(sizeof(t_arglist)); + if (!arglist) + return (NULL); + ft_set_default_flag_values(arglist); + i = 0; + if (str[i] == '%') + i++; + ft_handle_flags(arglist, &i, str); + ft_handle_width_precision(arglist, &i, str, args); + arglist->size_of_argument_string = i; + ft_handle_overriding_arguments(arglist); + return (arglist); +} diff --git a/libft/ft_printf/ft_arglist_bonus.o b/libft/ft_printf/ft_arglist_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..baffe29e6957912d2180761dd074805338dab8cf GIT binary patch literal 8064 zcmb_g3v63g8UC-Y&y5?WcG4t`)1)+PSzG#Wl6DiNbF#!VJVAL*Kobytpa?cCL| zgYR`Z%BqxRq4TnAonQ|@>UdNPX`2Mn7_30ou`MlPh{u2l#H0;%s3U9l5PPu+qyOIX z+c&3;K!RUN?*D)Hf1Y#h@qf-lPycluNdh7XI-x9;>Cmz=-(|C1PzMt1itdiy5Zx6W z*r`sw9_lT;qZU4Vss#Yfp;AvrQJp#!y!{;sKz$OCVzF3M3%=m)Q^A@p-|4Q9qxSBh ztFKTCv+B%F9KeJ8_o{Y$L(o?6b?fr!}I^MMxPU<+H z3av^L)Hf4Zt4^Ml z?1Y@W3*Od3kGH3AAr?FtS<4H{x6gH}(=neqqx#fBpKqG0MJH!H7}TX|H3e661H^(S zZ(D2oB^T#=3KzNy`R2(;D|~_VOr5p->U4K&^=W$udZvn2#p#|p6nYD9^cUV&C!Y;{ zE_zdRZ}jGgydw_NI|-PJJY-{ary2dGEoj#_}Fh@(e()4;$J z!Z#rX_-HH~mH<@%mK6?5wl+Z1orfjxgzk-n0Gi9A)ms~B#9Wp$yHaS90lfBr`|P=? z5(nQVoE&?eq#8*^M5^h;hxb|lU|Ss}@GMi1Yw=W9;PXcS;8_A?zSdjj>wIOtzN*YG zb=fx5mGMxh%r`cJy|S3s$*G&?)Qveg>2>3#%GvXFrkIWQZ2(yG9)M%7NRE9gx4)un zzp`w<3hf{|M21C{-p^$$t_Rrg4^2`~hHUxkxbGtaBp9_t!>g@ltK?M6=8jc=AXFp8L}OT=_*OK^cKGaR6eQrsj(5;sV3cNA&YP(EYjTN3GbCe<>o=S(A; zY3bMyZVz{?@Ay>Se!CHpmNu3%GFGxJX=(9XDs7mSHk8fe&2R$RMzW)Nn>CU%^i*57 zZtkQnCD15Go04#6iqO|v~rLbiRWCeoJ`9J#&anXQe#>+nKX3^ z@)^@eW%S_|EF)Qhv*UU$na=LVs9HRy$04VuG&4S~JCdf2$2EIou})2k?${CCqwVay zu}2%&v#m$dK+}fuM%pqmqzT-@l^aIM8N)^fV>tDi_}Vasjg(<)#;vS@P$H+tEevkY zC;XRdfqE+Gzz&dZt(KaqDtt#JfPVT2_znZnKy@q-iUnF?fz`1+H74fvt~yJu?j;1A0KxIswLhk?cTz>gkx$I^O)w!E3c zCDxWskB_eJ*kJSaYHo8@ahs7zr1Qf%7R=XhI1DI>>sYc;M~5%&5d=+ZIG#&|NAL&C zUd-VUXFFe1+I{2~L1I;vzAi;RK5>jyDDq1XVTuxwzcZ0!OBK2H7^}aAEtY=?e`J37 z@rk2svHU#rv3mK36TXNd-|{vZy#Q~sMY7q)Ldu|gVj{_E6nTv&EHOoS)MAZFyCM%9 zV-51UK31=6VU@}tlLuM7?+mLwQ%F^e_Goe>6dEW+v)`I-m?YEQn20=M3TX7NG>ATX-Y0487eQrkYw;LfZM;<^XLF}gYyuF@R+~El|S{n zS1q9b{RMEkF2JS@o3)Sd;9o2jM|m6^A^asJ{MQ^ueXN4;mt6QF7kNVLvL zA5R)cbVSGHg1Hi{wU& zUli~kaQTRU|Afn55pepR=>~x6{WI5lM9@FW0U&`k)j=wMHujDv=*rdOf;}!f#IK^Ee;1qYcfK%Mn0^Y;rEdp*|c;fY-fIr6N zJpw+>Wlg~QxNHb`oXe(w@8j}80Vnwm0UzKp_G(BpK40VV0|I`U%MS@SjprjA$A|kn zdQ#B;fXmOiaOc9np))QV*9nb3?emx?>i2T}7X^Kqm%qAj)TjOSZ!X-u4&QR&sK1%Z zcq5KP<3sDjxhrsR+Pjddc=43yn>GrtjN|AI*$Iw!y7bWx?T^>FaLmU(^#j0wfYW;0 zE8vv(J{OMu$9P=Rg`@xVT>cV&Ql2kx{ksL6en%b_aJ&*hdR)Mp_&7c-;I!U;FW`@I z{Z|B>=KF$xzrpq2=Qzz5&G#aH9Y8qExA=QXMEfg^Ly5w}`cOWl#fOG+`Z$DhdO9Aq z^jqztlyHO!C$gh>!gL?FxOpy~N$Dm@c&KzdInIqtG7I5M*3!eD-nwhOX~h%!>@x}; z)xvnT(c;6yInzkZGfNv8odf!amdwRRb#RW|6eyidTpveEcNE_=j=- o=r3X$e28j7qWyyi^G6cnV?QaRXj2Pr3;=+a@JRT;B_+oHH#EeuApigX literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_case_d_bonus.c b/libft/ft_printf/ft_case_d_bonus.c new file mode 100755 index 0000000..2f20550 --- /dev/null +++ b/libft/ft_printf/ft_case_d_bonus.c @@ -0,0 +1,75 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_case_d_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/25 17:12:38 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:44 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +char *init_str_to_cat(t_arglist *arglist, unsigned int nbr); +void convert_precision_if_flag_zero(t_arglist *arglist, int nbr); +int ft_handle_if_precision( + t_arglist *arglist, + int nbr, + t_vector *vec, + int *size); +int ft_handle_if_not_precision( + t_arglist *arglist, + int nbr, + t_vector *vec, + int *size); +int ft_handle_concat_and_padding( + t_arglist *arglist, + char *str_to_cat, + t_vector *vec, + int size); + +//flags to handle: zero, space, plus, precision, justified left... hard mode +//flag zero padding without precision behaves just like a precision +//(zeroes after the sign) and when it's spaces they're before the sign +int ft_case_d_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + int nbr; + int size; + + nbr = va_arg(*args, int); + str_to_cat = init_str_to_cat(arglist, nbr); + if (!str_to_cat) + return (0); + convert_precision_if_flag_zero(arglist, nbr); + size = (int)ft_strlen(str_to_cat); + if (nbr < 0) + size--; + if ((size < arglist->precision) && (arglist->precision >= 0)) + { + if (!ft_handle_if_precision(arglist, nbr, vec, &size)) + return (free(str_to_cat), 0); + } + else + { + if (!ft_handle_if_not_precision(arglist, nbr, vec, &size)) + return (free(str_to_cat), 0); + } + if (!ft_handle_concat_and_padding(arglist, str_to_cat, vec, size)) + return (free(str_to_cat), 0); + return (free(str_to_cat), 1); +} diff --git a/libft/ft_printf/ft_case_d_bonus.o b/libft/ft_printf/ft_case_d_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..f9e6b31aa6a3df59f62288b17a9f97f5fa520c62 GIT binary patch literal 6272 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 JV1CcH|6gut0!9D; literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_case_d_utils_bonus.c b/libft/ft_printf/ft_case_d_utils_bonus.c new file mode 100755 index 0000000..2183a54 --- /dev/null +++ b/libft/ft_printf/ft_case_d_utils_bonus.c @@ -0,0 +1,115 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_case_d_utils_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/27 15:59:04 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:45 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +char *init_str_to_cat(t_arglist *arglist, unsigned int nbr) +{ + if (nbr == 0 && arglist->precision == 0) + return (ft_strdup("")); + return (ft_itoa(nbr)); +} + +void convert_precision_if_flag_zero(t_arglist *arglist, int nbr) +{ + if ((arglist->precision < 0) && !(arglist->flag_justified_left) + && arglist->flag_zero) + { + arglist->precision = arglist->width_mini; + arglist->width_mini = 0; + if (nbr < 0 || arglist->flag_plus || arglist->flag_space) + arglist->precision--; + } +} + +int ft_handle_if_precision( +t_arglist *arglist, +int nbr, +t_vector *vec, +int *size) +{ + if (nbr < 0 || arglist->flag_plus || arglist->flag_space) + { + if (padding_if_needed_before(arglist, 'd', + arglist->precision + 1, vec) < 0) + return (0); + } + else + if (padding_if_needed_before(arglist, 'd', arglist->precision, vec) < 0) + return (0); + if (arglist->flag_plus && (nbr >= 0) && !ft_vector_pushback(vec, '+')) + return (0); + if (arglist->flag_space && (nbr >= 0) && !(arglist->flag_plus) && nbr >= 0) + if (!ft_vector_pushback(vec, ' ')) + return (0); + if (nbr < 0 && !ft_vector_pushback(vec, '-')) + return (0); + while ((*size) < arglist->precision) + { + if (!ft_vector_pushback(vec, '0')) + return (0); + (*size)++; + } + if (nbr < 0 || arglist->flag_plus || arglist->flag_space) + (*size)++; + return (1); +} + +int ft_handle_if_not_precision( +t_arglist *arglist, +int nbr, +t_vector *vec, +int *size) +{ + if (nbr < 0 || arglist->flag_space || arglist->flag_plus) + (*size)++; + if (padding_if_needed_before(arglist, 'd', (*size), vec) < 0) + return (0); + if (arglist->flag_plus && (nbr >= 0)) + if (!ft_vector_pushback(vec, '+')) + return (0); + if (arglist->flag_space && (nbr >= 0) && !(arglist->flag_plus)) + if (nbr >= 0) + if (!ft_vector_pushback(vec, ' ')) + return (0); + if (nbr < 0) + if (!ft_vector_pushback(vec, '-')) + return (0); + return (1); +} + +int ft_handle_concat_and_padding( +t_arglist *arglist, +char *str_to_cat, +t_vector *vec, +int size) +{ + if (!ft_vector_concat(vec, str_to_cat + ft_strnonchr(str_to_cat, '-'), + ft_strlen(str_to_cat) - ft_strnonchr(str_to_cat, '-'))) + return (0); + if (padding_if_needed_after(arglist, 'd', size, vec) < 0) + return (0); + return (1); +} diff --git a/libft/ft_printf/ft_case_d_utils_bonus.o b/libft/ft_printf/ft_case_d_utils_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..6f41dfe076e6c3279d0b04de5396472765f05adc GIT binary patch literal 9552 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/25 17:09:37 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:46 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +static int handle_hashtag_prefix( +t_vector *vec, +t_arglist *arglist, +unsigned int nbr, +int flag_zero) +{ + if (arglist->flag_hashtag && !flag_zero && nbr != 0) + { + if (!ft_vector_concat(vec, "0x", 2)) + return (0); + } + return (1); +} + +static int apply_precision_padding(t_vector *vec, size_t *size, int precision) +{ + while ((int)(*size)++ < precision) + { + if (!ft_vector_pushback(vec, '0')) + return (0); + } + (*size)--; + return (1); +} + +static char *init_str_to_cat(t_arglist *arglist, unsigned int nbr) +{ + if (nbr == 0 && arglist->precision == 0) + return (ft_strdup("")); + return (ft_utoa_base(nbr, "0123456789abcdef")); +} + +static int handle_padding_and_prefix( +t_vector *vec, +t_arglist *arglist, +size_t size, +unsigned int nbr) +{ + if (arglist->flag_hashtag && arglist->flag_zero && nbr != 0) + { + if (!ft_vector_concat(vec, "0x", 2)) + return (0); + } + if (((int)size < arglist->precision) && (arglist->precision >= 0)) + { + if (padding_if_needed_before(arglist, 'x', arglist->precision + + (arglist->flag_hashtag * 2 * (nbr != 0)), vec) < 0) + return (0); + if (!handle_hashtag_prefix(vec, arglist, nbr, arglist->flag_zero)) + return (0); + } + else + { + if (arglist->flag_hashtag && nbr != 0) + size += 2; + if (padding_if_needed_before(arglist, 'x', size, vec) < 0) + return (0); + if (!handle_hashtag_prefix(vec, arglist, nbr, arglist->flag_zero)) + return (0); + } + return (1); +} + +int ft_case_x_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + size_t size; + unsigned int nbr; + + nbr = va_arg(*args, unsigned int); + str_to_cat = init_str_to_cat(arglist, nbr); + if (!str_to_cat) + return (0); + size = ft_strlen(str_to_cat); + if (!handle_padding_and_prefix(vec, arglist, size, nbr)) + return (free(str_to_cat), 0); + if (((int)size < arglist->precision) && (arglist->precision >= 0)) + { + if (!apply_precision_padding(vec, &size, arglist->precision)) + return (free(str_to_cat), 0); + } + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + if (padding_if_needed_after(arglist, 'x', size, vec) < 0) + return (0); + return (1); +} diff --git a/libft/ft_printf/ft_case_lowx_bonus.o b/libft/ft_printf/ft_case_lowx_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..28104aadbc8aeef32f58af7d219fc568ee9485d5 GIT binary patch literal 8528 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/23 16:22:40 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:47 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +//zero and precision flags have undefined behavior here +int ft_case_p_bonus_utils(t_vector *vec, char *str_to_cat, t_arglist *arglist) +{ + size_t index; + size_t size; + + index = ft_strnonchr(str_to_cat, '0'); + size = ft_strlen(str_to_cat + index); + if (padding_if_needed_before(arglist, 'p', (size + 2), vec) < 0) + return (0); + if (!ft_vector_concat(vec, "0x", 2)) + return (0); + if (!ft_vector_concat(vec, (str_to_cat + index), size)) + return (0); + if (padding_if_needed_after(arglist, 'p', (size + 2), vec) < 0) + return (0); + return (1); +} + +//zero and precision flags have undefined behavior here +int ft_case_p_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + void *arg; + int ret; + + arg = va_arg(*args, void *); + if (!arg) + { + if (padding_if_needed_before(arglist, 'p', 5, vec) < 0) + return (0); + if (!ft_vector_concat(vec, "(nil)", 5)) + return (0); + if (padding_if_needed_after(arglist, 'p', 5, vec) < 0) + return (0); + return (1); + } + str_to_cat = ft_addr_to_strhex(arg); + if (!str_to_cat) + return (0); + ret = ft_case_p_bonus_utils(vec, str_to_cat, arglist); + return (free(str_to_cat), ret); +} diff --git a/libft/ft_printf/ft_case_p_bonus.o b/libft/ft_printf/ft_case_p_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..8e641c087cf1f5150eb5fa1553e1d0a8109f968e GIT binary patch literal 7768 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/25 17:03:40 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:48 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +static int ft_s_sub_bonus(t_vector *vec, char *str_to_cat, t_arglist *arglist) +{ + size_t size; + + if (!str_to_cat) + { + size = 6; + if ((int)size > arglist->precision && (arglist->precision >= 0)) + size = 0; + if (padding_if_needed_before(arglist, 's', size, vec) < 0) + return (0); + if (!ft_vector_concat(vec, "(null)", size)) + return (0); + } + else + { + size = ft_strlen(str_to_cat); + if ((int)size > arglist->precision && (arglist->precision >= 0)) + size = arglist->precision; + if (padding_if_needed_before(arglist, 's', size, vec) < 0) + return (0); + if (!ft_vector_concat(vec, str_to_cat, size)) + return (0); + } + if (padding_if_needed_after(arglist, 's', size, vec) < 0) + return (0); + return (1); +} + +//flag 0 has undefined behavior with c so the minimum width has to be spaces +int ft_case_s_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + + str_to_cat = va_arg(*args, char *); + return (ft_s_sub_bonus(vec, str_to_cat, arglist)); +} diff --git a/libft/ft_printf/ft_case_s_bonus.o b/libft/ft_printf/ft_case_s_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..05c9bd0357156db9c062108697ee0163011840d9 GIT binary patch literal 6768 zcmbtY4{RG(8UN1bJG*t`ICYvhZ8lO3(lY3|X-jFlG^;~f9FcDQlh6iekF$NYZ*|Vm z-8t<#)|N(@=9RJ*2@QeNp$TnF+7Jj$Fd>yzo3xH0q=~UrW6}Uc8spDUHL-32t>}CA zJ^S*U2+%$$dEfVYzwdqTefRFY?|f?4=V&+P;9v?lscF*kJz1(R1AAd&Ak^J4^*%!0* zm$L2IYg?~m+xJ`>t>3)l0zkI@`e^++W9=H4o4wrr;4A=))^Ci~-^tcrXC2wu%eC>p zPG!&Tj%LqgquKghQ9nZM;;w`eXn%#BwvSN`^~o%KI_IrEjw;mnbY{@hx-R;hflk&$-NBpB!FyA9|_gC@wv24#$^ z_YxF_ccrmMx%GIH$kq4e5y@x~J{bx2arK`>l0X;f{RHr^66g;S^!ESbb)?m+B?qms z4!3$8{_itvcwKMIu*HifcXxxbm#fXC9ymw67pV=w=0~~ST>b&-ZHUw%eIlMz1xB!G^G&PWhST^LRQEDtVaum=Mr6*lG0e%7qOXWHdY zAD~;3a5<^fFp~Ui44}tf3cyN#8MuU1xG8%vTd~+s3;>SF0AZHeC_96eHPRdu-1{K} zl(3AA)O$PrXO2?uJwRhfy+3WLFC(3iZ~Y}UY83z?Cs4)FQc-OBLd%z6i+-U_U^=ox zE22%kE5Y=iBi@|?l_}_@N|9e-3;5U>5{as>VwgV?9A4>%3Hw9fti#LwFicN|+0aby z^g}Xz#j++&;ThiD*~C++rry&FODQBvmUIv;X&X9Wnwd!3FjE1uTb^fP#v1vT1~DgX z1Kjt{rEyfZ0{~O9T*3E)9X0HYPh4Pm@TEf<58V%tcxoQDKXej0qoZaq3DBKG)=9=%GFl0_enN&bp)y%xUu1A%G-; zNydDcG4ZLZxWgDTv=UL)mAsA`+bimOA%GSBP+f};)hh!;*09YEpvJq_liEEf1EgFT zK!P5eYHB6^KZ@NAEzC4W28cGag#Q9X!mE1GAsT5pkj2wjl<{26_G*3kieZ=frcKAS zs&?PN25r4Iux?;$jrDGXqNh(emhBbOMNiKguBp3vu4>m@Ef48(b<#|GWydm0>7Ax~ z)T>S*ZPKVzs`+%q$`w7ZY!3%q?(Y>mkH#{($QpIvTIA#^RvOa0q7EC#2 z-omv(v0{|;vf-9JqvRVWOsDE=_tad^Dq3biub4&8$J{9+Z~E#~rRMt6sTOs^Db*%T z+tXdovFsAKh_J9;L&Ft&PQ|og$|w{pyQEu1-8RjFSh5ZSaeMf=B2FIfUDD{Q>;{v;god4F%59clI|MQrf=!`w4vjybxen@ zXZG*UOy~zjzO+jpo7lTc*Fo2FHLK!THfI8P!2h^+eCecCIeZ%p!nfUq{^&85$@Hgd$L!r6&S_Y>Wg&n~F!xCN-Kf!ZRlKvHM z!v^mh2|#M>T1+18UrmE_&2?~FrYn`{$#nx8n9g2+w7>DwmYuKE3MPn2*YY@SY%bzm6vHs z?~Kx~7L^W9>DQEqI;zV1qMEW*P7f*(O^K>y1yuR&qSCI)Lv!dohtBd>HKkvbZyQu1 z*OaYlRP)K}kvwrxQB`@Vyqg#;4rwHe9OJr{l@S|i82{O{xh;?1pFk~4-5E1WPeYqYP z_dgr}`USj~>KSVi?MG64?kUFqlz&*rk zf)wGaus{cB-0NI6(?szs3ksheh6u-Pce0 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/25 17:07:14 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:49 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +static int ft_handle_padding_precision_bonus( +t_vector *vec, +size_t size, +t_arglist *arglist, +int padding_length) +{ + if (padding_if_needed_before(arglist, 'u', padding_length, vec) < 0) + return (0); + while ((int)size++ < arglist->precision) + { + if (!ft_vector_pushback(vec, '0')) + return (0); + } + size--; + return (1); +} + +// Plus and space flags have undefined behavior here +int ft_case_u_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + int size; + unsigned int nbr; + int padding_length; + + nbr = va_arg(*args, unsigned int); + if (nbr == 0 && arglist->precision == 0) + str_to_cat = ft_strdup(""); + else + str_to_cat = ft_utoa(nbr); + if (!str_to_cat) + return (0); + size = (int)ft_strlen(str_to_cat); + if (size < arglist->precision) + padding_length = arglist->precision; + else + padding_length = size; + if (!ft_handle_padding_precision_bonus(vec, size, arglist, padding_length)) + return (free(str_to_cat), 0); + if (!ft_vector_concat(vec, str_to_cat, size)) + return (free(str_to_cat), 0); + if (padding_if_needed_after(arglist, 'u', padding_length, vec) < 0) + return (free(str_to_cat), 0); + return (free(str_to_cat), 1); +} diff --git a/libft/ft_printf/ft_case_u_bonus.o b/libft/ft_printf/ft_case_u_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..55caefb4b2bdcac7e4534ba25fb0640c02245746 GIT binary patch literal 7424 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 literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_case_uppx_bonus.c b/libft/ft_printf/ft_case_uppx_bonus.c new file mode 100644 index 0000000..51f1101 --- /dev/null +++ b/libft/ft_printf/ft_case_uppx_bonus.c @@ -0,0 +1,115 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_case_uppx_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/25 17:11:07 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:50 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +static int handle_hashtag_prefix( +t_vector *vec, +t_arglist *arglist, +unsigned int nbr, +int flag_zero) +{ + if (arglist->flag_hashtag && !flag_zero && nbr != 0) + { + if (!ft_vector_concat(vec, "0X", 2)) + return (0); + } + return (1); +} + +static int apply_precision_padding(t_vector *vec, size_t *size, int precision) +{ + while ((int)(*size)++ < precision) + { + if (!ft_vector_pushback(vec, '0')) + return (0); + } + (*size)--; + return (1); +} + +static char *init_str_to_cat(t_arglist *arglist, unsigned int nbr) +{ + if (nbr == 0 && arglist->precision == 0) + return (ft_strdup("")); + return (ft_utoa_base(nbr, "0123456789ABCDEF")); +} + +static int handle_padding_and_prefix( +t_vector *vec, +t_arglist *arglist, +size_t size, +unsigned int nbr) +{ + if (arglist->flag_hashtag && arglist->flag_zero && nbr != 0) + { + if (!ft_vector_concat(vec, "0X", 2)) + return (0); + } + if (((int)size < arglist->precision) && (arglist->precision >= 0)) + { + if (padding_if_needed_before(arglist, 'X', arglist->precision + + (arglist->flag_hashtag * 2 * (nbr != 0)), vec) < 0) + return (0); + if (!handle_hashtag_prefix(vec, arglist, nbr, arglist->flag_zero)) + return (0); + } + else + { + if (arglist->flag_hashtag && nbr != 0) + size += 2; + if (padding_if_needed_before(arglist, 'X', size, vec) < 0) + return (0); + if (!handle_hashtag_prefix(vec, arglist, nbr, arglist->flag_zero)) + return (0); + } + return (1); +} + +int ft_case_upperx_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + char *str_to_cat; + size_t size; + unsigned int nbr; + + nbr = va_arg(*args, unsigned int); + str_to_cat = init_str_to_cat(arglist, nbr); + if (!str_to_cat) + return (0); + size = ft_strlen(str_to_cat); + if (!handle_padding_and_prefix(vec, arglist, size, nbr)) + return (free(str_to_cat), 0); + if (((int)size < arglist->precision) && (arglist->precision >= 0)) + { + if (!apply_precision_padding(vec, &size, arglist->precision)) + return (free(str_to_cat), 0); + } + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + if (padding_if_needed_after(arglist, 'X', size, vec) < 0) + return (0); + return (1); +} diff --git a/libft/ft_printf/ft_case_uppx_bonus.o b/libft/ft_printf/ft_case_uppx_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..a649e626a7c79218e2f2aedbb7d983a481700fb6 GIT binary patch literal 8536 zcmbtZYj7LY6+Wxgu9e7lVeHkBkaT=(yl(AD>6KXG^)unvp+4W( z@mSs3H^#>Cx2OEUv3|$RhmM=E<0D(g#_fepq*ALJyJd=i_Gh982mH&)1U4n%iG^?{Sn-qCsW zHA}9&Zt1dU*9~jet%r6TwM+HXO3=sb_h?B-u#>e!+E}sbWwuOKe)zl8`vgl5SA6v{ z`}_n&(K8b#Bf&;ypR4#9U@fMF#4M&(f`R44rmGMq_0<33X!B%8n%5kN)U@6H#LJgNIv|UQ^J~nTf#-2 zoEBAcTJ()dB8~XGJNvHkFrTfLV@~RFCVS@%N~JrjC|l1Pbmy*VX*0D^zk(Y1Wjc zZpK$R8N0b%>jzMyG%7XJw1L>>Eq;KO`}_bB%tqJEbMV*MOcl=WaASUeK!pp#+Zk@stf#4*x7$FWLp&&g%)ohD63FfKfG(v3p8 zG-&3W=vFQbMMRvic7@Bu3sA}xt#r;zwqm*&BbUsY`jC-KTDi1tyF5No8*okaA4Wz7`Rm_-4DC)yz!p;}KX2uvA%I-n8?tnQMmb_%= z4LxoYO%#fDA#3K4b3N#Zd=5*<$yq5qXPQYfsmIM!zTnu9=1{4ai5rRC7tl3Qwpk$e z$pH!6+b!#K9dtcjva+_7V@)6n@T`(gxkwvnA4qp@0%;^H&8e*k z9L9?d0Pt1IITlAl;jU0~SE#isbVXOFJsMgX4Xqiic~Cv1Jmmkpe4kH#QbMfV>2Gy( z!_koQ9t41&Im4el-pK&osMtR!t2O@p>lv4Gp4Et?%4T-?#=@XnrV zbN5=Cl}ltxNfW#?P~BjXgS-A{*JTKF=UB_&>%V9xlV(cGfDGVlx(aL*(k=`z&3Pvy z$>Sg?f$4!JWxBj2(60pKMJZ(8RO(bsxlB{ker39vQ9zY%d{e1W<#!>asOk!3nwn8m zdEnd1T(w_5wqH{^INrCxp+HYf`9 zilVMiG5Mm{P`(xYYO~#Q{Xqz zkZ|2&?f-q=CFdkU2YIXp8XE@}+@Avq@KGy$|M<46Q__znhLj~g>P2oqOg@nGn zemXojt||7j%7f!cmhqSe_vXLFgM0lO9^C6^j|a!K%l;oE9P5dHj34pnG=j(<$f(TgzjvyM9EQ;TVNchgmbv;SQrcM5op%mdqM{?MMqkpdR0uRn- zN2G-w9R0jT<7yZ1Cdy}(2S-1*kbbWRM?YLIi*Pi@dE`%zdj*_7PahHRJo*2ofOGwi z3HUpt{~H0HM){u;@Fj%T(?N*y>>>Oz0q1?OTEO>`zA51R2|Q1DWgba?Ou(Ne{7C`l zFX2BCa9;Ok1pICC<9>B>-%+?8&JunR9T_3tF=#@nV46IXY(C)~ zc=bAnqqB`TXvIB)PV0!g8e9iSERNy9c!u|wm}n*S%^dyba;1Zs7@YXKB#oihod zb3aE6pH*IR|M%&B==G9#7r`?+Ex`$Nm@Zm(Q$RdF;#%ZqZZl~ooqHHm&UsA#AiJ3i z5OMz8UQG5P1!*5FrIv~9m{1lmq#I~ZJA_U_gu_$VKS7)8A)z>;J)R#06^Fvk7f*oG zbU4TQAuHAo&%2^eq{a9^1Ax2Trb41Fe#1u$|7Yu^XUYDlDeA|5@SJ}k`;E>gdZ>I# zWnw#SpPnNB5waJF?U*9&{0|9fR_rsZNW}GH!gJ|`>i<`|!0#Q3k`{ki8n9uFo=HSd2Wv_}%- +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/23 13:03:05 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:51 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int padding_if_needed_before( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); +int padding_if_needed_after( + t_arglist *arglist, + char caller, + size_t len, + t_vector *vec); + +//flag 0 has undefined behavior with c so the minimum width has to be spaces +int ft_case_c_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + if (padding_if_needed_before(arglist, 'c', 1, vec) < 0) + return (0); + if (!ft_vector_pushback(vec, (char)va_arg(*args, int))) + return (0); + if (padding_if_needed_after(arglist, 'c', 1, vec) < 0) + return (0); + return (1); +} + +int ft_case_percent_bonus(t_vector *vec) +{ + if (!ft_vector_pushback(vec, '%')) + return (0); + return (1); +} + +int ft_case_d_bonus(t_vector *vec, va_list *args, t_arglist *arglist); + +int ft_case_i_bonus(t_vector *vec, va_list *args, t_arglist *arglist) +{ + return (ft_case_d_bonus(vec, args, arglist)); +} diff --git a/libft/ft_printf/ft_cases_easy_bonus.o b/libft/ft_printf/ft_cases_easy_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..921ecdb847af2dd2556b0d39ed2257aac361e981 GIT binary patch literal 6064 zcmbtYZ)_Y_5ubPKJ)eE{`RsGzbK5l6hBT%qd%o~5At=O7)1KR?oj>o*oA-A1&K*2-Z$b!Q60i>mQ)zh1Hd#Pp8Z0uTP!Ml)IP9+JWr(OQ~-9&qL*>52VV^ zmQ&^K1F4aV(}%h@q(S+@YEW3$)wSPT`e5sqW*(U_-zu$!qhpM0{i>YM$kuxR4qx03 z0MbqAm*oqqBQIR)UOw@b!%BaWszezY1uQVT(u2%1#6A&0#N9+}EnuG6pl5ZA9X%F7 zH+djpYXL`?UG7;u!j2w~AU0%rj+k%LC}4rv?-SGqSH;3BY``Q&#r8~2*D~3OTQj3# zED4bK7-*S&>2w-EGX!G$^DoX$YMIZa_ojDD&gH%^3DBoQVj_g*asYbwNg+zPQ2~&A z>PZ2K{PVMUfPO$NHNuOD#iR-v7`a$@3I@|^l0K7B*lCp zTS-;)yAa4>jFR<4}-pe z{H8FFZ0|;?&wroWf01c3?h{ z-JTQ++EuXtkqWX_!K~t(8I8p4+SiOVR0lBumm#Sk-HEQc}w&kBO7hBDaZ&aXIZ!OuypzgVLt$2^^p9)%S zR9&(fjaH@Da2K5bDs{_)wpFdV&6?>tX4AH-cGX<8ot9^V+YI2eTMg>wlG}8l?b#I< zCj(Bys+o1muLo8w6wcaSE94&S_<`%VcGYayP7q>#+p5?h+irAx@ZGbv*>X(Ft96#_ zW?=e(=QeBLBhqmF02-}ktiwWm`mso zYbDpEF`1{o-dOLU7G6X*kw$N2m9#ZG5RnF{NQjXJ!!aqO6Y_TK`mGL zdr1Fvdd4-djd1S2@MVJZ;|=^^d$^weUvGeKC4bnT;41!gBc#JI9ABV}KN`cak74}9 z7#`RENesvAv3`

RLxlR*3~(%(!Y>a$OzTVgos-%IlCG~yYG zb_d`SivB5*cWs~_eyc?D`5nEi9*FtrbpQbH#TbtB*+jul#&Fcf`at3aobzxe>AUnC zan%1N$xAUD{m+no^lcEX7wZY>RT?=Dd?#TSio|%6 z;Lj31q2MnOzD>cuOL$SiUn6|4g1<@leG2{#;l~vGJ;F@||2^Ri1@9wyMZtHI{DgvU zCixi!-$L?B3Vt`q-&1g2zxwFvG?4Lg#_bNEwe{+f-p2tH9&gZD2;Cx=%3eM-^9N|14uKQOMectc4 z75o>JhuKkx2;ZsT zI|$#a;JhCN+GkWFRY}Jcoa=}03D)QR{VD0=wBvrjsM?F2nrSUAdiF9Hp53sFz+MT! zsI-=_Gv=n{zjTM(LvkC-GWVDi#}C%)_QOs%3?9zMZ8|M5nytV#?t5@yrypPoy-rtc zVAEw<)vD*awRL)I`i_XZZn#aG0K0BFp0#B2>>8~KPh9EI3_tJ!YY`0p%o2|OFHPY$ z@j6a+(~FnyGbSpx9$}x1So|G~#P3NyUrcI`f`6XG`v9gN$gg+k{eOmbSTEd(z0 z8)7z!(cg$4R~{;&lvNCgTUmaeF{!%G)B05!qNL6$$yM#2*h>QS +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/22 18:52:37 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:52 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" + +int ft_case_c(t_vector *vec, va_list *args) +{ + if (!ft_vector_pushback(vec, (char)va_arg(*args, int))) + return (0); + return (1); +} + +int ft_case_percent(t_vector *vec) +{ + if (!ft_vector_pushback(vec, '%')) + return (0); + return (1); +} + +int ft_case_s(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = va_arg(*args, char *); + if (!str_to_cat) + { + if (!ft_vector_concat(vec, "(null)", 6)) + return (free(str_to_cat), 0); + } + else + { + str_to_cat = ft_strdup(str_to_cat); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + } + return (1); +} + +int ft_case_p(t_vector *vec, va_list *args) +{ + char *str_to_cat; + void *arg; + size_t index; + + arg = va_arg(*args, void *); + if (!arg) + { + if (!ft_vector_concat(vec, "(nil)", 5)) + return (0); + return (1); + } + if (!ft_vector_concat(vec, "0x", 2)) + return (0); + str_to_cat = ft_addr_to_strhex(arg); + if (!str_to_cat) + return (0); + index = ft_strnonchr(str_to_cat, '0'); + if (!ft_vector_concat(vec, str_to_cat + index, + ft_strlen(str_to_cat) - index)) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} + +int ft_case_u(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = ft_utoa(va_arg(*args, unsigned int)); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} diff --git a/libft/ft_printf/ft_cases_mandatory_one.o b/libft/ft_printf/ft_cases_mandatory_one.o new file mode 100644 index 0000000000000000000000000000000000000000..fdcfbff489db2a8be0c95169580553ac86537ec9 GIT binary patch literal 8808 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 literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_cases_mandatory_two.c b/libft/ft_printf/ft_cases_mandatory_two.c new file mode 100755 index 0000000..927e96d --- /dev/null +++ b/libft/ft_printf/ft_cases_mandatory_two.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_cases_mandatory_two.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/22 18:52:33 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:58 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" + +int ft_case_x(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = ft_utoa_base(va_arg(*args, unsigned int), "0123456789abcdef"); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} + +int ft_case_upperx(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = ft_utoa_base(va_arg(*args, unsigned int), "0123456789ABCDEF"); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} + +int ft_case_d(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = ft_itoa(va_arg(*args, int)); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} + +int ft_case_i(t_vector *vec, va_list *args) +{ + char *str_to_cat; + + str_to_cat = ft_itoa(va_arg(*args, int)); + if (!ft_vector_concat(vec, str_to_cat, ft_strlen(str_to_cat))) + return (free(str_to_cat), 0); + free(str_to_cat); + return (1); +} diff --git a/libft/ft_printf/ft_cases_mandatory_two.o b/libft/ft_printf/ft_cases_mandatory_two.o new file mode 100644 index 0000000000000000000000000000000000000000..d32c333101d33e3d67c62d492b7a8ac95c1fee93 GIT binary patch literal 7432 zcmd6sZ)_Y_5x{3}efHVsoX@@_w&T*cB}o%iUgzTGFKrT=Bt0V&nZ$0JM(t+rZtuLx z`PSOqv)zE8av*Sx0&O8Je1QnsB0$hm5J-STN>#OA3LijKKA;u}N`p!SQ9b}FG-!5b z_TE09r6zn~B;R}U+j%qZ-|o&^f9BxCp_rloivoM0p*7?SeU18lzq%iKK!NGe`;Ly+ z-#?qmo&MM6g;cKoT24KbKK)Xno_e=4clJ;scP^L6)ek4m?#i9pjtwv4Pp=aevqOS90~Yd{Do9eDvXmUhZ1|SwHIkalD%wSV`ldb*(=D zH!{APi?=nqZRD=)J9h5cZR86@vjhz=I`+{62M_tvjM7Fm1*W-L3em$EP12?NLz8K)J|CiGbHuG44Na!F z`a?p^dvuzvem`uutVc?>vN4s3tEqJFK&o5mX$6RB3Rd>_Jw4X1ruHO1lDwmTJhQJK zK#fDJH$dYVfR?)=YP`OrKsM8@0JPSZ6eXy(J+`DktnZ1jK7fR#G#uXDk1pHefUY{a z{35vl)YRT&G6~SR$tSBaikeC$u@?ZTRiLKEGpOuJ0(7l~@l4;VNqIDco0MgCoYalvb1JU^!h|brCZhF4L z&_-jaHbp~kiiX}44ZYb9JsJAB(WTms?b|V8umbUx(3Q}oY_v<+XqU3lE{)uDmpU%T z0J`{jruKFG6LpogZ9LW8N!6Y{6(EyS0Tft`OWC&ue{sh_SZncX_o@Jiu$G3ky=atZ zgXw&&>eU7d6{A`noHrfUva5sHZQ52XJCxmB^RJFT$G zZ08Z(Td=hP4A0oJ=CC*8SY~^ZcaH7XUmFkG?nB@g}7JloLohHFA$#&Dok zb**yMEDl;#|FY{j6|)KzyILNUug#kU&vx{JT`d?M3~%&nv39Cr%c`R3n*Dt z%bhWc;8F_=Yk9T-6axpKFCz78wYfRdX{g2Uf(7$t0X+6%IAs^gbGltBxuyrDux8Jj zPN`xq=!R3)4aYRVG0VDZ%$tFx>+^C_QW7SqZ=XItWN1zDkbvW_R66(xR)W(xMA}YiqI*SUeT#bkd?Gc?t4PI>#`3(T1BP0;aIeQ=$ zri%Wa1c1kgbHc_P_Y~T5vdg(P`bN&eya(Tz3U0^*~05 zNfYx4f#X^+e@Ngs+swaC9An~phB@AWD018%2waT&3xSJqUl+I-x0CW; z^pA-O$L$rk=zpWYMgKblF8cqJz(xO`7r5yEyud~O&k0=g&pWvT^E(rCH;WF#k-ZC|J?suY5aUj zL5}u2sJ)+P3*)+z?DLX;n{+-2v;PZZU!&_huAQVWNqmg-FG+lo^yjE#|5egolK3Y{ ze@)_#l8(l=zFpe<^W1523svabDLy5$Aq(kp4G;V?Q^Leof%w zJiIS(w11HF7`CuUK0gdee1QDyk@yzkpOE~&P4knN z_!Z)ohn1pCR5a@gni{65mREi^TU3ACdS0 z;`d1WKH}pNcZd(tI^!^KepooKV9w8tMKWN{_t7&F=Y8@5aSSK==hR$2o-Kk_H1oBx zZshZhIS-m+Rt(KE7d_Al_Ux<~oFk)WMQY-D4rmjaU--=ePgb>LV>mi{YE|1awR;aw z54oOEI2m@t0u2uox=}1Tu2n|fILwOvDpu7bV9w|z$Cx#t}UkjK5CpW#M)#uLSMq zq-BD~sXgZ(EIfV|%m +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/27 16:54:14 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:59 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +//len is the len of what's already printed +//returns the number of characters writen or -1 if an error occurs. +int padding_if_needed_before(t_arglist *arglist, +char caller, +size_t len, +t_vector *vec) +{ + char padding_char; + int i; + int padding_len; + + padding_len = arglist->width_mini - (int)len; + if (padding_len <= 0) + return (0); + if (arglist->flag_justified_left) + return (0); + if ((arglist->flag_zero == 1) && caller != 'c' && caller != 's' + && caller != 'p' && (arglist->precision < 0)) + padding_char = '0'; + else + padding_char = ' '; + i = 0; + while (i++ < padding_len) + if (!ft_vector_pushback(vec, padding_char)) + return (-1); + return (padding_len); +} + +//len is the len of what's already printed +//returns the number of characters writen or -1 if an error occurs. +int padding_if_needed_after(t_arglist *arglist, +char caller, +size_t len, +t_vector *vec) +{ + int i; + int padding_len; + + (void)caller; + padding_len = arglist->width_mini - (int)len; + if (padding_len <= 0) + return (0); + if (!(arglist->flag_justified_left)) + return (0); + i = 0; + while (i++ < padding_len) + if (!ft_vector_pushback(vec, ' ')) + return (-1); + return (padding_len); +} diff --git a/libft/ft_printf/ft_padding_bonus.o b/libft/ft_printf/ft_padding_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..37e9b2da6b4133ca29e90fe61cb517b6136fd62e GIT binary patch literal 5888 zcmbtYeQX?85udl~U0?ih{)|7;P#>ifv48A;kZuh;l@2Q0>5yzPl+ zotvJD4gR`vp0z!FscqmM9<_45=JxEZ{;PWV658YUo-6KI>8p6440A>=m9ylFOR4*q6e}{|t=kXo57tz2MX z_836rLe1ScUcLBC3;_HoU*}UEOw8SNeysWyA4U4(q%fG7B{f511N?){Jbsj{N=qqe*YPXOi`f&>bB$|B7cWQ1~V^^`ZA5)uSJG0^^ViOpod|{>G$9` z`KwhNC)ad5Lu>|9LVeYT4*ZeSzXXs_Und9?nyL%`C3#ql z6{cQ2$=GmL2Lot);3Na3@8Mm201<-)QAYYP&N>ayzp0H6&0S25HaFu$04=ScMkl(^ zxS<)KwFf4;Ja>TTb_gbi{R%(>PbtEWv=%?Tu;BJ72xtwe!13K>x1q(lJ_I5PH-E~) zX7{EQ=6Yj=*>kf3poySt1BMFBKJ*RDetfFGDA)kd$flJgXk;_WaR7)Qq+I=H09eQW zpgT0-@|*EdOzGqaUc&&CZZBC}j((^7(+!lar>&dx5qGd2eW*M0kpnC3vAfnCEVa8 z!&lVlCCv4%2A(9>yS?POzP=^EX(Kq^+a2J2eSzM;5t_yofL8H_DSa?AU$)(HEL}+1 zx!96fa;%~q8{TRR8N*wKca-_lZIE@7izUl;vvJf?nT%!UlJiBo>=^Z3D`%UT7`i#uF*E56khN^f$(tE)C=`g*SlOg)ni(^boHw(@lDW!*RMs_1 zkSgU0mgB-tr;u4pU~y*?2gs%Q^3 zd`>;3D2LFD@ki~6Xe1FG;=ZCsz*mTT6VX_u;X(A7z(5{5HYRj$vOD>U^cb#)v3H`a zIAHlR0OnU$sLl)n;$^3V)e|oimKL@QZ{<2K)VNomam!8@${7>5pH!8Mqh7rkc{~vv zH zf73o5dYp&e!9#0}`jDpUd(_xv1VfQ739}>Ye3vqC#sOmIHwHIuyVFfKE{SeudW;0NhWw z5YdGmBmfWRMgaH^_SCgnP24v!t`om0eER|TcPQfi-NonhMBvwv-4nt^Oq2~F9OK+f z_SH0Et^36V0GlO#p6sn_@I{v>*7Gd!J|2qW-){i0FNEWIu8@642uJ>2vPH)v;(wOz zCQIVu8;r6*qu`$;{*e%l@kLK|cL>MzoFe{xAsqQbgr5%K$p1XykA!gKX9<5agd_iP z!k-M`$gdLqjS!CfGlZWd98LVaL`VOU#4nKjR|yyXV!y@yEEDftiSOr0^9%kriPt0H z-zNNe2|q>nHVJ=%@EaxkVZsxH>t`CB0z`LB_^ z5Wg`AfM}CZ6n!7_d@?B~Ot03Z7>-+VQ}bXrM;CDXzXd;wv94wLWrv5n zDLtT{%NOh$5ewgKDB}JRpAJIgyBz;b;(suOzeWG>#PGKTUh`A`3k`EOYxfA2F4U=a@&>Va^N<@`TD^NW2F zGK5V|=)4so)+$EqLr|Cf|3DLM5{@LoPmK6a0-=XRTNkzhk-6XZ{1>Hdf(ZGG_g#p{ zU&wdY*uVR!ennnbKUh-2U)0an)>!`+Y5q@13zkgy>KgN(rTN7?I6ro`^8Cl}{o7kB l0>BB86N-5MgoyV>o*(-qdGAo(#)BOI-tq?Shb1A;|6ikMf6xE` literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_printf.c b/libft/ft_printf/ft_printf.c new file mode 100755 index 0000000..f7dc765 --- /dev/null +++ b/libft/ft_printf/ft_printf.c @@ -0,0 +1,126 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/21 18:24:04 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:03 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" + +int ft_case_c(t_vector *vec, va_list *args); +int ft_case_percent(t_vector *vec); +int ft_case_s(t_vector *vec, va_list *args); +int ft_case_p(t_vector *vec, va_list *args); +int ft_case_u(t_vector *vec, va_list *args); +int ft_case_x(t_vector *vec, va_list *args); +int ft_case_upperx(t_vector *vec, va_list *args); +int ft_case_d(t_vector *vec, va_list *args); +int ft_case_i(t_vector *vec, va_list *args); +int handle_percent_bonus(const char *str, t_vector *vec, va_list *args); + +//properly frees the vector and return string +void ft_cleanup(t_vector **vec, va_list *args) +{ + ft_free_vector(vec); + va_end(*args); +} + +//returns the number of characters to skip after the % sign +//or 0 if something goes wrong +int handle_percent(const char *str, t_vector *vec, va_list *args) +{ + if (str[0] == '%' && str[1] == 'c') + return (ft_case_c(vec, args)); + if (str[0] == '%' && str[1] == '%') + return (ft_case_percent(vec)); + if (str[0] == '%' && str[1] == 's') + return (ft_case_s(vec, args)); + if (str[0] == '%' && str[1] == 'p') + return (ft_case_p(vec, args)); + if (str[0] == '%' && str[1] == 'u') + return (ft_case_u(vec, args)); + if (str[0] == '%' && str[1] == 'x') + return (ft_case_x(vec, args)); + if (str[0] == '%' && str[1] == 'X') + return (ft_case_upperx(vec, args)); + if (str[0] == '%' && (str[1] == 'd')) + return (ft_case_d(vec, args)); + if (str[0] == '%' && (str[1] == 'i')) + return (ft_case_i(vec, args)); + return (handle_percent_bonus(str, vec, args)); +} + +static int ft_parsing_loop( +t_vector *return_vector, +const char *str, +va_list *args +) +{ + char *next_percent; + int nb_character; + + while (*str) + { + next_percent = ft_strchr(str, '%'); + if (!next_percent) + { + next_percent = ft_strchr(str, '\0'); + if (!ft_vector_concat(return_vector, str, (next_percent - str))) + return (0); + return (1); + } + if (!ft_vector_concat(return_vector, str, (next_percent - str))) + return (0); + str = next_percent; + nb_character = handle_percent(str, return_vector, args); + if (!nb_character) + return (0); + str += nb_character; + str++; + } + return (1); +} + +//returns the number of characters written or -1 on errors +int ft_printf(const char *str, ...) +{ + int nb_character; + t_vector *return_vector; + va_list args; + + if (!str) + return (-1); + va_start(args, str); + return_vector = ft_create_vector(2); + if (!return_vector) + return (-1); + if (!ft_parsing_loop(return_vector, str, &args)) + return (ft_cleanup(&return_vector, &args), -1); + nb_character = write(1, return_vector->buffer, return_vector->index); + return (ft_cleanup(&return_vector, &args), nb_character); +} + +//returns the number of characters written or -1 on errors +int ft_dprintf(int fd, const char *str, ...) +{ + int nb_character; + t_vector *return_vector; + va_list args; + + if (!str) + return (-1); + va_start(args, str); + return_vector = ft_create_vector(2); + if (!return_vector) + return (-1); + if (!ft_parsing_loop(return_vector, str, &args)) + return (ft_cleanup(&return_vector, &args), -1); + nb_character = write(fd, return_vector->buffer, return_vector->index); + return (ft_cleanup(&return_vector, &args), nb_character); +} diff --git a/libft/ft_printf/ft_printf.h b/libft/ft_printf/ft_printf.h new file mode 100755 index 0000000..9928f16 --- /dev/null +++ b/libft/ft_printf/ft_printf.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 12:38:59 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:20 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRINTF_H +# define FT_PRINTF_H + +# include +# include "../ft_vector.h" + +int ft_printf(const char *format, ...); +int ft_dprintf(int fd, const char *format, ...); + +#endif diff --git a/libft/ft_printf/ft_printf.o b/libft/ft_printf/ft_printf.o new file mode 100644 index 0000000000000000000000000000000000000000..22111475e017fd11b0cb75aff38cc32039713bec GIT binary patch literal 13704 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 Y&uO#}m5iwm+lU^PKRIr`kJ8isUx=LE=l}o! literal 0 HcmV?d00001 diff --git a/libft/ft_printf/ft_printf_bonus.c b/libft/ft_printf/ft_printf_bonus.c new file mode 100755 index 0000000..f48dee4 --- /dev/null +++ b/libft/ft_printf/ft_printf_bonus.c @@ -0,0 +1,139 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/23 12:55:41 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:00 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../libft.h" +#include "ft_printf.h" +#include "ft_printf_bonus.h" + +int ft_case_c_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_percent_bonus(t_vector *vec); +int ft_case_s_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_p_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_u_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_x_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_upperx_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_d_bonus(t_vector *vec, va_list *args, t_arglist *arglist); +int ft_case_i_bonus(t_vector *vec, va_list *args, t_arglist *arglist); + +static int ft_handle_percent_bonus_i( +const char *str, +t_vector *vec, +va_list *args, +t_arglist *arglist) +{ + int offset; + + offset = arglist->size_of_argument_string; + if (str[0] == 'i') + { + if (ft_case_i_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + return (free(arglist), 0); +} + +static int ft_handle_percent_bonus_xd( +const char *str, +t_vector *vec, +va_list *args, +t_arglist *arglist) +{ + int offset; + + offset = arglist->size_of_argument_string; + if (str[0] == 'x') + { + if (ft_case_x_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + if (str[0] == 'X') + { + if (ft_case_upperx_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + if (str[0] == 'd') + { + if (ft_case_d_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + return (ft_handle_percent_bonus_i(str, vec, args, arglist)); +} + +static int ft_handle_percent_bonus_spu( +const char *str, +t_vector *vec, +va_list *args, +t_arglist *arglist) +{ + int offset; + + offset = arglist->size_of_argument_string; + if (str[0] == 's') + { + if (ft_case_s_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + if (str[0] == 'p') + { + if (ft_case_p_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + if (str[0] == 'u') + { + if (ft_case_u_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + return (ft_handle_percent_bonus_xd(str, vec, args, arglist)); +} + +//returns the number of characters to skip after the % sign +//or 0 if something goes wrong +int handle_percent_bonus(const char *str, t_vector *vec, va_list *args) +{ + t_arglist *arglist; + int offset; + + arglist = ft_create_arglist(str, args); + if (!arglist) + return (0); + offset = arglist->size_of_argument_string; + str += offset; + if (str[0] == 'c') + { + if (ft_case_c_bonus(vec, args, arglist)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + if (str[0] == '%') + { + if (ft_case_percent_bonus(vec)) + return (free(arglist), offset); + else + return (free(arglist), 0); + } + return (ft_handle_percent_bonus_spu(str, vec, args, arglist)); +} diff --git a/libft/ft_printf/ft_printf_bonus.h b/libft/ft_printf/ft_printf_bonus.h new file mode 100755 index 0000000..a041aec --- /dev/null +++ b/libft/ft_printf/ft_printf_bonus.h @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf_bonus.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/23 13:04:14 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:01 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRINTF_BONUS_H +# define FT_PRINTF_BONUS_H + +typedef struct s_arglist +{ + int width_mini; + int precision; + int flag_hashtag; + int flag_zero; + int flag_justified_left; + int flag_space; + int flag_plus; + int size_of_argument_string; +} t_arglist; + +t_arglist *ft_create_arglist(const char *str, va_list *args); + +#endif \ No newline at end of file diff --git a/libft/ft_printf/ft_printf_bonus.o b/libft/ft_printf/ft_printf_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..b73bc52e93be67c6e7d06740caf4530177c44c66 GIT binary patch literal 10624 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 literal 0 HcmV?d00001 diff --git a/libft/ft_printf/libft.h b/libft/ft_printf/libft.h new file mode 100755 index 0000000..7805aa4 --- /dev/null +++ b/libft/ft_printf/libft.h @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 12:38:59 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:08:22 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H + +# include +# include +# include + +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +size_t ft_strlen(const char *s); +void *ft_memset(void *s, int c, size_t n); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dest, const void *src, size_t n); +void *ft_memmove(void *dest, const void *src, size_t n); +size_t ft_strlcpy(char *dst, const char *src, size_t size); +size_t ft_strlcat(char *dst, const char *src, size_t size); +int ft_toupper(int c); +int ft_tolower(int c); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +int ft_strncmp(const char *s1, const char *s2, size_t n); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +char *ft_strnstr(const char *big, const char *little, size_t len); +int ft_atoi(const char *nptr); +char *ft_strdup(const char *s); +char *ft_itoa(int n); +char *ft_itoa_base(int nbr, char *base); +char *ft_addr_to_strhex(void *addr); +char *ft_utoa(unsigned int n); +char *ft_utoa_base(unsigned int nbr, char *base); +size_t ft_strnonchr(char *str, char c); + +#endif \ No newline at end of file diff --git a/libft/ft_priority_queue.h b/libft/ft_priority_queue.h new file mode 100755 index 0000000..9b7047b --- /dev/null +++ b/libft/ft_priority_queue.h @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_priority_queue.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/19 14:51:31 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:58 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRIORITY_QUEUE_H +# define FT_PRIORITY_QUEUE_H + +# include "libft.h" + +typedef struct s_priority_queue_node +{ + void *data; + size_t priority; +} t_priority_queue_node; + +typedef struct s_priority_queue +{ + t_priority_queue_node *nodes; + size_t size; + size_t capacity; + int (*compare)(void *, void *); +} t_priority_queue; + +void ft_insert_pq( + t_priority_queue *pq, + void *data, + size_t priority); + +t_priority_queue *create_priority_queue( + int capacity, + int (*compare)(void *, void *)); + +void *peek(t_priority_queue *pq); + +void *dequeue(t_priority_queue *pq); + +void free_pq(t_priority_queue *pq); + +#endif \ No newline at end of file diff --git a/libft/ft_priority_queue/ft_priority_queue.c b/libft/ft_priority_queue/ft_priority_queue.c new file mode 100755 index 0000000..97b2f54 --- /dev/null +++ b/libft/ft_priority_queue/ft_priority_queue.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_priority_queue.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/19 14:51:23 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:06 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_priority_queue_private.h" + +void ft_insert_pq(t_priority_queue *pq, void *data, size_t priority) +{ + t_priority_queue_node new_node; + + if (pq->size >= pq->capacity) + ft_resize_pq(pq); + new_node.data = data; + new_node.priority = priority; + pq->nodes[pq->size] = new_node; + pq->size++; + heapify_up(pq, pq->size - 1); +} + +t_priority_queue *create_priority_queue( +int capacity, +int (*compare)(void *, void *)) +{ + t_priority_queue *pq; + + pq = malloc(sizeof(t_priority_queue)); + if (!pq) + return (NULL); + pq->nodes = malloc(capacity * sizeof(t_priority_queue_node)); + if (!pq->nodes) + return (free(pq), NULL); + pq->size = 0; + pq->capacity = capacity; + pq->compare = compare; + return (pq); +} + +void *peek(t_priority_queue *pq) +{ + if (pq->size == 0) + return (NULL); + return (pq->nodes[0].data); +} + +void *dequeue(t_priority_queue *pq) +{ + void *ret; + + if (pq->size == 0) + return (NULL); + ret = pq->nodes[0].data; + pq->nodes[0] = pq->nodes[pq->size - 1]; + pq->size--; + heapify_down(pq, 0); + ft_shrink_pq(pq); + return (ret); +} + +void free_pq(t_priority_queue *pq) +{ + free(pq->nodes); + free(pq); +} diff --git a/libft/ft_priority_queue/ft_priority_queue.o b/libft/ft_priority_queue/ft_priority_queue.o new file mode 100644 index 0000000000000000000000000000000000000000..3fc001fef0d336b8fac2a5270356626e9ef6e542 GIT binary patch literal 6448 zcmb_gYiwLc6+W}qbG_MhcGq^CY#vQqnl@EQuI(m)v~k+3^SVx)G~hT*6q04Vdu^}0 z-gS2G=25DqjY-AUkOEN!sGuOkLj?&Hgj6IXNR&zqk00d^1o23J0HrDssj7xT3qfb@ zId|{Q+JYaPAA9F~^UawvGiPSb?3o=yJ3~SMi-3oquGQt{qI!9&DsF{#5RiH_b#QpF z_N&3#-|gCa_Ux{(y?Ixn+-BFV{{?CG?6$By8?`UL)-qJ<7eh5ygzec%*#68;Vb`{W z?b`Jtsbi`18%U0?f)QozR_$Lu=>`DL#JNlE2D^5}&fc(Vf3q*Y-r~VE18X|$SGI*! zPqoR!P_2@DGs1oM{noBsJCZtf^vakOU-d~Ofjx633~sAE+iK6kmA*@Xs`#qy0I7q+ z`_(AUU2;FDMid{K?L+tDiS6N=@pfU)>-`Mu_jrpQ*%D(d=P2wO(Df!o^-68s_3gf?D8hF>=xGheWiCyJMZw zh$WURkF|>q6Ce}^0K*cfZB2e*V5t#%FuFOqX6eIA0a_%4mUzHmCxG10pqjO_LiBaE z3xL*V&I$-6KR1vB2z&5z152@HfhE{tzp@#TfVQG>^=a!AMl2e|E&&!U1S2-siOQxZ zKx{D#c6yBg;;X@kJrs>b0TNweuyf5)fc81u9_&QNJ0ygXb;sdM2%tqxf;ZD`JR=Q) zlNT}=+6w^UQPf1-YpaT7-;`4C1GcQxI|YEmB8q5#2LQ}(kc!eOMnV;U@FTQN0Sp$P z5?UPjK7OMw0eEh98_9);+{A@i2C9tR7|X-;@`{8iuSfijBt)^}7@x$(Vm01`(VI2)RT#TL!0mN_-QH+%^GFmOV)$VK|QylL;;gl=+ zQn9=5eyi8&Ti5qMRn@MCF*iM3&X>x0_jLMr)u}o?O^B6+o{7?w)8kH*^UiqBcBeAw zmZp(7l_?ZT*`7jvbj(FlWv7yV%t=olhhiz`R3MjeGr;ztP%4ghSBsVWc+tsq=Zh{V zwhI-_hcvbZ-7^oxCXmfcXR>+sG-OLt)0wgZ%9v&aCY;Q4e(ZF*I_(#8rIST;v@%i7 z7bnrtF*ltrR-CenO1A7|Tt~N~I|9>=GYL6I%@>T79W`Pcv~$vPvh29h$T{9U&i^+6IeE8{aVwns*@ zrg8YJ6sED(k`TU2#v`55G!My`*(;Zr{Zg1)Ok;1ivEGtkz9S=%y`BsG#x6^?na1XR z*=6?2)#eu2Ztj*5b4G>^S4|_Oj9!LA62g0BG_psA%zpE5XaNNBW?lZRu9dfL>o|&m zvonVn_0zRMjQTm)AOjlC&BjN<_b?{yiWw|VEkMs`)2|;#v9Mu zGXWg=JkIk09Qiz-Ukc#J-$VLW0(dZL_0 zKhSU<*Ut$@H-i0wm2*a`+BdSU;%2gwU}4^w&g63CN`Bl=^XGmV1kD%n zMTY=qB0W~lOnHw3@LowgoSao zdS^5U()2N*e3vHW9}Vng?$jI@%C~4xGykRkiFw9_6krW4FeLQ;{{v7b(USlG literal 0 HcmV?d00001 diff --git a/libft/ft_priority_queue/ft_priority_queue_private.h b/libft/ft_priority_queue/ft_priority_queue_private.h new file mode 100755 index 0000000..122495e --- /dev/null +++ b/libft/ft_priority_queue/ft_priority_queue_private.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_priority_queue_private.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/19 16:41:11 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:08 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PRIORITY_QUEUE_PRIVATE_H +# define FT_PRIORITY_QUEUE_PRIVATE_H + +# include "../ft_priority_queue.h" + +void heapify_up(t_priority_queue *pq, size_t index); + +void heapify_down(t_priority_queue *pq, size_t index); + +void ft_resize_pq(t_priority_queue *pq); + +void ft_shrink_pq(t_priority_queue *pq); + +#endif \ No newline at end of file diff --git a/libft/ft_priority_queue/ft_priority_queue_utils.c b/libft/ft_priority_queue/ft_priority_queue_utils.c new file mode 100755 index 0000000..c51e00f --- /dev/null +++ b/libft/ft_priority_queue/ft_priority_queue_utils.c @@ -0,0 +1,118 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_priority_queue_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/19 16:00:58 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:07:01 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_priority_queue_private.h" +#include "../ft_printf/ft_printf.h" + +static inline void pq_swap(t_priority_queue_node *a, t_priority_queue_node *b) +{ + t_priority_queue_node temp; + + temp = *a; + *a = *b; + *b = temp; +} + +void heapify_up(t_priority_queue *pq, size_t index) +{ + size_t parent; + + while (index > 0) + { + parent = (index - 1) / 2; + if (pq->nodes[index].priority < pq->nodes[parent].priority) + { + pq_swap(&pq->nodes[index], &pq->nodes[parent]); + index = parent; + } + else if (pq->nodes[index].priority == pq->nodes[parent].priority + && pq->compare(pq->nodes[index].data, pq->nodes[parent].data) < 0) + { + pq_swap(&pq->nodes[index], &pq->nodes[parent]); + index = parent; + } + else + { + break ; + } + } +} + +void heapify_down(t_priority_queue *pq, size_t index) +{ + size_t smallest; + size_t left; + size_t right; + + smallest = index; + left = 2 * index + 1; + right = 2 * index + 2; + if (left < pq->size + && ((pq->nodes[left].priority < pq->nodes[smallest].priority) + || (pq->compare(pq->nodes[left].data, + pq->nodes[smallest].data) < 0))) + smallest = left; + if (right < pq->size + && ((pq->nodes[right].priority < pq->nodes[smallest].priority) + || (pq->compare(pq->nodes[right].data, + pq->nodes[smallest].data) < 0))) + smallest = right; + if (smallest != index) + { + pq_swap(&pq->nodes[index], &pq->nodes[smallest]); + heapify_down(pq, smallest); + } +} + +void ft_resize_pq(t_priority_queue *pq) +{ + size_t new_capacity; + t_priority_queue_node *new_nodes; + size_t i; + + new_capacity = pq->capacity * 2; + new_nodes = malloc(new_capacity * sizeof(t_priority_queue_node)); + if (!new_nodes) + return ; + i = 0; + while (i < pq->size) + { + new_nodes[i] = pq->nodes[i]; + i++; + } + free(pq->nodes); + pq->nodes = new_nodes; + pq->capacity = new_capacity; +} + +void ft_shrink_pq(t_priority_queue *pq) +{ + size_t new_capacity; + t_priority_queue_node *new_nodes; + size_t i; + + if (pq->size >= pq->capacity / 4 || pq->capacity <= 4) + return ; + new_capacity = pq->capacity / 2; + new_nodes = malloc(new_capacity * sizeof(t_priority_queue_node)); + if (!new_nodes) + return ; + i = 0; + while (i < pq->size) + { + new_nodes[i] = pq->nodes[i]; + i++; + } + free(pq->nodes); + pq->nodes = new_nodes; + pq->capacity = new_capacity; +} diff --git a/libft/ft_priority_queue/ft_priority_queue_utils.o b/libft/ft_priority_queue/ft_priority_queue_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..8e7d69e91f7af5e7e181ec69329cd3ca80724201 GIT binary patch literal 7944 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 17:16:09 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:19 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + write(fd, &c, 1); +} diff --git a/libft/ft_putchar_fd.o b/libft/ft_putchar_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..07b07b61b4d7316fb8772d9f32709cf94cd9d95c GIT binary patch literal 2888 zcmb_e&u<$=6#iy68#{4pI|)#mAY_R^4yfyxN}vL2Lsg)a3IvD+2!UCz*Y?u&ZnPe! zX@w{%7lH(84hRHX;KYFf5Q^g95_|Or#0&xygK8OxLjhhK=3d)?ayHC3ogEzLNWjEO)>EmDZp9P8sCo zgrTXX%aSs1A+>K7N|#|%O|Kj8w4tWeG1bhP18jlaT3oWsV)@8&ae*z)0*1|KvR--f zRMjlrUAU*PT0L0>Obf=5ggCnd%(>JWK;U9RpZ>G>q$h=mw*X zhirJZOM8t%f57V~r1`{DsC}m2ypvbZ6;%dr0ys z&N1wc*BJw>m_gx{MI6G7#h zssjZ*ev);L@Ut|aK9Yv6d+Y%FXQkq|Y2zun_5tVb%kzIC_o4IC9qZ@6Meez#`B|39 z|CYw9_|-`LhvvHdr_z4)U+hm#ITPWhbn&I2{3={b?6-9FUnHT&rOvOw54gXIOvrTp z6sFu?|A6?*vRQVNBMCiz`hLo%%3y7ZfBH(P_*GogZ_RW25s*z)ReuVqZgl^jX?;#% QN5=o7B*>0_vg-c-1{`te*Z=?k literal 0 HcmV?d00001 diff --git a/libft/ft_putendl_fd.c b/libft/ft_putendl_fd.c new file mode 100755 index 0000000..a7cf3d6 --- /dev/null +++ b/libft/ft_putendl_fd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 17:37:39 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:21 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl_fd(char *s, int fd) +{ + ft_putstr_fd(s, fd); + ft_putchar_fd('\n', fd); +} diff --git a/libft/ft_putendl_fd.o b/libft/ft_putendl_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..ac9620ba51cec08e4ac308c1023495409b5036e7 GIT binary patch literal 2960 zcmb_eO>7%g5dPk7>^O02#|hAcB4ml59#Gc}MW`vzrcwEmDvBB#geqkGvyQE<*I{=Z z1tcgc;*d&+f6*H!IKYK+f)nZqAx>O5a4t7cjvxii?#%l6)s{H$N!EMwy_tFQ-kX{A z)u%5!V<`oJ!WoRD5nh}f&DZ1UI!aL3+}poR;*awH_I|(o$4Cvxv7k_s>D^4tU|-d~ z(3N%AEGSfEx{y+vGSz)m@9?Ec>Y>6?#x5)zIa(;G#VlYsiYDvJpKq+#h12;b^2b)r zt^jrh){%sGehHY_yQb9YQb_@s>(>;l<&QR&fowv5wy{DhvyKuMPsUDi8IbW@F&^e0 zgk3n3&*uUB1Yjl(KNnx^A^oT+=roo{B&e53QboA|sN$DEdN)wTo8p`#HG5yx zGOB9tt17bJkF8a$kTle3Abw42Ek_P>ebRCQ&+-qm@JnwdT-|hUJ#m z@VCl4ZV>hcetGp#=Y+F*e06OYubxCFs&5Y?*Kd3EPTOgr(jD~OO4JQ{?pEcz8(xV9 z+m%jK?>9Ve(5iU7W+!5!Fbe9OHd@_AfSxZbiA0Y%Mu<-PzlL-d--LSe64dU3I(ld} z_n`vrL-HfU`E;(Z@UC^SAo+SJe!Iu$A(Z;NaF_;qL@)DoM=_XY)m%gZ7 zR2ggjsaGs=!NE*G{G|BnV8RmYQGSfU=Ik<4ON< zmhb10o+y1g0FO-J*O-@huCko;$fTmu0tRs2(0`xhiyBY*;&)TyDb5dAZt^H`O1{2r z@bWI78h$Rb{EfkPS^m!8`z-%p@UOF6=8^79zqfPDOPnd3w%Z(T)f>%b;O@W)T(99o z?rsF9HR$(UKN5{F3V1oO==q%i9DfkG&a*Gnj)zgBbp?*+?ey!7b~^}rTVv{8&v%({ zyY)`c=)2>sCg~}YI}C5>4O(|px)Vl0)M&y9-{{l$KjD_%;Wg}X^8TuE1hbV;pCeAs zb%NxhO? zXD6JAa9b}*4YIEwOzgK!b+JDsiVQiwz@Kt|&v8OZp3wc#exd AH2?qr literal 0 HcmV?d00001 diff --git a/libft/ft_putnbr_fd.c b/libft/ft_putnbr_fd.c new file mode 100755 index 0000000..1e843ef --- /dev/null +++ b/libft/ft_putnbr_fd.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 17:44:20 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:23 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static unsigned int ft_abs(int a) +{ + if (a < 0) + return (-a); + return (a); +} + +void ft_putnbr_fd(int n, int fd) +{ + if (n < 0) + ft_putchar_fd('-', fd); + if (ft_abs(n) < 10) + ft_putchar_fd(ft_abs(n) + '0', fd); + else + { + ft_putnbr_fd(ft_abs(n / 10), fd); + ft_putnbr_fd(ft_abs(n % 10), fd); + } +} diff --git a/libft/ft_putnbr_fd.o b/libft/ft_putnbr_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..41a714c0d22b4aa1e3b41cba40a0eb3b0c091232 GIT binary patch literal 3320 zcmb_e&2Jk;6#tFayRqZMb`q4>4Q(yH+CsBQi1;d1^Fe^51SpiG6jUtRS;waKIv9feMICp3)voe-noylgiW3|<>%WH#Ump5)<-`B2OyAqk$5EksGbN&wx zthk1cubsKNaOt;C{e6+IuaDN&pC5kV)GxGckcTqGM~10Wd|Ikge6|JF#%>RH=vp}1 z)g5kQ?FQg8nHD}2dN8yvKHiZC0h$hv81Df5w?PXZ357y{ZZfhMioHJ)7Z!tYz|i6A zs#`SeX8j$c_-yE8=tKwz=eQwZEsZA1v{lz*36#qy^3Zw>5KLtcuexD(^F`ye-Igr><}-vOC&jZ;AKP0nR=U{bsyC= z!}LWUwVECAu^aCnn>#IP-t*oDjTeUs4OEsN~2QwYtzGH5>MU*KP&OFzNp4#QM??Y^of_VYv=2Nzk|!25-;{7?2>re=N>Na z;Um3~t;+{+m!kh1m+w<}o68R=e2U9Q6<*~36z5gHNk#uHE@vg)ZB-mEN<8KDE|;qc z{~nj$;G^)no68?5y!XumE-AeD%&aQB*ym4$f0D}vIrQq#J!kQLx;QWHQSb*8ev$8! z;3M6Yd|x77k=GW?X)9fwNv6{2vNZ>@Y!yb9AHFO)LVR9#hQl>%6%)qQT zWha$}Sy?F3`2XND@rhILI~5^-?-ZUN{}!k}6DQXcL7cm|HvzSWM3lM~IL3>5j1y!> z_bNJ8jPuLfzlzT};eLQ6sPU7ma)e*G%~z5wLDhA?D2fi@6HfLii;4*I2Kg`Z{P*+6 zO!?CptNGu`W9n04_>tRvpzy-K7^(l!T(!4(Guihq_Jcc|3E`sLj3fxZ0u|4GR<2pX zGPf7^FCg+4pg!yUC2YjE{QZh|LgyFS;rytM)R+iAbN}x&Zo5sF{&4T)e{~1{^i>t{ mi@2x{Y7?9EfBkjYm8d@fQ8#L=Un>1hV4eph_hSl4_5TmO_&zrP literal 0 HcmV?d00001 diff --git a/libft/ft_putstr_fd.c b/libft/ft_putstr_fd.c new file mode 100755 index 0000000..b2861d5 --- /dev/null +++ b/libft/ft_putstr_fd.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 17:31:53 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:24 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if lst or new are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_putstr_fd(char *s, int fd) +{ + size_t len; + + if (!s) + return ; + len = ft_strlen(s); + write(fd, s, len); +} diff --git a/libft/ft_putstr_fd.o b/libft/ft_putstr_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..8018e8e4310bd2eab02394f860264a27d7d7164b GIT binary patch literal 3424 zcmb_eTWB0r82-*qW_Qy~C%4)rR&+(%2DGzHs}I%ErlpqziWZZtR?%fIv%6zwXXDIl ztP#AVC~UzSScHn`gZiQ`qSzPp!4`e>RUb-xQbF;C2v&^zGv}X7PP5>HA0+4e-}x`+ z^8f$r(?^aUO$h;pz<#VstH}4S&ZolZ6ow%%{oG2BFV3Fm{xRLX`aLalf1d7MneKi* zefDzpp@)AU>Jr;-loNp>Pj8B;S)Oi_R3Cm9#Wz{n9xE2*>>6x{Rpxk_kExS9WryT` zZXNe?s^1Ywu%W;SRYeSoZN{js8ADsP8pC2F4Wvv#lc}-S4vlNZUAen+JH`);1DcN1 zmWY@c1^Vt-BkJ8HfyvQf0i?T2LQIaHKQvBK=G>A%YV4ImV?fpv>~UsvU+A@82YK6Y zD>P$&E|&vxgCR4pJsdVl6MaW)V$h8aZpO@L{7f!g1Da~ zF`_XkMt%a25SL@eq`2uf0Q#$}4Iuq#Ldb}@l#h%krWOEXX(cuO4uJmmX&ydpCY$>J zz`(~$q(zuf+M@WHG$~;Jcl3`8BO5&%n(BSI9|0ISvKQqoHu4LW z=i6;JKe^l7Wlrv#+}jCP_n;n><~xBOc%^#HtfJ6tx2!_Y^lYn9IBfZ+gZ6x(9+X;T z$7xp!j$Nq-Wa9^(W4UnJZX@4ueY@dWwY=>Hs5Z+U9{23PiWZ5ZzhoTvsMkRDzP)Ib z0{q9l0-NY;bmxorL7W*9TL&`Pmj!S;fE(mmSXoDnp@YWQK_h=wdp>oNWkJ_*++c=B_nly8(H zZ0B-BS@0C2qeNoEMw6fHDo8W1mZ%Fx(1W)>(Nx72X zN&hV=KPE>$7vI-Y3eVq?^NODbrTnhK*Q9(=;i*Fscwc-!PfGq9IWqsOl)qK@b5j0O z;op`re>~}}lJE7BT<7z~Fl$z&(~TR_sT76O`GAcPP@8> zH>)uHzzfP1nEn$j8vhS`l>81R@Id%k11={x0^MU0)W3;K))ayBp6idH_KHEJt{Gp+ zqTVG5vZHsE+rpUSFRZgCLS3$N9x>GYldN)tW0L%m4JB0FJw5CVnS}qaVGnz=$NBj} zC!`-bKi#o<{##^xz9+_jY&P#PA;J6Sk@_FaRr`z5eg_-&u%GF1{wva61;=HajqK-> zHA`5Q_S38=!RKdC-%5TL7!y*F^Mvk?enGN5^InhrPe`ZS&lu|dTRq}WtrMSq0IKm% kQT-iXX#;qMV-UFh7+g1M{7;mA$5@v8|3wmHmsuzNzhzxI9smFU literal 0 HcmV?d00001 diff --git a/libft/ft_safe_int_math.c b/libft/ft_safe_int_math.c new file mode 100644 index 0000000..454bb63 --- /dev/null +++ b/libft/ft_safe_int_math.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_safe_int_math.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/08 11:11:17 by alier #+# #+# */ +/* Updated: 2025/02/16 19:04:25 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +int safe_int_add(int a, int b) +{ + if (b >= 0 && a > INT_MAX - b) + { + errno = ERANGE; + return (INT_MAX); + } + else if (b < 0 && a < INT_MIN - b) + { + errno = ERANGE; + return (INT_MIN); + } + return (a + b); +} + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +int safe_int_sub(int a, int b) +{ + if (b >= 0 && a < INT_MIN + b) + { + errno = ERANGE; + return (INT_MIN); + } + else if (b < 0 && a > INT_MAX + b) + { + errno = ERANGE; + return (INT_MAX); + } + return (a - b); +} + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +int safe_int_mul(int a, int b) +{ + if (b > 0) + { + if (a > 0 && a > INT_MAX / b) + return (errno = ERANGE, INT_MAX); + else if (a < 0 && a < INT_MIN / b) + return (errno = ERANGE, INT_MIN); + } + else if (b < 0) + { + if (a < 0 && a < INT_MAX / b) + return (errno = ERANGE, INT_MAX); + else if ((-INT_MAX > INT_MIN && b < -1) && a > INT_MIN / b) + return (errno = ERANGE, INT_MIN); + } + return (a * b); +} diff --git a/libft/ft_safe_int_math.o b/libft/ft_safe_int_math.o new file mode 100644 index 0000000000000000000000000000000000000000..6b5a803bf3901c7f0d4f8b2da65e899b275dcb0d GIT binary patch literal 4272 zcmb_eU2Icj7=BOBzC*{hvLC{jj5!oUB>T33i54de1rbBAkuGlWr?lPa*3h5Xo{|lL zqS%D0=)5p!ynuM635goHfFKEEL84a(2|>No3lkH=LbAFi>15%uRL`XW#k($NX2S=@;gv zI!}Ip&iz-a1>A7Q^0%)rcXVB$boAAWsBR|Ie`9{mzi?!~BhljRS7xSOER?2J7H8*w zu27wwzwKYh-#mW*eqNe`n3kD$|Bd-s|H9$(f3BEXUct_pCTEs?HDA1oo_XcksiVLU zch?eC2X~dB(=0t{D{^;dg(6G4ZAI!Wf@-M*xy!*72rP~mVBfne!+_f<6ZeXMtfo;_fsCwgNz zoJgdjy@_}vW`JcB9vy{v%0Xmv5qmV5OF$SR@E@}&V>z|Tp_f3JY*tn^F7Zw)0Nnu4 zNn_@%-|lOU_`KVF&HK&&XMJ8%r(B!C(uta*Axj5+jFKN*T=a9?Gj5K1Mtt4@1y}Jg zTy{nI$Jc}n9u5V6RTj)dy>&j+c13uXJ}sIwsg6mt!w{;rN7QS>LebRvv!Y2oBt?rR z)reHPoP%GB#vY;c3i!mb-zU|cw`a{*Ik4t$eI@K8%7NB0r zPh%$6;djxXPQD=OO%>58MXPr}ERkZJ)+aV<17eF5pq|TnyG5&}UWJ&ZUd&6eM!gEd zqW!FBl$yF!3eePV@&jd$(o+YHht!2{&AT>Ra?vJK`@B~`rQ7L-3c^j9P{CV+Z(77} z1Ayj5EWl>~(CWyCUl=UQ$a8fw&kg{5Pdt}x)^8)CDSFGCr02^!YY{&V$PI^12 zMV{Yl#Pbdw;}%KgcbE0~RWxfffaU)^(vMQhdGfx!K|JS^Ci$>~$9#Sw+5A{@_~(2$ z4(HQjzAOMAI{aY%tcT|f!TIp{`jU9ghx0h+;4z=i$v=LPAy}XD;g2uQ=P%N~=F;bU zZo2pbBxC(W;NCj-m-mZ#UQhmJVV>vp1o`3lT9Bi9BsUfcMXt-<`9*SkcN!@mZ&m9F#q@&ed1M6kPhfrpXj1k6mDv9m?0^A?xyY%{?c?Ia(C16AZWR<{I|*$o>~LB)IKmjrm`vi4If#IDcGY_xvBG_xTdU literal 0 HcmV?d00001 diff --git a/libft/ft_safe_long_math.c b/libft/ft_safe_long_math.c new file mode 100644 index 0000000..159085f --- /dev/null +++ b/libft/ft_safe_long_math.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_safe_long_math.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/08 11:11:17 by alier #+# #+# */ +/* Updated: 2025/02/16 19:04:26 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +long safe_long_add(long a, long b) +{ + if (b >= 0 && a > LONG_MAX - b) + { + errno = ERANGE; + return (LONG_MAX); + } + else if (b < 0 && a < LONG_MIN - b) + { + errno = ERANGE; + return (LONG_MIN); + } + return (a + b); +} + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +long safe_long_sub(long a, long b) +{ + if (b >= 0 && a < LONG_MIN + b) + { + errno = ERANGE; + return (LONG_MIN); + } + else if (b < 0 && a > LONG_MAX + b) + { + errno = ERANGE; + return (LONG_MAX); + } + return (a - b); +} + +/* + * Does saturate and never overflows/underflows. + * Sets `errno` to `ERANGE` if the operation would + * have caused an overflow/underflow. + */ +long safe_long_mul(long a, long b) +{ + if (b > 0) + { + if (a > 0 && a > LONG_MAX / b) + return (errno = ERANGE, LONG_MAX); + else if (a < 0 && a < LONG_MIN / b) + return (errno = ERANGE, LONG_MIN); + } + else if (b < 0) + { + if (a < 0 && a < LONG_MAX / b) + return (errno = ERANGE, LONG_MAX); + else if ((-LONG_MAX > LONG_MIN && b < -1) && a > LONG_MIN / b) + return (errno = ERANGE, LONG_MIN); + } + return (a * b); +} diff --git a/libft/ft_safe_long_math.o b/libft/ft_safe_long_math.o new file mode 100644 index 0000000000000000000000000000000000000000..a9d8a47ee549623a0303d0e3ab0cf3c4ca2ead88 GIT binary patch literal 4632 zcmbtXYiJx*6h3z+ce;6PUez@AVXV8J!unC#vl0Wu7St3$-K&=wfjfQ3Y^M zbbZX)e#el-mvRhQ>vjxDS_94`AjBf4!K9%)NkjRPhU}zA?W7?VxehC$w}#V1yk$Ff zvG@*A*7#Zb%rRu~s~khtzHtm$yqaT3ijB3Ugz}XV%2P@xUnwEGlb{7mtVn)a##H2{hPU$sTGR{<2%ffCqX zTwDwQzXCvkIY7TzLWwJKL) z#(>rf4Fl<9w80q2#H0NUhoggMjP%)tm=R7!5{YzgLn7W2Gr;kR^z{L{*Tz$BdT^-6 zWt1FBKm>Z=KbA$4IE9`LsX$|L6gV89QS z-C?rB>4!ss^0vUHwm|Kq^0v=+48`(80YAn|kR49970)mu`LgEYMGSaa;QV5*6GGe% zl;Q)IjljQrQ)!~mUOGy(kp3cnl`K_TrJ@eYLbY28RVj?gQe~`LR;aB?kEU!3N=1Fu zd!(6u_0U77Dm7LxckWP|k`A9|1t6s~$ef@N7e# z8>zY00N^I^e3Y1L)wRa4Lu~+nf9OiIk8*kW$#wYIb@;#5;a{P4?2WIIeUaTYEpXRF z-aV_8E_>vkB>iC*&oL2?xOlYZac(0X%d$5UfPL%m@-3b?VbZx5V4Zf`#+$0g{$0{L zT|C+kk#2T>0DHXe5#LKsu7|(pYsB;X43mD&#hdleyq|aRI1gOU1s9L@7s#G3IUJws z`H<|n9$t5!yW(Jc>(&kMy^A;Np~>c3EXU`1_!`RdIYjn1TyZcy*Yk^qPm<2JNOX69 zU;Zx4^L(BqKjwK{&BXI~ZD@Vbo}vD5q^Bnn9R@8EO++*!I%0s`(B6xyWvM~2sS&pQ4^xCsE@cXlLr{k3(*-;5g!0J>>&;P`Qlz2kqJ@;6d^#-Eh`eI^K; zpP$%&QTF^_q4mrC z1m_QL|Lo7}=Z$r~Uo#%Q0MO?t*rS^LoR&%s<|#kt!Tfle@a9k9{_9vx1K3A^3EqDU Z^hbE}|KaJMj87<$^&7|X!y$R|{|k2PO345K literal 0 HcmV?d00001 diff --git a/libft/ft_split.c b/libft/ft_split.c new file mode 100755 index 0000000..e8316f9 --- /dev/null +++ b/libft/ft_split.c @@ -0,0 +1,110 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 14:22:44 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:27 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int free_if_failed(char **split, int index) +{ + int i; + + if (index < 0) + return (0); + if (!split) + return (1); + if (split[index]) + return (0); + i = 0; + while (split[i]) + { + free(split[i]); + i++; + } + free(split); + return (1); +} + +static int ft_count_str(const char *str, char c) +{ + int count; + int i; + int sub_str_start; + + i = 0; + count = 0; + sub_str_start = 0; + while (str[i]) + { + while (str[i] && (str[i] == c)) + i++; + sub_str_start = i; + while (str[i] && (str[i] != c)) + i++; + if (sub_str_start < i) + count++; + } + return (count); +} + +static char *ft_str_dup_range(const char *str, int start_index, int end_index) +{ + char *dup; + int i; + + dup = malloc(sizeof(char) * (end_index - start_index + 1)); + if (!dup) + return (0); + i = 0; + while (i < (end_index - start_index)) + { + dup[i] = str[start_index + i]; + i++; + } + dup[i] = '\0'; + return (dup); +} + +static void init_to_zero(int *sub_str_start, int *index_str, int *i) +{ + *sub_str_start = 0; + *index_str = 0; + *i = 0; +} + +//returns NULL if s is NULL or if any allocation fails +char **ft_split(char const *s, char c) +{ + char **tab; + int sub_str_start; + int index_str; + int i; + + if (!s) + return (NULL); + init_to_zero(&sub_str_start, &index_str, &i); + tab = malloc(sizeof(char *) * (ft_count_str(s, c) + 1)); + if (!tab) + return (NULL); + while (s[i]) + { + while (s[i] && (s[i] == c)) + i++; + sub_str_start = i; + while (s[i] && (s[i] != c)) + i++; + if (sub_str_start < i) + tab[index_str++] = ft_str_dup_range(s, sub_str_start, i); + if (free_if_failed(tab, index_str - 1)) + return (NULL); + } + tab[index_str] = 0; + return (tab); +} diff --git a/libft/ft_split.o b/libft/ft_split.o new file mode 100644 index 0000000000000000000000000000000000000000..c3a43d3c9135100feac25ce5ecc0f17a24b98a21 GIT binary patch literal 6432 zcmb_geQ;FO6+d@x?#m_%`!*m2fy$~;Y?T+bFbc8*Y?|1&nZ*Jou&qGcY<80!l1*m! zEh1{yaTDw|21Dyi$7v0WwzVCZek!AktqG_>ESBmNt4M39Uo)W;WbD|f@H*$ddv{-6 zl9~R|Gnu{T{O<3ZbHCrc$u~xBa}fek2&{&(RhIo%l=Zb-T??~-Kuc(IXj7;q)O?3t zID3QMZ>oJeT>uT=S<~2Os(no^fKc&Y;pfrCG)*(`YWNW9n4>W;GJb7RQy2B|fa;6T>!3LG+g;5eAC;LW>p@tRbbK~Ph zy?9@(FH{&I;rM6z=tuNpHQ;W-%|u2Ts+J>w1*&WV%5NXwZ8CkNW_j=UBqrh zip{m|@hg(NKlY}w!uO5u7A>qQy zBtnjd3u7cyc!~7AYOsbC7jkDpE63D5*l)eqTQx#rh}E@{CZAi?RYPl9qklF3T$;N&+oXeNaFaQ3RhP*9(L| zvs7hF0^6i|cPV_cRPEuLCxxFY!j6@~w>VSFbY;pmCq+gHi3$oeuKHZjFb zrP*Jp|F@v9stU~0>ZNaDwf*}Rtwa- z+T-y6C@Nre<@LO9YXpO>o%j9vE6c&wTnSLcz%{oVu6p?d)AL0VnB6ir>iLFevj<=X zk^{2=W+Dw0FA^}cq^JyB^RULp01KGu0;u4_@8)AZLr%p6`H>5Nj}N&vjbBcRwdC3y z-*H^cgNQ?}M+Of`t}CmHQ3b|-DwJISP>C)aP>2dTO-mFlB&kZ(wby-0X8cgnE?5NTp(hVBd15)mx$)#ylb;Z$w6x{YM$RAa zilsaJI}({}sweFad_`NT1(pO>=6LNgNE)r#-ma9P#i6dVr#n$+bY@bCj=F|KcDvEj zTbDFiyJKBlJ@LA(R9n(Oe!M4_Hd?br22yDQu#9)cG7yIp@G8jW+OWDcYs50#1C91v zZ)+x&?nnTKTT|)w#7;=0+lAJi>xE<{k!VdNTa&R=SE3zw!@wfSc0v}6Sepg%HvEtM zM3L88vTGxdoj$T)Mx}d*SW94`7(QH^5c2x!z4Pk5{(A2X_1>i+?}`TRU4_brl|i?) ztbUg%N|044bYqgalpt*$VsjL_%(aBDO2xp6dxFfRG%>1lGEnG7_W@Q-HI3B-S#^-r zXpAcEIjmZ7H?f*1t2S7TM!!D9mMio$M44MTK%dM8E9hFhZt4XVaB6aRsB9wH8w}t z!77y?eJr13S1ELLRH5|`GB;fvrS&}fnqi*YqXe*z+ z3^Z1u(5stRjS^&Yn%E45KAm?T;=b1@^duyiLVuobQlhL%N%0X&M(O-0qe_HTZL)wN zg)WLJG=|-$r$JNbllfuW5YQ*`8YVsqLCixR%?~r8&~p%U%>vttX=?d3KOis2JLLqS z)=4=@sC7P05^9~)lZ2L!&j~`y$K?c};GJNj`~Z)wNhkmwlCx~>x?D8BY9T8}703H;65PeB4tqPRBHO)`r{jDxy7z@vo5(`RPSm za!_W8dWp*m^cQS+rO;94+i;8%5cXA~#O{@LHvrt|;BON4Ee^ax*!2#)SJ>+uct+Ur zUM<^i2wa>rB^)mWC_SQ-e97aFXEBG^ukC{Okc0niVSmqo%k~dD@W+HL9~d(4j|KjW zgZ~R*zv#eae@{4Y{1Btamx7GX--`h7kyTy7j|%$}2QK4Nu|A#iSR-&5|8?QN(1!DC zln}oS$MJki;5XWEMj&b;_9{>g%xJTHJI&k^Sdfb8E zFYKQ<@MncBU;Jod(+>#zq=SD!^y{w?CV9J&+T@!oqtYfrT0I$C3GZJERl&@zdxm}Vq)8lc5{y1Nr;>kfvu zJW1sjv8=T43TJs)fl}#Y4`}HgBcXlm_Le1CBNpEdT36SO?$%g)dnTLem_YAJr4s^3 zbhailvF-%F$$@oolv%oZ;`YmrmNhbXlhd;IbYuB{kl)G&h(k```wIY$J8&^=C0StI z(fFFRi}gQHD18^DIKP4Tov?prq}(Mw#X|z95%VbTi}M8jl*sRt_r;`-iFG2y*?x@Y z#895bO$Y#QSVc*k+zr$C-!DFTH4_%!lkL>mm>h^ltdwN{G>cQ&G_#Z>tC)j9Dlq6Nq>psci-72luo>y0l*&}l@1f`ohJWt vQ{=}b;mqHS`!{0ZwM1S)xXAr01>29}%>T0Ud=#>lKkK3N9Y#OQ?acpQE>8mt literal 0 HcmV?d00001 diff --git a/libft/ft_split2.c b/libft/ft_split2.c new file mode 100644 index 0000000..be33c1f --- /dev/null +++ b/libft/ft_split2.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/12/09 15:37:07 by alier #+# #+# */ +/* Updated: 2025/02/16 19:04:33 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +/* + * Free all strings duplicated by split and the pointer array itself. + * Does nothing if strs is NULL. + */ +void ft_free_split(char **strs) +{ + size_t i; + + if (strs == NULL) + return ; + i = 0; + while (strs[i] != NULL) + { + free(strs[i]); + i++; + } + free(strs); +} + +size_t ft_split_size(char **strs) +{ + size_t i; + + i = 0; + while (strs[i] != NULL) + i++; + return (i); +} diff --git a/libft/ft_split2.o b/libft/ft_split2.o new file mode 100644 index 0000000000000000000000000000000000000000..27c56baafbd8eed84a34439623af8cf1a02f5522 GIT binary patch literal 3216 zcmb_e&u<%55dPk7cH_jY6W6p&D5a(p!hx)lv=WNV`aWp<19~(VB3iN4E_WHzJ3eb*piFyyKxfI#; zYfwfycCjN};=mrvrTkrB@DS9*v3NWV#D_p$@QIf;A?CeI&a4}C0E)^S6-GQvl1TM2 zDN^qN&;oJytF+Wv-run~NIU()E2=n1Rxx!|@#-fIc~%2&OEbk7q*Z?`{sDmaM*uuR z7g$_w*={RctQG7^dd+M)R>MwDP8k!%D07RzcG%3+ct+rMlpPcg6UI{aP=`xmG zthGueg4C&U035eeGRsEQZ}|bm_XVgap~VMxYr3A*2J~07q@LB3tfuPUY6E9AMbB!< z`!pr1AJ)Wo8h+D~gTHHvUe>FMKxmls!24bvKeu~qK}8Ti7gPlIu?uSFVs=4AXjp}y zVrNM5@do^QM{zrVU7>h*Y^+FrK^pM;xlPIxX+MC!Xo|Jl?d&!@w-8=)WfA$K{jbWP3ZJZ%X-z2+w|>kMMl{n-P9f%I`#YN6H^Z_?M-emQSi>xSsP7 zp5re|p7RP|l+5K;C0|%xZklT_nr5wFxaPVGqu8j|O*=Zoq`u=erLu2t+2sZdyWyI~ z=`)Mtj$0_Mz@Wj9FO*76$EpM~z#o6UC*Qbc*`_4SYQEeo)J@RbWM{QTF|eiyVmNNo zEiA)u&e!SrKY+em;rqmRj+zRkh{Z(bNQYr~*#dAJ`LIoXU8 zk{~;J-#lsfKf_zne-s}|Vk5EVEeZ?a>gl{DIX=E>|OY^E%{_8UT zucQIxPc@F_KPltqIx()u=6Ib63HHxVnp?Dv+KTkqWmNYvZIiq{{I0nA21vM literal 0 HcmV?d00001 diff --git a/libft/ft_strchr.c b/libft/ft_strchr.c new file mode 100755 index 0000000..1ef18dd --- /dev/null +++ b/libft/ft_strchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:59:05 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:40 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns the index of the first character c of the string +// /!\SEGFAULT if str is NULL +//returns ft_strlen(s) if c is \0 +char *ft_strchr(const char *s, int c) +{ + if ((char)c == '\0') + return ((char *)(s + ft_strlen(s))); + while (*s) + { + if (*s == (char)c) + return ((char *) s); + s++; + } + return (NULL); +} diff --git a/libft/ft_strchr.o b/libft/ft_strchr.o new file mode 100644 index 0000000000000000000000000000000000000000..cb455a69c548fda059df9f8ca68212c1d7746463 GIT binary patch literal 2920 zcmbtW-D@0G6#w0s%_$_Ynf0CMSTTG5L6v8p zUKcvmt?d1sGe1R6_Q$JiW^J3T?{t1E{5-Sq@SW|MjbDBxr5Uy@=4$@|DKIQ3@ue1UWs#(8o*y{{+px)8)eTrzSRK zAj3gR>^yW_47dx(Af&}h3@6ViKvywHvYGi@*8&g=>}`_RSOI_~)W!6xz0+^WdQ~k0 zNU;T@4IoVuW8w~gL9&S*rP3yaY>2!G&(;7IDxDzesDQ*qgFIWTDE#rz!OUyQ(j zIse%0TOjxGv-QF3*4$p0z1-OYGft2`m^jqOaR6hQUsZv#07m+>foaK6=~Ej1vm3*f z{E(jNK({!E?`FF28AI{M<@~V5t33&iYdr09TF#%6BfWL^9RWO_&=&;<;N=7KRlic_ zS&@2gYWtW{Cd_L*okx{vN#jYM;z$r_N7X6g5cgjojF-FTSDkQ8@=E_*IsZJtSLOV> z1pkSg=jBMT(c|-)fYT6f?DvbM5`x>4AY-`Jca z$d2Aod;)+je_Q%bg8Cvs<)=dO{4`H;gked3sthHPx|B~zj&Mhk-z!6jr0y#R-2bk; z|CiE$?oTmJ-v5~NPhS8X=Vj8XI4CIpYNY-`a?*ZB+MiH{63R}E^e;!rI)2xSPD4_c z;>&=gq`I=F_~=mgSD^P*f5&tbWkTxtli4SJ%LknQq%4Zh^iB8Ceg6ReH}~;RUm_^jC<(HozsgDf{{kio`$7N! literal 0 HcmV?d00001 diff --git a/libft/ft_strcmp.c b/libft/ft_strcmp.c new file mode 100755 index 0000000..52be37f --- /dev/null +++ b/libft/ft_strcmp.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/08 13:50:48 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:42 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strcmp(const char *s1, const char *s2) +{ + while (*s1 && (*s1 == *s2)) + { + s1++; + s2++; + } + return ((const unsigned char)*s1 - (const unsigned char)*s2); +} diff --git a/libft/ft_strcmp.o b/libft/ft_strcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..be2f4750fccbca3ecad92ebb6818416fd03f6444 GIT binary patch literal 2528 zcmb_dOK%)S5U$>F&)VL2*N;5xBqS>Z5=BvZz0M^#R7y z>9HI@2_iWmA#sax3F63&lO=8|Apt*wKY#@19D-`5YPYv-OC0#L+Uokcs;j%Ys^{qk z_dYBL0So~*VWf@lryPyfv*9|-f`D&}&j ze6v(40XRw^x4!t|){;|RE!`+xTDr6F-V(rsgu|bo4p2Y-AHuY>hGu))VfjMujy{w^E@;*mS_LJdhBGB#O({}?_4-@w)01ZNhMd^HF;r87F0oiQRN5mUACWp-W;3(aPkW}00)NGJqCwr#)bn$ zo66uEQdgG&VBUy}^@MOqV%y}EnS(16d81Wf-mpjhBIzd$p4UX2Hh8pOA^jXlyrbb| z0KgT?J}Y^{&$iFs4jAs!C;yL(bLl6>ATN$*;GMEYZk-zB|D63=9w zYnga^|Dd-0X4+|Z&1UTHg3|t;2GxrCeLvJZnP{`CRO|;Hx%I+!1S*WQuWsMpx|(RO z^$=7L?DiYp_I8}~I%DQRFZ7AS_u zNU;5{S$)d*nTq^la=<)cN+-!+ktFsVns7ZbUXkAuCI}p#<%uKw&r-2pV#g!=H;y>} z`)0Ek;J6I@nhAg%+kBG<`&@i}2KKx8&J98J$9cm1;akA|%;UG$-V +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 18:57:34 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:44 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strdup(const char *s) +{ + char *dup_str; + size_t size; + + if (!s) + return (NULL); + size = (ft_strlen(s) + 1); + dup_str = malloc(sizeof(char) * size); + if (!dup_str) + return (0); + return (ft_memcpy(dup_str, s, size)); +} diff --git a/libft/ft_strdup.o b/libft/ft_strdup.o new file mode 100644 index 0000000000000000000000000000000000000000..bf06f4d0be2794195976916fa594e61e4f172105 GIT binary patch literal 3352 zcmb_eO>7%Q6#mAWwVgPz^8;y2E966I4=C$6Er^z?G*N#XHL40Fa6mNj&)TuNUPs<_ z)D{U)LJvkLNnu#F1NtKvZyn15yzPA%O^byYJbXO)PQXJM7H+ z=DjyFZ{EC}=T6L@j3@)Mwb`_mJe+tq zu|GXG_DCAgbVPRf)Z7@*cW{fSw^tQ%Vg)s%H&oZ> zku-Vj*FoL}_CiY@O(YUPBIPlI`@Ci-1t7T(Kx!OwW4<|nI{^B;eZ;+Ult^yHaR3pa zNKj9bq*6Zu&}2ZRKInL((NQ{5-#LjRq^w^PZ2-|v142wa8gUR)k4K&b;N?#w{Vsrh z@`?fa#Nvq$0StaDL{#~Td%h(_@ADn?$PPn^A86AF(oT5{t=7Oov1PlhOvx(P)y#_7 zbZQMdlbbfCjND}IP|F)VfQq~5xXp5F*(f2q)To&1 zO9bwsEm3eUKL&MiSnVE+#Wxgi5WpTDqw~USa(E^=F_X-!Y3mW2dc(8H_=#lZr1U-Q zcf1p;kVmEdN)Ay&d7%JhAlq`9wArj>t<)!T(_Y^TW7ZE}wq}>CR@p>%henAUdl530 z$dBWe%Vxz`@)N4RlU79K(`dNg`OvkZM8s*NAfcSTqA!RTo{wnn@@5S`Lh{B&dh zff}?E-uL$L>*h{lS~r!qKy`P{3|TW zPmW?AjKBDkb#~CLWk%U7wyKMTVzFtiz-XFQ!EnusE{sy6UN>!5G^nt3iYhDmwl%xb z;2|oXhTU*Y>O%UgI&{sk*D4s!3{u39xD+K@Tgic-y!nGkCy03z3d|4&` z$&SvKm(_Xyyv_56@d6VshX%syr>8`iBaAaCc`69&p6X%$H7ouuhK#WNY>)ll=KcT4 z2DE>Qad`ieJpYtT!1#hM1H~r@nP1wyJ?yJog!TuG1A7(wrvqFN>%k%xfY=GH`u5Ag zyGz($`|y)h_Aj7%7_9e#Tl8~4H%};jbk<@o@8{=xtp7I8e_b3h!s~yg$NYD8n4kW2 q;rZ)y|K>NT9Me)dkozZ)dlR0Y9-`sc5jHp|{^QusaavM%{(k{@AV7Nn literal 0 HcmV?d00001 diff --git a/libft/ft_striteri.c b/libft/ft_striteri.c new file mode 100755 index 0000000..73ca44b --- /dev/null +++ b/libft/ft_striteri.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 16:56:31 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:45 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns without doing anything if s or f are NULL, this is dumb because we +//can't report the error given the prototyping but I'm not taking any risk for +//my 3th retry... +void ft_striteri(char *s, void (*f)(unsigned int, char*)) +{ + unsigned int i; + + if (!s || !f) + return ; + i = 0; + while (s[i]) + { + f(i, &s[i]); + i++; + } +} diff --git a/libft/ft_striteri.o b/libft/ft_striteri.o new file mode 100644 index 0000000000000000000000000000000000000000..87a31f2b2fba9d0ce1c63a2c024b71ec19af8825 GIT binary patch literal 2784 zcmb_eOK%%h6#ni^W}HXsChp576)_Ses-TmkjgV5JHns{RRa7KO`cS1>evIvD?QxkI zM@$AD;86*X*zg;u)c?SS1*{Mo7HqmfBIu0IvB#rWV!@|K_nz;5=bSs| zo_n1KudlwLDFuPTdGxFvelvUXrEt20aVX@j<*r^?-rfsNt?WEo-hLLmu(Gqac>zIY z?w8e_e|C3%&F%gC@Tpq)cz!Ckxj2RPpEq;2a)qZ7?kG@(0re1>})CZSw20X0Q18w1ugw)J`E%efz-ngj;iSlFlvMg zcnn}D+}3b-C>N)vcSU)-)eL;sXG~ zBr#QD7r@9UDMu+-hffS)t<-jdcDCFoy0z@O?fFj2&CZ>%X05r?a|`Wo^(?AE!4Etq zusz2rW2W9}+A~4jbL`s8MccmJSgF>^|Xtc^R4X0EMqAu`Jt`|L2(RO{O=Gv94 z;|6f>AF~5TxD@LC+fet$)#QQ1@U8-00dRuXsC39D$MeZ_E}4Be^ojmRYbDbm6IKC0 zGc4Rms+v-NClAsxORX zlT~BrhB2~WXyzqDnH!pk$j#gzkHY=@wYT4@-s_4!=)F$pgU-DchmJ&?3Zd`QkCy(P-lV-3Y`RtRbX$F8oVuAB*r3lki-Gr#SO$KhGnbQTHeSygY!H{Yu^& ztn0ja2>I?k0&tPnMQ^kHR)i=0t8B|7Bl-sOa`%WQz3`<-9Qv;J*lzJC-$fls*yd5< z*Vz6l#=C51d8FDz>vM*AiQk1)u}ke*p;#(;_ByPNeG}fDiVx{8wPOZzX`@=!k`y89+R-a>)-My zh-=A?bA%I2Ziyo!uC)gEf6c=0#BqTCsn~rN)H^?G_=4k5ov6R%olUcl?k`DZ#gUQc zW_@1>hU{NP`sv@#|0njJ7RLep=LUTL@6pQ=f#en3@A%)1%l}|vS%eJvenERc{iLC! zPEzzF-2ak?^3#7O@%&fm{;clNbG0cs2y%Y} +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 12:14:45 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:47 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns NULL if any argument is null or if an allocation fails +char *ft_strjoin(char const *s1, char const *s2) +{ + char *ret; + int i; + int j; + + if (!s1 || !s2) + return (NULL); + ret = malloc(sizeof(char) * (ft_strlen(s1) + ft_strlen(s2) + 1)); + if (!ret) + return (NULL); + i = 0; + while (s1[i]) + { + ret[i] = s1[i]; + i++; + } + j = 0; + while (s2[j]) + { + ret[i] = s2[j]; + i++; + j++; + } + ret[i] = '\0'; + return (ret); +} diff --git a/libft/ft_strjoin.o b/libft/ft_strjoin.o new file mode 100644 index 0000000000000000000000000000000000000000..28d80c0aeff5ef07963128d8e558825f01a95551 GIT binary patch literal 3688 zcmb_eUuaup6hB{XzMFqtnl@!iovZm=+kpkxssf}Bl<^Ramb4^{kOtMEUealX|8j^fh&zgI;SJvS<%F zwJzvxTF~CWG4^%U@^y?P3;ReqM56)&aGjMjkphmhSZGtu`~@7RNejG+O-=9CEI|y2 zCxT(A1VfuP2M5HU3gFTN3S*IX$A^{R-oU=Vw&98J!C?SJf@@QYng|29cXz0=*$@y5 z4+sFY*$|>7dX^djT#;+z5dg0y+79Ex=+Y+vUHKmeC3qkZ2ml27O{Q znpeM%Gw%SNj*A&o#7Wdd=sN&VctV7}T(7pAqwydbx7G0X9qJIO@+0;I0IFT_h-p_1 z0K7Qk8omtxK8yxtZF;D5}HQjW%UYCE*p z_Sl}fIlBvTMyh61=PHG=mW9!LrKFD<`D#I*9X+Ji&KQ-mqd6m0N*9Zj>}au&$r-ew zsF$HwDbGgh{RR>h+d;?Lj)9Psc3 zfY88}vzA5g=2o?Qt2O$pYoLUL^!P7GzZzHOG-YF4nL8y%R3#FZqiRF$Z%A)L$)A!Q zRTY>HjY*dpS7we#zp8AxCw+URyC7YMrSF(@shaewUrG0V={t;O>Z0_iniT3$ z3951;Cx!Bq=2F4dupRio+}Cew4%&p$zP}w%+BdQT3djzfp|oz`Iw-JV9d{4_25oV< z#~lHH&^l{?H+%3Avc=lL`~TNk3y<~Sci4EJ&0ZxQOU9~0EE^kd-}Rt_-%9#M8_zxw zkJxzhvy1dCG~ykzt`7h_-GkplJm!ghE|AWx8+ohg06@}V-+E60CT%?0r${$@7j+8s z|2pv*hyAyt=WIOMFOmL|jYt1}`gy3^c(muI>Y|ND`#jlmzP#VJ$&Mdn{%&0BH)x*u zZKQu}^N(>)k^Z@Z=Y4+T;0@C6J9vI#qr~GG+RyO-@tltZZAQ=3XH)4+rmCLfqiUoxpw%vvaQvTu=VHIFj2E#u0RSH} zJLpP`-krAzd_!?DvA`-qc6xap(*_%G|V9{Ybl`yZn`aQ{d-_m6!R<8xnS{7mt=uQNDT z9v){%vHuUd9cmX_{A(5fXYDnMxJm1sKhC^=#(apX?GJUt!Ll^P0i>JGxc@uv)MQu0ICXjWhnIj(*4Z Q1e+`XJRkzsdAh{^2O-v98vp +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:24:30 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:48 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcat(char *dst, const char *src, size_t size) +{ + size_t dest_len; + size_t src_len; + + dest_len = ft_strlen(dst); + src_len = ft_strlen(src); + if (size <= dest_len) + return (size + src_len); + ft_strlcpy(&dst[dest_len], src, (size - dest_len)); + return (dest_len + src_len); +} diff --git a/libft/ft_strlcat.o b/libft/ft_strlcat.o new file mode 100644 index 0000000000000000000000000000000000000000..d2c8c20218849d2360b5c9400539558ca652d467 GIT binary patch literal 3592 zcmb_fU5Fc16#ni^C!21z*+1!K+ft+SXN&A)w-upvsm)S#1F=}!Si!b2Ka(GtOxDb# zbPKkn^(CUMA}9#@pbz?>Z~CTBD*7l0QpL9-R9{rY3f59NlXGS#vsv)L?;-b|@1Aq+ zIrrzx&BaHvk7-Ilpl}eY(ki~*xY|GDbq`@23h5K+r_;Ig@ncKfZ!_InneLsNG@9vt zk?sD)-LEqHe{`mvP(Nk&+{ku+&311sb${^2vfUe5b$h9M{n_-%^r`gebpCUhW`a8k zIqA;&)G5&lLsS)xOZSLxbvmpq5LJbv(w+0Ij)|6F3wP4oDx8!d!A|Zx$*n?Oh6HL{ z?Tk+vdVFkZYkXWyL;%fH)H#%Rb8%XaABa61+dZ9`d}JEX4QNw6Dl-Xec(6}2x|fxj zpBz^}|E1TbW(RWA$E^JU!9zPh1#em^akBRN_nvu=OO!kZb>`}l5 zFW#tkBt|6mJ{$$02}6Q9L6RE1PXW3NsL^fx;&131CFR~+WINt3PLOC^7heD(DyRRU za%)KK0$>D=Ga~A!<{+YuYZu5!djY@@dC;bR1`wq%;GONE=C^N!nYlnSm{ zLaNqkS}C{Iu3OdAVaqw=ww6;BH{UEY8m&^QQ7=|pv9N43T6Q(rv7LI=w#v!6?V?mG zv_+w`yyABYE}Z&#EAOK0xNzDfPej>r+&p=5+9j|3k3kde@qPhy{wb()V`}TjQ1n#= zECATXW3>5LjE^nG6N~ZWVtghYpSu!y*?48cRsEWFF+St52~Q)+Ht&Jyx*gv{ z4IMTGC=;oU)24MuH5zA|v-5kszPH4w-qNP(cB#=RTL|QCmdLladS;CrIc~XZRm@uN zm~QkBt3IlXO~cV0#>f>T_K^{ZEEw^~oG}wwFti1|_MM?3`j(1DF>$nO@qrir?|0XZ z(DC-C>Vv*|()*yp=#vFHWVQOCV^co?zyvT6nAh8r-g;tejW&?OV1ANy=}yx1_~&j9 z+t=X_1bB*8^drmnD=TT)eX+~E#`~dihhITN`NQ-@38!QfG7X& zvfK&qq)+#XaEV*-|0TodhNopXZl_p|&dx56J}`Fn1~|1&KA65=KQ z+aca%StG}Rbz5P6SBSsHe3Dz*^WeUVKZ(}PLxONEqI>Lr{{u*{L%DBcNBb%jF~PcT^Za4F#)S9W3?Ljo)uS*+SYcA`lOU{{ zS;u}GAHvy?K}huK%%J?A)6x#R(u7qV^C59bgAwr_-Xo>VSA|`0?A)+b)EC`4J*nyq4lG;t=J2Hc|c5rOFaMk zG7%%3E4?cRrFwI~{Pfih&)=f^m%U4kl?_AE2p0(lm F{{@`gPwxN# literal 0 HcmV?d00001 diff --git a/libft/ft_strlcpy.c b/libft/ft_strlcpy.c new file mode 100755 index 0000000..ab4245f --- /dev/null +++ b/libft/ft_strlcpy.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:13:17 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:51 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcpy(char *dst, const char *src, size_t size) +{ + size_t i; + + i = 0; + if (size == 0) + return (ft_strlen(src)); + while ((*src != '\0') && (i < size - 1)) + { + *dst = *src; + i++; + dst++; + src++; + } + while (*src != '\0') + { + i++; + src++; + } + *dst = '\0'; + return (i); +} diff --git a/libft/ft_strlcpy.o b/libft/ft_strlcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..6fbd8c48fd933a7ca6d450a96926e6e5fc2b111e GIT binary patch literal 3368 zcmb_e&2Jk;6o2FOuAMlwodnXDqQ(dMAwkx0%O!0TLMhZK5hBnCq#{}VSbq?Eo$ii9 z(@U!+NG+&Pfe;7@a^e6N5QiS%5~!4t0}|rIKY&!=gepNLkb>Usd*1ar7998;yz_qZ zKIXl7GoH&&FFX?x0vG~j!IM1Pje6rbXE+DLARzbpkMfl_;@Pd-`nS9Cv5g&hG`m&N z6B8Sb(#>l_k;JV9P2|?ML~i;AJG`;e{w*iAbK=g%jy#xK-xi*BVggX_$}Hq=tcv!% z?Fih?UH|hJFEqeD5(F$2Xjt|r9@dEp!#%OINkR`EBu2owlQewFqj-3pCG)FzMFnSkec$g4s%Hf4xmaVS2jD)Hq01My)o zq5*_-frGj6_fMsi_=(ub*pbxy=o2XbMTO9Qmzp012tVE>s@Jay$d0~uDm5$sG+lVc zGbuEWsDNhCM?i_s#$qvmfrP^h9(F#lF_<59jR4>_0EC@oMxE9h;w5(ha|t(qX8DkHbblaId4i%ZVrPU~{tm!4l)LKm=BWqUO zsAf(Z_OfiPWGXV>EHoOeQl?QaRwP>(CNx@RHQhGtdet<_>AESQR4Z7lP+D07yMD>Y zODNkCY^&smSgZfGG{ghWFMzo80*H%AabPGCy(wJ&VVdJEL+m*9tfGYwf5rFV2RBgw z2puwQ+rlg|jmBzoGJDJ!I|a(Pg~`;-Qlniqz?XzxLdQ<-dJP@fvRpPQdd=Pbfld=B z38BUY$5c(5Q3tgtbzD2EhR!OlR@A7bjDM#No>0T*)$ucGNSjgPT2l>aSJkiG4()J1`MJjY zI}|^NPltFZOu;_sX9OdY=Mf{#fH+{yN2< z3dDJqHnrdSIgdkq?0+WvBLTl`$6tIU^4O1|J(KFyz2 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:19:29 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:52 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + size_t i; + + i = 0; + while (s[i]) + i++; + return (i); +} diff --git a/libft/ft_strlen.o b/libft/ft_strlen.o new file mode 100644 index 0000000000000000000000000000000000000000..7822701aba734bb725bd862c5d8a07821aea47b2 GIT binary patch literal 2336 zcmbtV&u<%55dNMwj@`Q0`2i)N2z;Qe5X##maG*shQPq}4syI}Q0I8C@UO(Hbtaqc` z=MX{><;NA&6TQK;C)7Wo5(jSF_(M3f7m$o*cV2e=5=)i(9d>rUH}huZ?abS6uiv^+ z5dsDRS5RmL?p2HTt?YFREePEF^XX(VneNFQ# zKi6CoOY=ZQ3VPXEd31HvXD-ULuFIw|5a(nRYX07vZPNJ|#JMxI`a_ZPbTkAb2~_SJz90`F{%yWOf{t1M!X2jx zW$T9F{%CDuGked@!OiP;gUAoZJ%yqg>C>*M?)6k(4)fMKb@XwZmZ(-vKmWZVQ0mc> z@O_roKa-QzoZ@Rw!GSZS8#wv5JO&4iW87r`OQrqIS!LY-;54;V$;)&k@p-4_SYm1T z3#^|l@ud;O8zr9h*<}4Kmh?@IjuF6nGx$r)o4DB|0JvfChpcDA!F5sG@0eGXead=h z@gD2nSUgP-q0N$VFX!K9-mVL>r@G@o$Ln?zwGXM)frj+s(MUzwET%evOjPKxaS-+6 zq6HzNSS$I-r#ow@_WWH)>fesn>m_M0m~sq*NHL*?oqpntRI!irAyb`buM3%eH6r=) z_}S_ogQwg)zZ!y(U3(?8^4UD +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 16:38:47 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:54 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//I don't know if I have to apply the function to the ending null char... +//return NULL if any argument is NULL or if any allocation fails +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + char *ret; + unsigned int i; + + if (!s || !f) + return (NULL); + ret = malloc(sizeof(char) * (ft_strlen(s) + 1)); + if (!ret) + return (NULL); + i = 0; + while (s[i]) + { + ret[i] = f(i, s[i]); + i++; + } + ret[i] = '\0'; + return (ret); +} diff --git a/libft/ft_strmapi.o b/libft/ft_strmapi.o new file mode 100644 index 0000000000000000000000000000000000000000..9b3580f7b19068b1a9c712c3f9e71bd5ffed8c92 GIT binary patch literal 3416 zcmb_eO^91n6#i~r-b*r>$s|o}GqyN^{wdlw6Q_u^q3sK;PU;|o?bxZ7h9vWnNt>UV zywui>GSf;^)cS*nxTu1z+*CwG5UEzwjR-E>bfG9nQ5SVn3Kk;g<(}l_%>-QdEppHK z?m6e4d+)jD<+=Sc4|{|FLtr<0S`V>6Pu^>bdl7+vaoBjmICOA!f1*8ou5BGkw{A|K zyJ^j&Teq*1+4M`NMMpSy#hOaDzBMj*Hz%&0y<&}zj_(6Tzqrx**=YY{ocE3|Ulqpa zC*F-`uQac>t{LBW$ML7KKhd6P-I`wh+W(Ys)Hr5ju5uz9q#!WI;zE}?%2sYfyC#QN z?0Fq?Ti+vzMAvJU#cY?#u-FSU>kh z13bDQVQ=is)R+=_D7Y)QZ7dz#GX^LsJnK7DItqAq^r>oVNgxr82taEs3GsR=MzZh1 zl7J`nYAOc!b46%=b|GnCNoU@!;-M{QY)& zGjU)ZCrf%B6N|NqIbkiHJ)lNTY`=In{un!82-8p7`+e&@7&!Q7r#~N>l{4CB;4uXDbAGC?~)_c zjPtbb9l-B&#W^GOeGb0cPUt)2;A!2nQs<6K`z8AaByV>m`R2*~19FZB;yJm>wDi?^iyn~Og$bzYzD z#Cb2fe-5kPK)JL%eA~Cl%9v) zuX4bTj~pLj&ML0;UDZM;kMNW z>_03IG%VxL{)uw$f0JCF&xx@^Uh3OSNbveRQlBH)?f--H-^Pvu{L=&We{;2>TE&*$ zuK-Ru-z?#l^mqS3<^4032b^DA8giY``2|-wzh_p-i7+icD(~|`5`1oq`hfKxTxEUw sdUF1p7yT7iX4*9X&vQ%yzdr`Q8~6I3x%wUBhRpwlB*>4xtM2vx1^b*kegFUf literal 0 HcmV?d00001 diff --git a/libft/ft_strncmp.c b/libft/ft_strncmp.c new file mode 100755 index 0000000..9ffd1b4 --- /dev/null +++ b/libft/ft_strncmp.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 17:12:52 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:55 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, size_t n) +{ + while (n && *s1 && (*s1 == *s2)) + { + s1++; + s2++; + n--; + } + if (n == 0) + return (0); + return ((const unsigned char)*s1 - (const unsigned char)*s2); +} diff --git a/libft/ft_strncmp.o b/libft/ft_strncmp.o new file mode 100644 index 0000000000000000000000000000000000000000..0e082dacbc3d571c50ff64a5d716894eb10b1780 GIT binary patch literal 2800 zcmb_eJ&YSg6n^9N+9nRR?+i)qg1}P3g$Ug^zEE)d1Pfil9YjPRPMj#P{Ij-KS??a+ z@#zu?f(Vg-0$l;30Eq%2A(4VAwNVbbzLv(Pyzv)w|-VDwI931N8Zm6jo|$@|>)#*49UQ_dIk}BUZz(J=m3PsP?0Q zS5^I?@Aax1UVK$WyVb6044Od@wX1>O>M9t8vEK{5PNm&%4h?_sLj`dSG##%&2tgF~ zDid?P?O*pA3jX7>0l))vEOGr+5c?%@@@O`9AQJu|+QW)6ZtD`hf#nq9ufqK(@C69~ zQ60rYJVP}I_6Do9HNDp5sU~Hq`e8d5bv!UmCEFM}R-KO5mHlK!?$aekI7Q*+kCZb` zwBr_>h1)JT(Tlj+aTle#EZx*IZeBXkfh#i3vdlQ$ihC;KEJ;^9n-X9QpoNe1IsUw7 z(Hc(D1^<8plO~&iL!D~Fnat2EoH^Zm762BFyj*j>9*&r;3owa*ylaGCq&4#^q#rYQ zj)_<{c#LzN^oL2}yPdoZ0C?Q8-ywbN5c}j#gUR!B$?hd1j#4F1lF$1#>Au0E{Uy=|29NRICH5vTUeF{zKkP;z!$^7Zg_pNiW7TY5 z1&M>%Xm&co*ze7l2Y%=g;q@EcVRPVdk|1i&j;oB-P&Hd1<7)$y{|oSXHT!^3r)K?@ z34;D87$_!p&`fV5xc_*b7$sg1Zj!$ZMFjT~!_JSo%^`jz2Yt&Kux-~5@voENSB5Xb z_Q&%j-^*ES68Qr;V4bk@V|j7T znGj!_!(xE_7&yNIVAnSPh6wvye0~PL=Xv!jQU7tBuzoo6?9Y7vkmvt}@_)yP2=?=1 yf6UAO*qr?MFJ$M(KRxI2y~w!IGf5?C9M9 literal 0 HcmV?d00001 diff --git a/libft/ft_strnonchr.c b/libft/ft_strnonchr.c new file mode 100755 index 0000000..9c9abdb --- /dev/null +++ b/libft/ft_strnonchr.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnonchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/22 18:39:17 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:04:56 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +//returns the index of the first character that ISN'T c +// /!\SEGFAULT if str is NULL +//returns 0 if c is \0 +size_t ft_strnonchr(char *str, char c) +{ + size_t i; + + i = 0; + if (c == '\0') + return (0); + while (str[i] == c) + i++; + return (i); +} diff --git a/libft/ft_strnonchr.o b/libft/ft_strnonchr.o new file mode 100644 index 0000000000000000000000000000000000000000..6f1bc8ba3cfe3e731d3a4b5f5dc9deacb383949d GIT binary patch literal 2624 zcmbtWL66&15T56^c0yCKX|`-P+lodAs1VwhO$(@{RS5{%T~s&#D^P_<9mh$`I(B8h zthVJ)4n?AZN_*qj0}@=2_zSIi;P=3xLgElK_Dt4!+DJ%zhrF53GjHb2o3V56gB#Z@ zA%G#^DjaHu=r{#A6FX1?0iFBL^!nBxPo~r9bop!twjRDKIv4e_*n03p|Mj%}_$m7x zC&7ZvM=YNqPC{ZmI!nq+1w#^N5GTYd)fHP-Yo|_EPl&n$U@3t@XYHr=8nXI!<#Od* zV|(SD27t7|TFa^J6@aBTz&drP+N-d=lB)pD%OI;)E0qdBX&KNOz6XG%EO0q12x>PQqStdIIc6yUYPnurn zM#JWwpQJ$?HQVRarfP4rFHN$i7hs^fsZOFe@F>82SBX5NSw*yM9+gsuS==ZUPl^&*OsS7XYF)NfS)F6^47`jrRFW&T7)iYtafK zFP!v!m^+s8aN|_>`~EdDtm)kRa!DhNS*8A)#ba8RQW?`WgV#3vs#DJkH08 z%?L2t0eQO+rA{*Quadr6;CWBPdV$A%-X#4+TJcV2cK`sdFW@f`&v9>(e$C*&CH+%_ ze?a{!*Gv38 zP}<+upuBiI_9M*?aU6@o4l40Ompp@L5QB#tw$aLL)KS_h(oOu{T zJ`w(?J4oEI&tbyYn+u~nP^nI|+XI!}8RPoDf%9Ix55@sC-|tKivR82d%lW%uuJ;i6 zHwtF`&Zx0Kz>xVPX{>*>9ApZl3|1$?7nECq);_n|3AOC@v@$uh=yfKXd gX0N~uJUizICIbENt7FFh7Xf?U>i_@% literal 0 HcmV?d00001 diff --git a/libft/ft_strnstr.c b/libft/ft_strnstr.c new file mode 100755 index 0000000..50bc7ec --- /dev/null +++ b/libft/ft_strnstr.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 17:50:28 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:13 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnstr(const char *big, const char *little, size_t len) +{ + size_t i; + size_t j; + + if (*little == '\0') + return ((char *)big); + i = 0; + while (big[i] != '\0' && i < len) + { + j = 0; + while (little[j] != '\0' && big[i + j] == little[j] && (i + j) < len) + j++; + if (little[j] == '\0') + return ((char *)big + i); + i++; + } + return (NULL); +} + +int ft_strhassuffix(const char *s, const char *suffix) +{ + size_t i; + size_t j; + + i = ft_strlen(s); + j = ft_strlen(suffix); + if (i == 0 || j == 0) + return (0); + i--; + j--; + while (i > 0 && j > 0) + { + if (s[i] != suffix[j]) + return (0); + i--; + j--; + } + return (1); +} + +/* + * Same as ft_strcmp() but ignores eventual `\n` in the + * comparison. + */ +int ft_linecmp(const char *s1, const char *s2) +{ + size_t i; + const unsigned char *a; + const unsigned char *b; + + i = 0; + a = (const unsigned char *) s1; + b = (const unsigned char *) s2; + while (1) + { + if ((a[i] == '\n' && b[i] == '\0') + || (a[i] == '\0' && b[i] == '\n')) + break ; + if (a[i] != b[i]) + return (a[i] - b[i]); + if (a[i] == '\0') + break ; + i++; + } + return (0); +} + +size_t ft_linelen(const char *line) +{ + size_t i; + + i = 0; + while (line[i] != '\0' && line[i] != '\n') + i++; + return (i); +} diff --git a/libft/ft_strnstr.o b/libft/ft_strnstr.o new file mode 100644 index 0000000000000000000000000000000000000000..9a109199e7f87f23403081191e078ae765ef0d95 GIT binary patch literal 5288 zcmbtYeQaA-6+idA+-Jve?4-#Wdu>U^x^@Hgxz481tR{`46zmX<&@^jVVZm`;5>v;C z?B^=0fJ99Sb67_QLIq7|f=^WHi3 z^J^m^@%zK~p5Hwm_xqmbh5bYCQG@`7fL^FcHB7hE>U~zV4_ZOM$iRxWe|gn3qN|CM zSIiGB?gR5sV(FrYt|m*j_eZZJOY1|WwSiK3GT1o)kmy+}Y}vClSlk>Bp4*aGIxmt- zWwCs%c;n{IU}qmBPYnvxX?y&XzazPHUi2@1tV2Mu^yA{$BjrTtpGV3=rAtT3!Omr? z7x6>!Cq|N`ePSm4`~V?CQyDW;}6n)r=*@^~9}fNpUf8>uTcF3zbTx!uH?C z!6tfsW`+|zubb`h;5mOs;#9s8f6Tu*QF_a~9=%+;bR_;%e5`EsKe`$`=l3k#_L=us z^73VK$4a|)GZ5@t#P}=i+VU0ip*?HGZHc8-LCVFeH*c)8YthxkfBDR&J!_^Xc<#bO z=S!E$(be*#&YcN%LUeV-?^(WVhREOIZJ+69Ps^8!Z1_i-Rxb zNGjA6xjJ8`NJ15jRJ)H#1$Mv4^@GF-c#^9eRlotae*sTcy%N~bJ4i<7+{UnG5&%9; zgn&`5e!WVKu{PsQtAlLyt*X^itj+iwRlZ53fDvwDyg-%jP$^)Tn;36VB|>LMz;GW` z`)d?yGeoO+AkZe&KugD#K&#lK0VqL8wgITyK@IdaH8lY=?64TA3)JWfo#_v&fybKm zHth^2+xCS4Gzm(`rqI+QLFuT8-bd=h#?lEPqHV1Lz_)TjfD(GXKLpUEi<;9|7~T4% z6}S13I`4takZiM60pJY*&|rHm^bS(_1OVVvffC*$0Q?xn9=FG<4B-6X%v3vwn~!E7h8^S?h@qV( ztTSf|%``Xr9tD7AYUx9v*6rT<(Z9Xsd<0wA`3O317S{e0qn3@eGO{6neMYD{jE)y` zX0a=sP35M#jv4tvW;WLq?bdhe(OuD=qSg8^Oqyc_GoLG%c|8r0>Dd`0Vov8X##Cg$ zC>%9s=OUBl*i0&$olQrwnej;z($lFt6mx~lRL+>_vLxF{*2qD2HaFE(ZOr6MM*yl$ zrwWDQ=|R+y zpk{Qbs2wMy&{W?`5;S#8mqNV{o2oVK%Tn`wdr5kiWV05NiZ-vQ2Yw)%RNWhsN=$mR zW7=WqACw+bf;z0DvqyCauSu^@_382+&6GjyWf^)!Zqs72L5oQLZt2mmGu_gQok5k5 z_CC2yJ1jlgUKz~D)^}rf&MsK))9=Z1i=@u;pxBHYR0Q!vPH`0vs9E z-GR?~1N^;mw^r4j;5(qw-Rp*0yH4t$)^3J6sL)&|Ba#5H2^9DnweWtMC4QLh1-w!a zD55?;!q#2}00ZoO>&C;R&)|&YSt9UN@d3bpFj=cqDrYv}HR4g%eu-@GON4y&acN6kda(`YWdBMg1l;jl$kAB8Ue$K&T+$$u1(ZQqsk4XNKgGc?Jll%=T zdAz(|UUBJvmgEZ#9{vBG&54&$Hf=P&!Ec>pVz}K{jZX~;o`3o z&*R{@zaxIZrT<6bpLOwnBL0kn$NBj@$uBr~=X`#Rcr0*!_+B~d(&ya!f{TBH;=bnM zd4FDW@n0eR8!rBb#CK7NeQ};^KBvs{zBOI?Jpa$Qcpew)V|b_kJ8~I)!Wb`3jituN z^TsjI^F}tMo5s8edU|$d#;8w(NV#BIIT7bSwvp{8lbf8S7?}AuQX@S#Ya04{A0ORS zFjMKHpkq!jmYSHz7cx_IKCHaRc4|zIP3BWG21m}$rt32WyN z@1^+sJ~G}(3-VVc2ppeF{2Ii%+dfQRg*(}B1N-9}jK8n?Rap;?%fNpS1i)O~nZ^A> z_FrH{0*{}8@7~?!uZ8ySM@SLp4?h>#p7#&Fr|v!>u2THxU5zf$>fhbs&ry7igYhvN qbjQcMKpm=J`o~wF1wMZav`4t(<9q9#JH#CQ+0;b_Sm2P{@&5~aq&2(% literal 0 HcmV?d00001 diff --git a/libft/ft_strrchr.c b/libft/ft_strrchr.c new file mode 100755 index 0000000..9c293ad --- /dev/null +++ b/libft/ft_strrchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 17:05:03 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:17 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrchr(const char *s, int c) +{ + char *last_occurence; + + if ((char)c == '\0') + return ((char *)(s + ft_strlen(s))); + last_occurence = NULL; + while (*s) + { + if (*s == (char)c) + last_occurence = (char *)s; + s++; + } + return (last_occurence); +} diff --git a/libft/ft_strrchr.o b/libft/ft_strrchr.o new file mode 100644 index 0000000000000000000000000000000000000000..8d3e97766c949fb381e9330ed67b214ae0b28218 GIT binary patch literal 3176 zcmb_eO>7%Q6#iy6ySC%jP8!rElpjlkmLFvj(+UWU(zH!mHwslCji?lmWpCC$biIyt z*XhrNl0=A9fG7tzAXEXD!hr)IkU**`MM9jA=&83}D{%rOE=3A@>lu4JaRmpygXg_( z-kW(d^WIy(aeVfK#uy|RCehZ~cp~1Gr$TWG{a~2SZQPss>!+EBP`o=HW znUY`mM%qi<`NPJ9lY5$8IlfW^XQT%GG;>z_1|2 zXIs?#b3#1Urly5>vP}tT8xFTj&PY*u_ux-<=9<)UZ9{dDUP0^@qlU3-Qhu`KHa8+f z88E|~x;S|Xs}@*4dptE@=&8OvdsF>vmkDUY&{LDiWD?NRI5hzDa7I&8gC89o(o-)a z4<+{xof_9&Q;#XD~w85)K2Z01iRQksxc(J@ByAoBV)S64*l>eJ#&Qa7IkRGWezopqvd{1_o*l`K zH^SKiCx@I0&HaSNlBdd(gUDqhttk51eExuCv0S_<;Dg5%V!QKwog1+XdwPq;a@ z3#aauGY!|TmR)-(Q+0#LlJH@HD5u~D`MPB_JlnNw{Kwb?9uOnD^fK6mKDKv9EdD+N zh5Fmbfb*1d#Rl?&|@-yaYVx97OfVZl2@9o zAQ9dsK~FOy)%&7hnlnbi%o>`>_19;Nn5hr`Vf304MvNN?GiUUiHnbB4d&wBo&vRq9 zxoR*|PfVD)#r21|rXkXCy5o~D-ru*n&FanP-3GnYJvyPcQ?3I#B26s<9Xlgh6Egt% zwy^*QuqzUeY#oP$Ej6(ifWNnzkm*f*L^e2rtSRDK1rn~^gyi=LUG^N}<(h;C#k{mX zAoNGXNN?VHP5@6U_Gg9OZd{%A#})gFLZ6H9x{wL7fy#KAUj-nq*uN_DF#D*k#XYKF;olZ|MvQcq(fgbfyxg}1zGN30 z<$R%7^z0RI&vptturCDQR=rlU-9TFSf$S{Qkc4H^x$2hck*>qtdSLUDrx!;2pkSQ? zcbt`4zOc09`PFiVqf>QlLD-di$t%=sxt&wDI;)@iffp2t;QqxLjsFk6r0&sWsR|Vb zfFG1Oy1yu>{}C6>bwcyMNb@5Tg<7j=rQRgYieeiS1o_c>%FZBp${RH%g3Jd~nN-wJ zS2@Cag8VSl+E8sNuT+jOERyfXwrdF0cKkl)Ul!;8Svb)7>5kR&KPL7cQ}($d_WxMn z<^FP{zC^O>e@P_8{(teOJ|fqO;?r(P)y0 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 12:44:26 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:20 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static size_t ft_str_size(char const *s1, char usedchar[256]) +{ + size_t size; + size_t index; + + size = 0; + index = 0; + while (*s1) + { + while (usedchar[((int)*s1) + 128]) + { + s1++; + index++; + } + if (*s1) + { + s1++; + index++; + size = index; + } + } + return (size); +} + +//returns NULL if any argument is null or if an allocation fails +char *ft_strtrim(char const *s1, char const *set) +{ + char *ret; + char usedchar[256]; + int start_index; + size_t size; + + if (!set || !s1) + return (NULL); + if (!*set) + return (ft_strdup(s1)); + ft_bzero(usedchar, 256); + while (*set) + usedchar[((int)*set++) + 128] = 1; + start_index = 0; + while (usedchar[((int)s1[start_index]) + 128]) + start_index++; + if (!s1[start_index]) + return (ft_strdup("")); + size = ft_str_size(&s1[start_index], usedchar); + ret = malloc(sizeof(char) * (size + 1)); + if (!ret) + return (NULL); + ft_strlcpy(ret, &s1[start_index], (size + 1)); + return (ret); +} diff --git a/libft/ft_strtrim.o b/libft/ft_strtrim.o new file mode 100644 index 0000000000000000000000000000000000000000..e3e0f2d88c82609add84ef3ebfdf53e53c1fb573 GIT binary patch literal 5168 zcmbtYe{36f6@TBm+}WucUlKR1v(nYw+AeL$c}^?JR@24ayx5fmX`0Y=R5gx$PRtxT z*ykv%CfX)0oh!;x5SlazCNzWqF{zWLNoXjftn`=0KNUg2e~*1-M}DnJo5R-=&|_u zzqlDdEOak^p`q1wGJtsfLHxpsR`WA}ME&3A4uMvC04U#E#37RP5AS23OLA?=48-T( zXWI5bh--^W(HphEIRIeVyE5{%rRx3o&80@8(O5`mi=!%w&o8m)xt~6UUQk`G-PLN} z27vlfg53x$#X^l_{iC?Hc(>_e?$EY#XY3i*7Qf8m^VcxMZY#w7WqI&j7O&qyI(~VU z4c1oT+H-f3TC8!Yt9IA)b0T(gRn+R+%eNErH(9dY;Exi&uw?E@)UU_uH3S#)SBdCUr`P zyXalD!2>q-hR_ZX%ixp{53h2hKx?qAIl`zAvrX!l2*0-({+KgDiHI3$Wte7f2<1$R zl-8v1IvIaREra2ANc>5QxNEdk=d&9spTqviE7vApcgzRJjXo%UhEz60ch9{g-+~&LRWo`ac_X`OLGh)|COj8z*nDR zfI$E@wH__pi@EeDJlV~--)w0a6F$rAXAB>ycLyYV2Ni%vuu2}!VGjWOf&sMgSA#1G zV54|Vt1!#}BxIB}85^d33IFqsOnVt92GcI15BKOo4@>Mu5!5RF2LMUupr*K z6)EIZ=0dsM@&Z06JB}Lb!?+uSf%V~t4%H)F;dZv~9cFtB_Q}2Wr(*q>OY?Yl?nN0lAC0AO#de~83jcLgY2qTf*_iY)bhA;p^PB`-udFg1mCm9``U-&W zO`8QaVOM!;&qW5%!^^UH3#T4Mr3Z8B!AG=gmT6y;1wWRl_ZmiI@CbHvyI^d*S~RPH zOd(yI2+SDeO1@MKga-5{^-zE4sVcYbhn$(Jm}Rq^pVBiBoGeWlL36U4HztD58I_mJ z(sVFqrl!(`LMan0%b_3@DU}6M<^6lAkCV*#KIRPMJ^%L1r>thHAyg za)G<&i&IgvV+crlh5Juw_hrJ!P%P%+bG zGi3!U8z%gZk86RK8;f;j1lVjR+q%)^USI%W0Qdy?;0%YTw=?SXN46@1vwZFF3B%Ywy&b?9-x?VJ3sx&-tYENEn3?Ji4RD#i zoS^kmg85>mP|X^kgRKC1218fOY}Ux>lNgD=1%1+5BJF&kAml!#cs97Bs(dsj2gCBw z1;wSxp|GN=Vfk}8MN;McVWs`HBB{F4p}wc=P>(3>>Z^*RhUMg(;#cK^bBd(q6qouZ zMOAfqD5q>vW&bTj=AQ1ymEIvmeNmC)syulMqi@Tpb77@jl}}?&U2&;L)v&Tjjqxr! zRe9$v#jPGuTd}mmNBVvDW0PlQ!-*5o)U603W zL$@t|J|_X-t%vv@rnp!MoRa^-+g_v5Xs3c8k6WGKx7&E!Jq6!SJWekB6a0Y9A9rQJ zi;7_kzQYs5wu-#)L3EQ{@ViOhY~x)dBlwm^J3PkOPqs&?#kBY_MA%2Ii2nlV0}lQq z>7s7JACDnKf?C1XNgs9a;vy-oHp2fk@)H+2!HYYbxYG%KlKd|^;@3$3CbiDz{jS6R zJ<@+{<6El(;Hr(sdWz>2{V*T&7Y8)1JA}ydx1@^;q~Jw;enWNe~bJ-w(;oyXVS&|7j+X?*}Kcfr?8$i z#;X&l^!Rw$m;t?P6wfut(G(sPvkZDt$Huxu(8+C`>sCiAR=$`M2R%R2 z^WX6v8rbwUo?m?CR4d`dddLnG9t1llrpPNOH9a2 zkAq%0J;mE{DVsLaNQZR$z3%_O2hREtmgp!D^HzXfQxn_ijKVo;hxMC)buk4w8827rqzGCd3hvUrT*f)6cEoZ@STUuzXh8A zVxD3B@D3pQ3m*4zXHEz=ISx6D4i)grXTA6LgLTG7$~pd7T))W%mXZH*B_P(X0OpTy Yj*mZqIBSO(rcc#RQwMBtZ0Gp@0jW|mMF0Q* literal 0 HcmV?d00001 diff --git a/libft/ft_substr.c b/libft/ft_substr.c new file mode 100755 index 0000000..acb9dd3 --- /dev/null +++ b/libft/ft_substr.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_substr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/15 11:27:50 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:22 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void ft_memcpy_with_nullchar(char *substring, char const *s, size_t len) +{ + ft_memcpy(substring, s, len); + substring[len] = '\0'; +} + +//check for out of bound access and return NULL if s is NULL or allocation fails +//len 0 or out of bound start just returns a null character +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + char *substring; + size_t slen; + + if (!s) + return (NULL); + slen = ft_strlen(s); + if (slen <= start) + return (ft_strdup("")); + s = &s[start]; + slen -= start; + if (slen > len) + substring = malloc(sizeof(char) * (len + 1)); + else + substring = malloc(sizeof(char) * (slen + 1)); + if (!substring) + return (NULL); + if (slen > len) + ft_memcpy_with_nullchar(substring, s, len); + else + ft_memcpy_with_nullchar(substring, s, slen); + return (substring); +} diff --git a/libft/ft_substr.o b/libft/ft_substr.o new file mode 100644 index 0000000000000000000000000000000000000000..da5d69b9da4ec2d8a9cfa3bbe18d317110929eac GIT binary patch literal 4720 zcmbtYZ){Ul6hF7G?{(1ex~<4I5Hb@41bJOiqv#y8incocAR925)UJKqs_pC2zD^+^ z29#J8ln-iRG#V2lBt|j%!NkO1Krs5n_(6<`22D&be8KqVgP35>edn~VuU%r|FIn$B zzkANP_n!Ob+_!z3M(*$l0Sp1d(2yFqxS&zrD61Qx2Lz18w#Bx_MzFdy*)Go5+NjX$RKh*?` zadl^%+QQXGi1NelV(bl;jx-dh)`CTKl~Jymb!sbD*&(_gZR37xi(kURy06V#&DNLx6?4929*x7z_evD% zbhWYXm3Tk9N`^P|1I$yw*V}M6|N15|xKu>LXt_N&9^4iL=v2Yi7Yzd}sO=YkZ2)?0 zzmRGGp=b9C@bw*u_W^V{8ZX8BQK`Ezhh%uDAG_{R)sz=wng3B@T#0f4FxH>z@t{Nn(iqM9cBxaTw^0#)+pGh|z!qk{{KybD3mghLVhx5qe0OuW@dJ!9?RR)DXUs2 zWTw+)aJ=NLDR4w6m=+XD*3>}Ns^q6EGdqyCY^daSnwR&3Ag-^9>4OKf z=hegh7nFlO-&TEjYPFZi7!{Jbt_EZHmj7I2R1Ubud72X4V45+0-pi zKx^R;O5=iPf&zMzjKKc8T3CSO96YA9cKU1a0J_F6_Y?rUJBR*a>JuY@7uG+Q9o*pJ z@#K}S<8%PL>e1)%zwP2tpPx|2Ts*GJ=OlmR z;!z*ZC*or&d0rd`exUMrmeN5zeyYi^khe@C%;{9FoGzN+JP^3= zLMhXf#BdaLdJ>GvuA(ff<^cS5bDvwrIeOC`B?8}TxCe-aKH|Tp{`vl6oTG|&yexD1p(mFzexk~2tVr;P z5S+t)FAf&-2iY;a_S@&M-$k4H3y* +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:44:42 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:25 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + return (c + 32); + return (c); +} diff --git a/libft/ft_tolower.o b/libft/ft_tolower.o new file mode 100644 index 0000000000000000000000000000000000000000..c2fbbaa112d8541f413b738d8af60e281be57ed9 GIT binary patch literal 2080 zcmbuA&rcIU6vy9msRE@fP=D~lm>y7K3|lH*&;*I{LlV?TLeNv)F57m)c9(3Y2p-gg zGYJ=?M~)o*2aF~j{BMljG#)T-_q}#H+F;@*O=jMA=gpgW^Je;Ladjyn1TX^Tpl!8z z*3<6KN8NeIf`EfZ9}kxE`#;CB_r81&fu0EpxDMr#>p$5u!KK!R;F#0FX-{TKiY zfs>FCPnPU~^>Wjf&Ajbdel@@2gbg?F^TiwHv{{@g&Nid3Gf)M9Tn?QbFr~9A z!L);V-SH)VY{*cl4KPE;v&hf&D*>2(ARTl0;rdiVTJ{#0p0`skS(}?-!>x7<_gvp0 z!Ksxhp;dR3nN1tah76@u2D7nO$M%0Y)XtsxM8$B#0uj9z3fcH>wCae7-!N#^88gTo zg6`HIJRs%1_C=46b)jp>8}fU4ivLZmzL_H`j&CGnXk0JZBh+FYWBh4$B)(GXvOw@! zxjo;-e}e{0vSSzj#V-4Q$pJKUc`x?gR__Axng;6o;{7wSOa2b2emGBwi!2Pdk6S*XsMk9RDRgzKXnlj*tIh#_CCcTV`K`>z~2(BYOVcY3~U0g9aXxfF{1R Gdi>ue)}NRF literal 0 HcmV?d00001 diff --git a/libft/ft_toupper.c b/libft/ft_toupper.c new file mode 100755 index 0000000..a1417dd --- /dev/null +++ b/libft/ft_toupper.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 16:43:04 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:27 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + return (c - 32); + return (c); +} diff --git a/libft/ft_toupper.o b/libft/ft_toupper.o new file mode 100644 index 0000000000000000000000000000000000000000..e74e84a19654d45326cad10a3afcd4081e3b9b54 GIT binary patch literal 2080 zcmbuA&rcIU6vy9mDFUS}P=D~lm>y7K3|lH*&;*I{LlV?LLeNv)F57m)cDLD133yNw z&Lmun-sH&9f561Vga3wqfzg}B1LketYp0_PCVtXn=6!eGyqPy|rZ1P)mSaKyBVZod zR-0!%?fyd4U4S$QIDGu>aOKOv&++vA&!5DwxSGnujnvSkiPW$d=>>?H0y_(%Z|;p5 zsoRM=iK(&G%-t~nBM!0ArnH&?=$Ql~HJ?Z%0ALdUn(_LgwG6gnDCZ1~4W0Ox4~;`s)My&*9%c&_hA zH1*5$4fn<@MyZ*^tqJifmBa>fB=Fa<@QD6af{dhyrw1}|@gXKaIdF}GX#Ve~njB%Y z)7^mqMu*K9(97Kp48TL~TzQ^kc#0(GS{VT8u8evRyliXKdi_J*e0WM`?xm}=ZS>H2!W+;)nMa=|JVLuVIE z>Fh}`?Vwt9e90f{GE`~<%+T>H@^k%C0Hz;E$6R@|IbD~Qy#uD_?N$rc_I6lz%N@f# z*LO&8Duq&LRUKt!(+0CHLunPktnXK`{a=o>b7wwMF&wi%MDK+{x_LKRb;LB^Flf~o zGsGQ&?$#eXB;|qjMURhlp=-!%@_TxQ|1GV)nPV!BZzQB>Tp!t^)M6cD{26v6zEbP5 zK=4|*z0k#fiv~=wV;BFWF8hDM0W@@Zzv*97?*j6Q2I~9b{WG#l{*I`AI8T_ret?!g z>y<9+e^2qxI)A*^>ifi;{3SlVioAY~kN;xE+G&7WW?zKspTYGbdj8&O?+EjQ2A+_B JCcd?L{NH4Lpho}z literal 0 HcmV?d00001 diff --git a/libft/ft_utoa.c b/libft/ft_utoa.c new file mode 100755 index 0000000..83397b5 --- /dev/null +++ b/libft/ft_utoa.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_utoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/22 17:36:09 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:38 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static size_t nb_digits(unsigned int n) +{ + size_t i; + + i = 0; + while (n > 0) + { + i++; + n /= 10; + } + return (i); +} + +static void recursive_utoa(unsigned int n, char *ret, size_t *index) +{ + if (n > 9) + recursive_utoa(n / 10, ret, index); + ret[(*index)++] = (n % 10) + '0'; +} + +//converts an unsigned int to a string, returns NULL if an allocation fails +//works for any size of unsigned int (future-proof) +char *ft_utoa(unsigned int n) +{ + char *ret; + size_t index; + + if (n == 0) + return (ft_strdup("0")); + ret = malloc(sizeof(char) * (nb_digits(n) + 1)); + if (!ret) + return (NULL); + index = 0; + recursive_utoa(n, ret, &index); + ret[index] = '\0'; + return (ret); +} diff --git a/libft/ft_utoa.o b/libft/ft_utoa.o new file mode 100644 index 0000000000000000000000000000000000000000..0b696eb587a746a440d47d85406da52700112c39 GIT binary patch literal 4760 zcmbVPZ)_aJ6@RmPv%dJ^J=6;ed|rOg*e-4clgiHI+V@}a8wA#Fa;KN3;}=&Cn6 zZ*M)0rK&&4p7(z9-pt!KGjHZjKX~Np8e>3Ua3A!v9L+ z*U{@YZ(qH7HTYZIO7HxEFghQ+Wv4H`V_*LJsJ(iHt^Q|AaP6rZ*Rjt&`-XqO4%X}| ziCsbu{t|p>2X9`#6FZ+x?0Pey!;Or6?rYc^x&&)Cw8Ee4;5~cw_sK^eTdSWh6;Bk8 zPam~|cPE37f=`Pvp>$z{&K*EB58cfkShM@ZbOV-e7snGY;8<@24ahp7?en?MAUH-=Od~_VoOp9 z_%|zEAkB{qk4q`SEmE>%%b*nXNs!4GB9mhz-V;$%WKFnN3KOzraFj%fpTYFT2#?YL z1oAp82@S?Bko;)GJr&8l(KifrMwA<@ECZ#!WY{G7BoE(1?-Qu8-7W)2 zQU}|OgVAXOwg-EA>RuebpUwp$hhyBmGllXO0m8tGs11B93__T!q%DHUrnDCT(lhaT zI7nts^n%*a3up%h6jRrSyW=$5Fw>OQ29rIk;YSYP;QC$YG~B^iGadsF=`dJknE{L- zkr8<-&2~J$ldCo=-dt|cX|>&^mn-bI#;n4=!dE(?_W;!Wa>s90tSaQ^n+s0fpKrO& zT>b&4{iNSKm9P8dg-WB*tmYf;Y~2TMwp?@PT)z#CrZ<=Ccx`vib80!)^P%l7J7pg{ zSjW0JMcZ%HI;WsIUun^d&~mDsR@+^4L;%ood~m&*vjqQRs1?_nu8U* zw*Uap_G>k#Zq4H`BH`A2cto~{gM!d^GoI`p=Z0bF$1TnceOq#cYd_~H<1p7|c+$|b z7VkUB4dW08ecD1Mf5_0MR=8&9V~4nLfe#pmdCJh2>xN!R4s&Mc2P_Wyw=eNzfAaI_ zs?S<{#L#!naNStZE3fixhMt?@BgS93d6*Bs%$e~GEd{Zc!OiiCIL-g;s=au3F2Sj3CNj%5qv!Iz*Ci+ofVMT{YczeDP`#`vfn z0l;TsJdQ)}o6kue_jp*^L)@j<(@W$_3cn;Uyku;KZ1b)z%ODv z+W%VWugR9;r-$6-m_3g3qSW6~czT?@r;H=6M*#Sj!Y@eu6NQiRBIBjJ;dw^jD*-`y zD@*;B7$47DF2;-arM@f1$Mcqt@gmPsKM>>Nd7F?tHn=}2|0fmuAPgIt3Qy~YF8~Cd z#rQtA6`t}#`;_L5VAY)2&Rn@NJKJ&=!D=~;isd^?K3LV}!h+-ZWYP9pU>&ir>D`o} zeK>^c)tg{>P2aH|`c`RQ+pkog1Pkw$a-~*lwcWXO<_*_#B;m}L>#fRy1K}M`Gd7yl z*tLT*`;}R++TUHkR$fTz{cN?GwTfRs>w;B?KJ)*@FYzk7iSw5SLJ}W`ameM0fcHLf zR1XQ^Z%^3Zuh#Iivc3dcJ`ZWV@yUgIfofz{8eWt0?Uk(y6F$|0el6FZ1_=j05wB=Tyz#sEnWP7s4ex z>;UjvA|z;jYVn>zS@mzr4Y7wDH}S{cnKV`$KT|i9;!nW)fdQOSmI+>w{&Zgu==%w$ zH_6{W@^Oj^-X` +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/23 13:59:32 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:36 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include "ft_vector.h" + +static int ft_is_sign(char c) +{ + if (c == '-' || c == '+') + return (1); + else + return (0); +} + +//converts nbr into a known to be valid base, then append it to vec +//returns 0 if the concatenation fails, or 1 if everything goes well +static int ft_put_ok_base( +unsigned int nbr, +char *base, +size_t base_lenght, +t_vector *vec) +{ + char buffer[32]; + int i; + + i = 31; + if (nbr == 0) + if (!ft_vector_pushback(vec, base[0])) + return (0); + while (nbr > 0) + { + buffer[i] = base[nbr % base_lenght]; + nbr /= base_lenght; + i--; + } + if (!ft_vector_concat(vec, (buffer + i + 1), (31 - i))) + return (0); + return (1); +} + +//returns 1 if the base is valid, and 0 if it's not +static int ft_is_ok_base(char *base) +{ + char used_characters[128]; + size_t i; + + i = 0; + ft_bzero(used_characters, 128); + while (base[i] != '\0') + { + if (used_characters[(int) base[i]] == 0) + used_characters[(int) base[i]]++; + else + return (0); + if (ft_is_sign(base[i])) + return (0); + i++; + } + if (i < 2) + return (0); + return (1); +} + +//returns a standard C string of nbr converted in the "base" base +//base have to only cointain ascii characters +//returns NULL if the base is invalid or if an allocation failed +char *ft_utoa_base(unsigned int unsigned_nbr, char *base) +{ + t_vector *ret; + char *ret_str; + + ret = ft_create_vector(2); + if (!ret) + return (NULL); + if (!ft_is_ok_base(base)) + return (ft_free_vector(&ret), NULL); + if (!ft_put_ok_base(unsigned_nbr, base, ft_strlen(base), ret)) + return (ft_free_vector(&ret), NULL); + ret_str = ft_vtoc(ret); + ft_free_vector(&ret); + if (!ret_str) + return (NULL); + return (ret_str); +} diff --git a/libft/ft_utoa_base.o b/libft/ft_utoa_base.o new file mode 100644 index 0000000000000000000000000000000000000000..054f9cde8e5bfe105771818582bc8227597eeff3 GIT binary patch literal 6704 zcmb_geQZD+gZ z{c@8?`(sB+?m54EzV3(bJ@*~$>EGdE42T$Pfr?b2yDKXER?cpP8ekCJ6Wu)+JO2I| z0Eo@}BRcb+pSu9y&!`fc+1~1notO^eq7Bm`&+{Rny$* znONZRjblgZf)F_I3jmngUKeD??r#W8zYYM$?r#iCzX||>OZ^IqP0h0DYo+V4sgGQN z$*=Q(@A1I>r;fCGdro{{b;o9|TwVnLcUA{hVQA=h>%)7|nYo!?2QImlFK+J&#-`>T zpz6BqGk0T~uNH6hbbN52>@bV#;~bc4ZWd{`v8`qGoNpZ55QLsy&>BgV0nlkj=lk^t3mPihEVu~55TW8 zOlNEO#chq1@J}@Y1XOS}R1yew%@b=@vW^g1j`;Ta_V@s5Rd9tnLI9yI!PKDzA}i1n zGW9c)jGF;8oSbCf3ZLB;1_;kgGC*$tjm}BvZp1vAR6f||N{@}VtmF8~b+{Y}1;EYM z#mo2Ga(Rt7eTo6N6l7I5*Jhm?0D!3ovCjPfpmFx`Y?*!HC?Xyc7YjL!d6BO=ghwtc zL&)p#ox~OZTsl|scy0GVhx;I!*-5e{2j2V<=7W8#1v9YOl^E7$A9_$uCK6+m;%anZ zr{r;a+zh}M5I;2~%!eOQYO7HPoho&}dGxBR@K*TxAm{n;8p2Q+TLk=QjD*w1_8`al z(HU-BPOKkucZk>2t4>|wpd zPkC@rn-O(4H{nrl!(7kZh$>AC{dhD5paqxFcJUB*!T<4nXQMX2(Qbu&d7=uyN?V~B z*N7|FL6wzF`?-6xf#F0cXO$w!Y&nJ^2*OgN*o zUNrS2w59XoW}B5RWX!R)?Pl?Sl|R^)vW)R~Hk(hjWiyGC1(}?McA27)KfnzEts$9? z7ob!$M-AlSNy{u0!7!o&1JS+4VDGa%#?anfJ%#}p$mVlnky5Uh8OxcY5%gEg95xMd zi#Q}P#=(+R4w6e0V4e*|HL_-IEN#JrnS?|sl`;#E$&H$axI;)~a+zY<9EGAWVJ5A7 z0W4xtmXR!&am#c7iNj_gk3B`JkTrA2*=EMUQZb!~Cl5HFWImUS^Nc5~JWn=NFrD7Y z^IFc@z#$Y&3;!_2|GG$=_%98AI)?{<9SXAMi%tQOOMehD0(J++Q;@x2NF4=sCAgY2e z7hX#UqUR6cyoAD=Q1l~CK9QOnIQpUSKO}HW%elKgCh0#bS z3CC+5X;`#`Q~jTk@Xrbv_YV^3zaV7$SzW;|3jCC4N&jUbe^tV<)IfSgw4{%f2hs)6 z5{{2{q)VbD{DzR}^+Pz#!<&*m?I(JskpAC<9`zIccY*&^@U&872Mf;Qd)QkNW z6fNP^LZ*F7IK^$1^eJAugww&*E#X+*A`Occ8|QvYO8Q?Aa?XJ}iY+KOaNN(Qg#392 zj`~=QA{}?&s88$iB?pfB-xKmrIdIg!AO>;HfusMIg?v%8*q~~g@PFN* zkA5B%^6w=5QKA2#gwwivM10H>{oEFMK?#3N;EfU<7xEej-yq~p2{(kFsK8M~mcF74 zNjQB~$xHY*#JHv;oZjd!N;vJ$S0$XjwER@UH;O#337poE9{TS|IPK$m624jZS&ozI z*bh$&e2s+f7WmT=J|^%X3C{~WBIX0bixfDW5ICwianMK2L}|>3ClUp70`!8Jjq8?q z$O1i?A0IdEVqDazq9_$6SYj?#=SqdDUH00J?O2&y%2@~Nxx8iS&+HuDShVIB!R5MG z$4b$NkB%0KnX!2#;XKFLOpX9EZKMkEag$ewSV4=}S-Y5amXvzYDp>IZ=*8#9vHic0 z!o-VQqIX209TMwBB#FEpN6dNmBH7=R?T5INH#eKmgzoyD1adQ9HH7_-_h(naGX^>j4IE zP+BJVgRqysT+;Z7-dbw@#Qvpyg7fEFWd7!s$iE$x@hhE_uq5*OXR-Y|yGVSjqbYyN q>-%_*^*_k-Pje2U-yaeEZshnr{60uZ4thxx(rICU4c7f~{Qm+tJJm}7 literal 0 HcmV?d00001 diff --git a/libft/ft_vecint.c b/libft/ft_vecint.c new file mode 100755 index 0000000..53c0df5 --- /dev/null +++ b/libft/ft_vecint.c @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/18 11:14:16 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:45 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_vecint.h" +#include "libft.h" + +//creates a vector of initial size size +//returns its address, or NULL if any allocations fails +t_vecint *ft_create_vecint(size_t size) +{ + t_vecint *ret; + + ret = malloc(sizeof(t_vecint)); + if (!ret) + return (NULL); + ret->buffer = malloc(sizeof(int) * size); + if (!ret->buffer) + { + free(ret); + return (NULL); + } + ret->index = 0; + ret->size = size; + ret->finished = 0; + return (ret); +} + +//append c to the vector dest +//returns NULL if the allocation fail and the adress of dest if all goes well +t_vecint *ft_vecint_pushback(t_vecint *dest, int c) +{ + int *buff; + + if (dest->index >= dest->size) + { + buff = malloc(sizeof(int) * ((dest->size + 1) * 2)); + if (!buff) + return (NULL); + ft_memcpy(buff, dest->buffer, (dest->index * sizeof(int))); + dest->size = (dest->size + 1) * 2; + free(dest->buffer); + dest->buffer = buff; + } + dest->buffer[dest->index] = c; + dest->index++; + return (dest); +} + +//append size ints (NOT BYTES) at src to the vector dest +//returns NULL if the allocation fail and the adress of dest if all goes well +//returns NULL if dest or src is NULL without doing anything +t_vecint *ft_vecint_concat(t_vecint *dest, const void *src, size_t size) +{ + int *buff; + + if (!dest || !src) + return (NULL); + if ((dest->index + size) >= dest->size) + { + buff = malloc(sizeof(int) * ((dest->size + size) * 2)); + if (!buff) + return (NULL); + ft_memcpy(buff, dest->buffer, (dest->index * sizeof(int))); + dest->size = (dest->size + size) * 2; + free(dest->buffer); + dest->buffer = buff; + } + ft_memcpy(dest->buffer + dest->index, src, (size * sizeof(int))); + dest->index += size; + return (dest); +} + +//frees vec and all its members, sets vec to NULL and returns NULL +void ft_free_vecint(t_vecint **vec) +{ + if (!vec) + return ; + if (!(*vec)) + return ; + if ((*vec)->buffer) + free((*vec)->buffer); + free(*vec); + *vec = NULL; +} diff --git a/libft/ft_vecint.h b/libft/ft_vecint.h new file mode 100755 index 0000000..6873dde --- /dev/null +++ b/libft/ft_vecint.h @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecint.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/18 11:12:31 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:48 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_VECINT_H +# define FT_VECINT_H + +# include + +typedef struct s_vecint +{ + int *buffer; + size_t index; + size_t size; + char finished; +} t_vecint; + +t_vecint *ft_vecint_concat(t_vecint *dest, const void *src, size_t size); +t_vecint *ft_create_vecint(size_t size); +void ft_free_vecint(t_vecint **vec); +t_vecint *ft_vecint_pushback(t_vecint *dest, int c); + +#endif \ No newline at end of file diff --git a/libft/ft_vecint.o b/libft/ft_vecint.o new file mode 100644 index 0000000000000000000000000000000000000000..cd91b8fb5b4520c77d84d1efb991b71201c97983 GIT binary patch literal 6128 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 r>i7Qyp1 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/21 17:45:12 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:42 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_vector.h" +#include "libft.h" + +//creates a vector of initial size size +//returns its address, or NULL if any allocations fails +t_vector *ft_create_vector(size_t size) +{ + t_vector *ret; + + ret = malloc(sizeof(t_vector)); + if (!ret) + return (NULL); + ret->buffer = malloc(sizeof(char) * size); + if (!ret->buffer) + { + free(ret); + return (NULL); + } + ret->index = 0; + ret->size = size; + ret->finished = 0; + return (ret); +} + +//append c to the vector dest +//returns NULL if the allocation fail and the adress of dest if all goes well +t_vector *ft_vector_pushback(t_vector *dest, char c) +{ + char *buff; + + if (dest->index >= dest->size) + { + buff = malloc(sizeof(char) * ((dest->size + 1) * 2)); + if (!buff) + return (NULL); + ft_memcpy(buff, dest->buffer, dest->index); + dest->size = (dest->size + 1) * 2; + free(dest->buffer); + dest->buffer = buff; + } + dest->buffer[dest->index] = c; + dest->index++; + return (dest); +} + +//append size bytes at src to the vector dest +//returns NULL if the allocation fail and the adress of dest if all goes well +//returns NULL if dest or src is NULL without doing anything +t_vector *ft_vector_concat(t_vector *dest, const void *src, size_t size) +{ + char *buff; + + if (!dest || !src) + return (NULL); + if ((dest->index + size) >= dest->size) + { + buff = malloc(sizeof(char) * ((dest->size + size) * 2)); + if (!buff) + return (NULL); + ft_memcpy(buff, dest->buffer, dest->index); + dest->size = (dest->size + size) * 2; + free(dest->buffer); + dest->buffer = buff; + } + ft_memcpy(dest->buffer + dest->index, src, size); + dest->index += size; + return (dest); +} + +//duplicates the content of a vector into an appropriately sized string +//returns NULL if allocation fails or if vec or vec->buffer is NULL +char *ft_vtoc(t_vector *vec) +{ + char *ret; + + if (!vec) + return (NULL); + if (!vec->buffer) + return (NULL); + ret = malloc(sizeof(char) * (vec->index + 1)); + if (!ret) + return (NULL); + ft_memcpy(ret, vec->buffer, vec->index); + ret[vec->index] = '\0'; + return (ret); +} + +//frees vec and all its members, sets vec to NULL and returns NULL +void ft_free_vector(t_vector **vec) +{ + if (!vec) + return ; + if (!(*vec)) + return ; + if ((*vec)->buffer) + free((*vec)->buffer); + free(*vec); + *vec = NULL; +} diff --git a/libft/ft_vector.h b/libft/ft_vector.h new file mode 100755 index 0000000..142d684 --- /dev/null +++ b/libft/ft_vector.h @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vector.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/21 17:45:45 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:50 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_VECTOR_H +# define FT_VECTOR_H + +# include + +typedef struct s_vector +{ + char *buffer; + size_t index; + size_t size; + char finished; +} t_vector; + +t_vector *ft_vector_concat(t_vector *dest, const void *src, size_t size); +char *ft_vtoc(t_vector *vec); +t_vector *ft_create_vector(size_t size); +void ft_free_vector(t_vector **vec); +t_vector *ft_vector_pushback(t_vector *dest, char c); + +#endif diff --git a/libft/ft_vector.o b/libft/ft_vector.o new file mode 100644 index 0000000000000000000000000000000000000000..8e2e270d13351b34b1e3cce2f779c95ca51a3fd4 GIT binary patch literal 6744 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 literal 0 HcmV?d00001 diff --git a/libft/get_next_line/get_next_line.c b/libft/get_next_line/get_next_line.c new file mode 100755 index 0000000..e65b9e6 --- /dev/null +++ b/libft/get_next_line/get_next_line.c @@ -0,0 +1,186 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/17 16:43:41 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:06:56 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +char *ft_read( + int fd, + t_gnl_list *node, + t_gnl_vector *vec, + t_gnl_list **node_before); +t_gnl_vector *ft_read_buffer(t_gnl_list *node, t_gnl_vector *ret); +char *ft_read_return( + t_gnl_vector *vec, + t_gnl_list *node_to_free, + t_gnl_list **node_before, + int return_null_flag); +t_gnl_list *ft_gnl_create_bufflist(int fd); +void *ft_gnl_free_list(t_gnl_list **buff_list); +t_gnl_vector *ft_gnl_create_vector(size_t size); +char *ft_gnl_vtoc(t_gnl_vector *vec); +t_gnl_vector *ft_gnl_vector_concat( + t_gnl_vector *dest, + void *src, + size_t size); + +t_gnl_vector *ft_read_buffer(t_gnl_list *node, t_gnl_vector *ret) +{ + t_gnl_vector *temp; + size_t initial_index; + + if (!ret) + ret = ft_gnl_create_vector(2); + if (!ret) + return (NULL); + initial_index = node->index; + while ((node->index < (size_t)node->nb_chars) + && (node->buffer[node->index] != '\n')) + node->index++; + if (node->index < (size_t)node->nb_chars) + { + node->index++; + ret->finished = 1; + } + temp = ft_gnl_vector_concat(ret, &node->buffer[initial_index], + (node->index - initial_index)); + if (!temp) + { + if (ret->buffer) + free(ret->buffer); + free(ret); + } + return (temp); +} + +char *ft_read_return( +t_gnl_vector *vec, +t_gnl_list *node_to_free, +t_gnl_list **node_before, +int return_null_flag) +{ + char *ret; + t_gnl_list *next_node; + + ret = NULL; + if (!return_null_flag) + ret = ft_gnl_vtoc(vec); + if (vec) + { + if (vec->buffer) + free(vec->buffer); + free(vec); + } + if (node_to_free) + { + next_node = node_to_free->next; + if (*node_before != node_to_free) + (*node_before)->next = next_node; + if (node_to_free->buffer) + free(node_to_free->buffer); + free(node_to_free); + if (*node_before == node_to_free) + *node_before = next_node; + } + return (ret); +} + +//vec must be initialized to NULL or it will cause a segfault +char *ft_read( +int fd, +t_gnl_list *node, +t_gnl_vector *vec, +t_gnl_list **node_before) +{ + if (node->index < (size_t)node->nb_chars) + { + vec = ft_read_buffer(node, vec); + if (!vec) + return (ft_read_return(vec, node, node_before, 1)); + if (vec->finished == 1) + return (ft_read_return(vec, NULL, NULL, 0)); + } + while (node->index >= (size_t)node->nb_chars) + { + node->index = 0; + node->nb_chars = read(fd, node->buffer, BUFFER_SIZE); + if (node->nb_chars == 0) + return (ft_read_return(vec, node, node_before, 0)); + if (node->nb_chars < 0) + return (ft_read_return(vec, node, node_before, 1)); + vec = ft_read_buffer(node, vec); + if (!vec) + return (ft_read_return(vec, node, node_before, 1)); + if (vec->finished == 1) + return (ft_read_return(vec, NULL, NULL, 0)); + } + return (ft_read_return(vec, NULL, NULL, 0)); +} + +//returns the node having fd as its fd member +//node_before set to the previous node +//if no node is found, the last node is returned +//if we return the first node, flag is set and node_before = current_node +t_gnl_list *ft_get_current_node( +t_gnl_list *start_node, +int fd, +int *first_node_flag, +t_gnl_list **node_before) +{ + t_gnl_list *current_node; + + current_node = start_node; + *first_node_flag = 1; + *node_before = current_node; + while (current_node->next) + { + if (current_node->fd == fd) + break ; + *first_node_flag = 0; + *node_before = current_node; + current_node = current_node->next; + } + if (current_node->fd != fd) + { + current_node->next = ft_gnl_create_bufflist(fd); + if (!(current_node->next)) + return (NULL); + *first_node_flag = 0; + *node_before = current_node; + current_node = current_node->next; + } + return (current_node); +} + +char *get_next_line(int fd) +{ + static t_gnl_list *buff_list = NULL; + t_gnl_list *current_node; + t_gnl_list *previous_node; + t_gnl_vector *vec; + int flag; + + if (fd < 0) + return (NULL); + if (!buff_list) + buff_list = ft_gnl_create_bufflist(fd); + if (!buff_list) + return (NULL); + flag = 0; + current_node = ft_get_current_node(buff_list, fd, &flag, &previous_node); + if (!current_node) + return (NULL); + vec = NULL; + if (flag) + return (ft_read(fd, current_node, vec, &buff_list)); + else + return (ft_read(fd, current_node, vec, &previous_node)); +} diff --git a/libft/get_next_line/get_next_line.h b/libft/get_next_line/get_next_line.h new file mode 100755 index 0000000..8029200 --- /dev/null +++ b/libft/get_next_line/get_next_line.h @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/17 16:43:34 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:06:58 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# ifndef BUFFER_SIZE +# define BUFFER_SIZE 512 +# endif + +# include +# include + +typedef struct s_gnl_list +{ + char *buffer; + size_t index; + ssize_t nb_chars; + int fd; + struct s_gnl_list *next; +} t_gnl_list; + +typedef struct s_gnl_vector +{ + char *buffer; + size_t index; + size_t size; + char finished; +} t_gnl_vector; + +char *get_next_line(int fd); +void gnl_cleanup_fd(int fd); + +#endif diff --git a/libft/get_next_line/get_next_line.o b/libft/get_next_line/get_next_line.o new file mode 100644 index 0000000000000000000000000000000000000000..8bebbabc4fc37e1bf475e21e58d84927a4bbe523 GIT binary patch literal 13736 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/17 16:43:37 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:06:55 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" +#include "../libft.h" + +//allocates and returns a new t_list node, setting next as NULL, allocates +//BUFFER_SIZE bytes for the buffer. returns NULL if any allocation fails +//index is set to BUFFER_SIZE and nb_chars to 0 +t_gnl_list *ft_gnl_create_bufflist(int fd) +{ + t_gnl_list *list; + + list = malloc(sizeof(t_gnl_list)); + if (!list) + return (NULL); + list->buffer = malloc(sizeof(char) * BUFFER_SIZE); + if (!list->buffer) + return (free(list), NULL); + list->fd = fd; + list->index = BUFFER_SIZE; + list->nb_chars = 0; + list->next = NULL; + return (list); +} + +t_gnl_vector *ft_gnl_create_vector(size_t size) +{ + t_gnl_vector *ret; + + ret = malloc(sizeof(t_gnl_vector)); + if (!ret) + return (NULL); + ret->buffer = malloc(sizeof(char) * size); + if (!ret->buffer) + { + free(ret); + return (NULL); + } + ret->index = 0; + ret->size = size; + ret->finished = 0; + return (ret); +} + +//append size bytes at src to the vector dest +//returns NULL if the allocation fail or dest otherwise +t_gnl_vector *ft_gnl_vector_concat( +t_gnl_vector *dest, +void *src, +size_t size) +{ + char *buff; + + if (!dest || !src) + return (NULL); + if ((dest->index + size) >= dest->size) + { + buff = malloc(sizeof(char) * ((dest->size + size) * 2)); + if (!buff) + return (NULL); + ft_memcpy(buff, dest->buffer, dest->index); + dest->size = (dest->size + size) * 2; + free(dest->buffer); + dest->buffer = buff; + } + ft_memcpy(dest->buffer + dest->index, src, size); + dest->index += size; + return (dest); +} + +//duplicates the content of a vector into an appropriately sized string +//returns NULL if allocation fails or vec is NULL, or vec->buffer is NULL +char *ft_gnl_vtoc(t_gnl_vector *vec) +{ + char *ret; + + if (!vec) + return (NULL); + if (!vec->buffer) + return (NULL); + ret = malloc(sizeof(char) * (vec->index + 1)); + if (!ret) + return (NULL); + ft_memcpy(ret, vec->buffer, vec->index); + ret[vec->index] = '\0'; + return (ret); +} diff --git a/libft/get_next_line/get_next_line_utils.o b/libft/get_next_line/get_next_line_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..b510e2ff2c633052cf218206972b3568d09cf7f6 GIT binary patch literal 6848 zcmbVQeQaCR6+hQ6_t~)<$4#J3XaUouC4=QTp@8~fvN)k&2bTrXK&wKHV?QTe9Xt5F zWNpQotzFSf3hVx2V$;|Mn#RNcX-pbI8Wm*}Y1)T0X@EA3jXyS|PJ(?=Ha0q)`_6fO zeoe%*BiZ-d-#uUV``ov*D|<^o2w)O049!}TM%HCQPB%WtF3*J0%S*A$!)=$Ox4&=6?DDnehO^>)T3m3w zr!$S8q?fm*8)vhPw;XhNES44Trp4)WV=R_l-l@=R0T zodm3R6(^X@xX`3u>plWzT#+eepK+lB%sxxd$`Ra8t%qI331+|TLKj8AHh=DlOffr5 zdqJ$O#Um?V53^0J9GP^9ef`w+bqBLetplz&(K}S0r&7QKvzy!q?@bchG&I2mm?lW% zK38js*+*UIq5)c@rlYRN1hY-8i-Hzw#pY06j`nKN z9g&@pt9vuupX>!_lMq<%K$&g;d3{S&ZyXb1sC%sd2tIU7K%nQ#qdfp2Lo}@xqzn;N>1 z>iHTT#uj=~00cCKaEpk$u_n477p$+U{Q+?I8Hh`<6D$?t_-t~)MAMRP+lpwZX zYg6wlO}*`{dOKRHJFfw6G|5)0!+#e5`evG7q@cJX@W2Y#Q3#4Xfh7ovDQpLI>IOEV z^>+0)A^_TNK}+FX0wAJBEf{ipy001WBzkp57{N)5xY^UGRbq1d1B9Ot03FXz%-R)E zG}5oFSLYDwYQ1zO1pu_mLJE%{zagf0oDgkekKz-^Uml0>KLt1wt&0xT3mi71V;vow zdZptkV&zM!Yck{%ZD9;0ygdNWaWjc%TU1bSE#3@jlP9Q;IYFra`<$TAzqYvtU}}1y zYA?hKm3(z3zG&91a;+L4y3QChh6aYVFR0e7Fk{-es(HxHRmxQ}(NfDT*yW046d*BM zn==#kY`tvGByKjXgLZ8`QL=M$`AVf$NL0$xB^$7A&K2elL#0-oi7!;G@=Vn%#>-XJ zHdC$S3UxDYo4M(QQmIn5Y(U1WLt!>whjO)O9s;X;#LU@Hoz5X>Ii}D;E@x32m!%?L z1I7-PGOujfO}6ClC1Rjj`E4W9AgaA)jm9LTE;9MNzAI_ zsGYVmfYvQ!dw9PLJ}z}VDM6bx+LKF$T%&7mKvMb8ld?}Al-KCvGPG9)^?fu>Pb?WSpliQ_q>Q{KyYzAGn@cv@ z`vW8co#1(btVrk7<@J{f{>CfS>F-`4Eu`U$uRvP!j%gtc^p-l42JOtYkOt~-Z=qKK zAl8C7g!{b96Ax$7MZ!4?=8O%`1eE7|QSEsE_!;4x$f^D8?8g=TzOhO?nBE}a$YC%3 zeZis2SHTm6tNdILE{L>3cqTelz{hgQNX6vh%zLNBgsc zzwE(Leh1-r4j^%V=Lr9m2S@pN!e8^?XrKH0mIp`q?~wc-JvhqWPxwCw$11K9Nq9Sz zjBlm-7AiT;8tLEa!}%F~JK!})yqkq`eC$-nHwpCCW+MlZ@&zX52&inl-AI|I6dDu74E0>zjA){zcFU;if z)6;cx5sbQ7$s0DlT3X*H?yJZs)aK^Q=Bugo2}0H^yYADccZ*}+aapdGYG71rwrSjY z`_zDC=L-kHz;rs7FBa=od8S1iUw{Odv$;||KW9RzZkp^!J$sxtABRz?6b+~?72TZ=Ix)%|{ zGsH{IH)?Rt0VaQL*6X_mncl}s9{{$I!?m;q)uRXidYop!uTdz%_dL_Pr04g?buNET zYwseW{ji@(CNk?1=5c-uX+Ive0PvDixa5~Tx{Chg^cm*pNBGBkfn2rFp!(hcFi&=H z{4me)kDvM&1OWb(^i@iV_}pjW__^Fk@%!~JrIh_@RwQCQE+1N@|H+k8epip_$BzEI zZ +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/12/05 13:19:35 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:06:52 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +void gnl_cleanup_fd(int fd) +{ + char *wtf; + + close(fd); + wtf = get_next_line(fd); + while (wtf) + { + free(wtf); + wtf = get_next_line(fd); + } +} diff --git a/libft/get_next_line/get_next_line_utils_two.o b/libft/get_next_line/get_next_line_utils_two.o new file mode 100644 index 0000000000000000000000000000000000000000..002903d29021100b45b49517d8385532427a1242 GIT binary patch literal 3232 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 12:38:59 by thrieg #+# #+# */ +/* Updated: 2025/02/16 19:05:53 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H + +# include +# include +# include + +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +size_t ft_strlen(const char *s); +void *ft_memset(void *s, int c, size_t n); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dest, const void *src, size_t n); +void *ft_memmove(void *dest, const void *src, size_t n); +size_t ft_strlcpy(char *dst, const char *src, size_t size); +size_t ft_strlcat(char *dst, const char *src, size_t size); +int ft_toupper(int c); +int ft_tolower(int c); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +int ft_strncmp(const char *s1, const char *s2, size_t n); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +char *ft_strnstr(const char *big, const char *little, size_t len); +//sets the flag_overflow flag if an overflow happened +//acts just like atoi otherwise (put NULL to ignore the flag) +int ft_atoi(const char *nptr, int *flag_overflow); +char *ft_strdup(const char *s); +void *ft_calloc(size_t nmemb, size_t size); +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s1, char const *set); + +char **ft_split(char const *s, char c); +void ft_free_split(char **strs); +size_t ft_split_size(char **strs); + +char *ft_itoa(int n); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +void ft_striteri(char *s, void (*f)(unsigned int, char*)); +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char *s, int fd); +void ft_putendl_fd(char *s, int fd); +void ft_putnbr_fd(int n, int fd); +char *ft_itoa_base(int nbr, char *base); +char *ft_addr_to_strhex(void *addr); +char *ft_utoa(unsigned int n); +char *ft_utoa_base(unsigned int nbr, char *base); +size_t ft_strnonchr(char *str, char c); +int ft_strcmp(const char *s1, const char *s2); + +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +t_list *ft_lstnew(void *content); +void ft_lstadd_front(t_list **lst, t_list *new); +int ft_lstsize(t_list *lst); +t_list *ft_lstlast(t_list *lst); +void ft_lstadd_back(t_list **lst, t_list *new); +void ft_lstdelone(t_list *lst, void (*del)(void *)); +void ft_lstclear(t_list **lst, void (*del)(void *)); +void ft_lstiter(t_list *lst, void (*f)(void *)); +t_list *ft_lstmap( + t_list *lst, + void *(*f)(void *), + void (*del)(void *)); + +int ft_isspace(char c); +int ft_toupper(int c); +int ft_tolower(int c); +int ft_atoie(const char *nptr); +long ft_atole(const char *nptr); +size_t i_drep_len(int n); +unsigned int ft_max_uint(size_t len, unsigned int a[len]); +t_list *ft_lstat(t_list *lst, size_t i); + +int safe_int_add(int a, int b); +int safe_int_sub(int a, int b); +int safe_int_mul(int a, int b); +ssize_t ft_power(ssize_t nb, ssize_t power); + +long safe_long_add(long a, long b); +long safe_long_sub(long a, long b); +long safe_long_mul(long a, long b); + +int ft_strhassuffix(const char *s, const char *suffix); +int ft_linecmp(const char *s1, const char *s2); +size_t ft_linelen(const char *line); + +#endif diff --git a/libft/sorting/ft_radixsort.c b/libft/sorting/ft_radixsort.c new file mode 100644 index 0000000..f9e33e7 --- /dev/null +++ b/libft/sorting/ft_radixsort.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_radixsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/18 14:18:55 by alier #+# #+# */ +/* Updated: 2025/02/16 19:06:42 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include "ft_sorting.h" + +static void ft_naive_countsort2(struct s_countsort cs) +{ + size_t i; + + i = cs.size - 1; + while (true) + { + cs.tmp[cs.count[(cs.a[i] / cs.exp) % 10] - 1] = cs.a[i]; + cs.count[(cs.a[i] / cs.exp) % 10]--; + if (i == 0) + break ; + i--; + } + ft_memcpy(cs.a, cs.tmp, cs.size * sizeof(*cs.a)); +} + +/* + * used by `ft_naive_radixsort` + */ +static void ft_naive_countsort(size_t size, unsigned int a[size], + unsigned int exp) +{ + unsigned int *tmp; + unsigned int count[10]; + size_t i; + + tmp = malloc(size * sizeof(unsigned int)); + ft_bzero(count, 10 * sizeof(unsigned int)); + i = 0; + while (i < size) + { + count[(a[i] / exp) % 10]++; + i++; + } + i = 1; + while (i < 10) + { + count[i] += count[i - 1]; + i++; + } + ft_naive_countsort2((struct s_countsort){size, a, exp, tmp, count}); + free(tmp); +} + +/* + * Worst-case performance: O(size * max_digits) + * Worst-case space complexity: O(size + max_digits) + */ +void ft_naive_radixsort(size_t size, unsigned int a[size]) +{ + unsigned int m; + unsigned int exp; + + m = ft_max_uint(size, a); + exp = 1; + while (m / exp > 0) + { + ft_naive_countsort(size, a, exp); + exp *= 10; + } +} diff --git a/libft/sorting/ft_radixsort.o b/libft/sorting/ft_radixsort.o new file mode 100644 index 0000000000000000000000000000000000000000..62c6e508cd333127a4ab436b2346b1dca08b684b GIT binary patch literal 6952 zcmb_gd2Afj8UNnQ&U)i@*2mhh9VcX~P7Xpd_BtkU$U)X@nssoZkk~oMv9Z^)_BQKX zvquO~Tc>fL9YPAJxumMvUg}8-B2qfbddzzMnI!-av;NHc;TMwC3!(rgJSW1JBUk?!v(9%{KmKy;++RP*E}yLb z%Jnaedycc%_&L_S>c!%3PegT(>d`H1qPowD>OM89S6NZLN{#9@R#dN1qk6p+)$7%$ z-eg7fCN-+hv!ePuHL8cKs2*ZbUGK5pc87=ld(M1dU7R6=6ZOZ(&re!C4}n#GJT`t| zviMTWdM#$X-DCY*Wc7F6ZeXu(JgI*>x_VIWsJ_QHIXU^pD*$j7tI}<~9yyDJ;rUWM zx~&Vm9zCKSA5((i_h-oO>U(yDf8(mKonFMMdYIDtRm^&=$9kXA>#?r#^w?V`)2Cr| z8k1W+IXM{{f39;+WN&0&WPc>S@8|qw13{7)RVz6D7 zZWch7XcY*Th+pM6+q+hZVyhQw09jv27{I?wJ#uD*Abg&gA z;?FqP$`bKEbFj`5@$?ok50R!re-Io^nOfL4;oCmp+dJWz@a&lI?VRw@5S1e!L?(Rp z_&MQ{rdSPd3p>!ler|zAD3IB<#Dvctc7hRfoiMmavGdi0=k1M{Q#9H;rFle1NegsS#$zWH5=4GcMvEeqz6$1*IUk{(7<=dz$%67{fI_? z!UyU%i_Ze7f%U0ZSYHF{Rj;sKs838CQ%*qx>s4x&K>eX9BeyAIeB=;XQ1WoC=4bzp z=I2Qh_?gnP7n5(qSKNq2f+l=;S{jRrfT7tIoW~LVIOU90JgflBb@sFsVg;ZLt-%$% zn`l8ZggmWIvuBX+8z^Q9#ZV&MpBV}rGIRMjibr}0b0$PW&BW7!1IF~YqTBBzEU?Dq-G9&%zbT-kNP7NdrkSxSA{i#D{JdrJC z3aAPB)DaWX+00O=n8~MxGUi|?m9gP?0s3JIY91a1t_tyZWZSmL?)diZ+c(5}cW>Pg zk3(T(6jIapXoo}|@-Ck|ti$mlI!YGe14qnUmV@R0D|@$nFst%(F^ml$KXgxrfCC1d{y%*F;^H3MMcEkSEBpTpv}rqhQ;mWA6n&);yX z{bpNJnMArcXgcrJFaRsyhD!ppkF|FFWMw_!s zYw?9NkM~y1zfn`XYqTow3a`3J*~qlzUbV>=(&l+LX^RS4r7xs?YK<0Nqv_sTwOMPm z3NN~8SLeN~Rj9ScwAwqo>QiIy+O7;uIjvQxl^5N%>TFxdk6H!F8vc zj(*LT#EZ$lQ{#vat0jd z-gI_!T+vAt?iggd=aXTcu-GyWI z2p@FeZu6kpzU2y>WRU8F0M-C;emDWKr3m>7A%iqm z@Fb60D$;eL#Wb9+698@yILQx){&ETD=LrByAtE&x$_X znMnRQfgh3NaW6&sf@n#e3_bwhNeSO57704H;V^!`^uOm- zAx}8{hqx-?bpE5eC&|;LJuDUl!s&dtMc_0~-VpH*O89#Mzf;0#UWUXt4hs=Z^h1RF zI)vvl`zU4%nghk5c>lma&O8K0&P?|k1@o}$Bh^JE-Qvl|0Jelhs zF(H{VO|TEWJYoSg!eX_2Xu1bmmvUnLHL)cASTV{B;#`YxW~&F z(mNudo25ai3;7xJ+eDy`x+m{6vY8q3|B@)wzeN0)KZYddkM{#PCZvn_0Rq4QyKzXC zy$dbh|bvhqf(h+ROr+C zMnv@^!e0T>6ybDK%zv6^SbsE0`h?@YBgcgFittZAG>K%{ug&29(P{kSUlZB?{rLU% lOlARqeg<)(@0W=G_n0Quze(#W(E;&`W~&Go8}u#v{~z~fAMOAE literal 0 HcmV?d00001 diff --git a/libft/sorting/ft_sorting.c b/libft/sorting/ft_sorting.c new file mode 100644 index 0000000..3773a9f --- /dev/null +++ b/libft/sorting/ft_sorting.c @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sorting.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: alier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/31 09:34:43 by alier #+# #+# */ +/* Updated: 2025/01/17 11:07:04 by alier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include +#include +#include "ft_sorting.h" + +static void ft_swap_bytes(void *a, void *b, size_t count) +{ + uint8_t *x; + uint8_t *y; + uint8_t t; + size_t i; + + x = (uint8_t *) a; + y = (uint8_t *) b; + i = 0; + while (i < count) + { + t = x[i]; + x[i] = y[i]; + y[i] = t; + i++; + } +} + +/* + * Worst-case performance: O(n^2) comparisons, O(n^2) swaps + * Worst-case space complexity: O(n) total, O(1) auxiliary + */ +void ft_naive_bubblesort(void *base, size_t nmemb, size_t size, + t_compar compar) +{ + bool swapped; + size_t i; + + if (nmemb == 0) + return ; + swapped = true; + while (swapped) + { + swapped = false; + i = 0; + while (i < nmemb * size - size) + { + if (compar(base + i, base + i + size) > 0) + { + ft_swap_bytes(base + i, base + i + size, size); + swapped = true; + } + i += size; + } + } +} + +static int compare_ints_asc(const void *a, const void *b) +{ + if (*(int *) a > *(int *)b) + return (1); + else + return (-1); +} + +int compare_strs_ptrs_asc(const void *a, const void *b) +{ + const char *left; + const char *right; + + left = *(const char **)a; + right = *(const char **)b; + return (ft_strcmp(left, right)); +} + +/* + * Worst-case performance: O(n^2) comparisons, O(n^2) swaps + * Worst-case space complexity: O(n) total, O(1) auxiliary + */ +void ft_naive_bubblesort_int_asc(int *base, size_t size) +{ + ft_naive_bubblesort(base, size, sizeof(int), compare_ints_asc); +} diff --git a/libft/sorting/ft_sorting.h b/libft/sorting/ft_sorting.h new file mode 100644 index 0000000..723167a --- /dev/null +++ b/libft/sorting/ft_sorting.h @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sorting.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: alier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/11/04 16:45:04 by alier #+# #+# */ +/* Updated: 2025/01/17 11:07:18 by alier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_SORTING_H +# define FT_SORTING_H +# include +# include "../libft.h" + +struct s_countsort +{ + size_t size; + unsigned int *a; + unsigned int exp; + unsigned int *tmp; + unsigned int *count; +}; + +typedef int (*t_compar)(const void *, const void *); + +int compare_strs_ptrs_asc(const void *a, const void *b); +void ft_naive_radixsort(size_t size, unsigned int a[size]); +void ft_naive_bubblesort_int_asc(int *base, size_t size); +void ft_naive_bubblesort(void *base, size_t nmemb, size_t size, + t_compar compar); + +#endif \ No newline at end of file diff --git a/libft/sorting/ft_sorting.o b/libft/sorting/ft_sorting.o new file mode 100644 index 0000000000000000000000000000000000000000..03c38115451e9efd3b2053e57806f544bcb1a08e GIT binary patch literal 7864 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 literal 0 HcmV?d00001 diff --git a/libft_malloc.so b/libft_malloc.so new file mode 120000 index 0000000..bc92c49 --- /dev/null +++ b/libft_malloc.so @@ -0,0 +1 @@ +libft_malloc_x86_64_Linux.so \ No newline at end of file diff --git a/libft_malloc_x86_64_Linux.so b/libft_malloc_x86_64_Linux.so new file mode 100755 index 0000000000000000000000000000000000000000..053a091e74cb225d7d6287892becc23e6d48db64 GIT binary patch literal 98320 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 M%^T|y)IHMw0T&WMP5=M^ literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..71834dd --- /dev/null +++ b/main.c @@ -0,0 +1,419 @@ +#include +#include +#include +#include +#include + +/* +** These match your allocator’s thresholds +** (only used here for shaping size distributions) +*/ +#define TINY_MAX 64 +#define SMALL_MAX 4096 + +#define ARRAY_SIZE 10000 // number of live slots we manage +#define RANDOM_ITERS 200000 // number of random operations +#define PATTERN_BASE 0xA5 +#define MAX_LARGE_SIZE (SMALL_MAX * 8) // up to 32k-ish + +typedef struct s_block +{ + void *ptr; + size_t size; + unsigned char pattern; + int is_calloc; +} t_block; + +static t_block g_blocks[ARRAY_SIZE]; + +/* Fill a block with a simple pattern byte */ +static void fill_pattern(void *ptr, size_t size, unsigned char pattern) +{ + if (!ptr || size == 0) + return; + memset(ptr, pattern, size); +} + +/* Check that a block still has the expected pattern */ +static int check_pattern(void *ptr, size_t size, unsigned char pattern) +{ + if (!ptr || size == 0) + return 1; + unsigned char *p = (unsigned char *)ptr; + for (size_t i = 0; i < size; ++i) + { + if (p[i] != pattern) + { + fprintf(stderr, + "[ERROR] Pattern mismatch at %p (offset %zu): " + "expected 0x%02X, got 0x%02X\n", + ptr, i, (unsigned)pattern, (unsigned)p[i]); + return 0; + } + } + return 1; +} + +/* Check that a calloc'd block is zeroed */ +static int check_zero(void *ptr, size_t size) +{ + if (!ptr || size == 0) + return 1; + unsigned char *p = (unsigned char *)ptr; + for (size_t i = 0; i < size; ++i) + { + if (p[i] != 0) + { + fprintf(stderr, + "[ERROR] Calloc block not zeroed at %p (offset %zu): got 0x%02X\n", + ptr, i, (unsigned)p[i]); + return 0; + } + } + return 1; +} + +/* Generate a pseudo-random size skewed across tiny/small/large */ +static size_t random_size(void) +{ + int r = rand() % 100; + + if (r < 40) + { + /* TINY range [1..TINY_MAX] */ + return (size_t)(1 + rand() % TINY_MAX); + } + else if (r < 85) + { + /* SMALL range [TINY_MAX+1 .. SMALL_MAX] */ + return (size_t)(TINY_MAX + 1 + rand() % (SMALL_MAX - TINY_MAX)); + } + else + { + /* LARGE range [SMALL_MAX+1 .. MAX_LARGE_SIZE] */ + return (size_t)(SMALL_MAX + 1 + rand() % (MAX_LARGE_SIZE - SMALL_MAX - 1)); + } +} + +/* Tear down all blocks cleanly (for the end of tests) */ +static void free_all_blocks(void) +{ + for (int i = 0; i < ARRAY_SIZE; ++i) + { + if (g_blocks[i].ptr) + { + free(g_blocks[i].ptr); + g_blocks[i].ptr = NULL; + g_blocks[i].size = 0; + } + } +} + +/* Simple deterministic sanity tests */ +static void basic_tests(void) +{ + printf("== basic_tests ==\n"); + + /* TINY */ + void *a = malloc(10); + void *b = malloc(TINY_MAX); + fill_pattern(a, 10, 0x11); + fill_pattern(b, TINY_MAX, 0x22); + check_pattern(a, 10, 0x11); + check_pattern(b, TINY_MAX, 0x22); + free(a); + free(b); + + /* SMALL */ + void *c = malloc(SMALL_MAX / 2); + fill_pattern(c, SMALL_MAX / 2, 0x33); + check_pattern(c, SMALL_MAX / 2, 0x33); + c = realloc(c, SMALL_MAX / 2 + 100); // grow within SMALL + check_pattern(c, SMALL_MAX / 2, 0x33); + free(c); + + /* LARGE */ + size_t large_sz = SMALL_MAX * 4; + void *d = malloc(large_sz); + fill_pattern(d, large_sz, 0x44); + check_pattern(d, large_sz, 0x44); + d = realloc(d, large_sz * 2); // grow LARGE + check_pattern(d, large_sz, 0x44); + d = realloc(d, large_sz / 2); // shrink LARGE + check_pattern(d, large_sz / 2, 0x44); + free(d); + + /* CALLOC */ + void *e = calloc(1000, 1); + check_zero(e, 1000); + memset(e, 0xAB, 1000); + e = realloc(e, 2000); + check_pattern(e, 1000, 0xAB); + free(e); + + printf("basic_tests: OK\n\n"); +} + +static void random_stress(void) +{ + printf("== random_stress ==\n"); + + for (int i = 0; i < ARRAY_SIZE; ++i) + { + g_blocks[i].ptr = NULL; + g_blocks[i].size = 0; + g_blocks[i].pattern = 0; + g_blocks[i].is_calloc = 0; + } + + for (int iter = 0; iter < RANDOM_ITERS; ++iter) + { + int idx = rand() % ARRAY_SIZE; + t_block *blk = &g_blocks[idx]; + int op = rand() % 4; /* 0 = alloc/new, 1 = free, 2 = realloc up, 3 = realloc down */ + + /* Invariant: for non-NULL blocks we always keep full [0..size) filled with pattern */ + if (blk->ptr && !blk->is_calloc) + { + if (!check_pattern(blk->ptr, blk->size, blk->pattern)) + { + fprintf(stderr, "[FATAL] pattern mismatch before op; idx=%d\n", idx); + abort(); + } + } + + if (op == 0) + { + /* allocate new if empty, otherwise grow via realloc */ + if (blk->ptr == NULL) + { + size_t sz = random_size(); + int use_calloc = (rand() % 4) == 0; /* 25% calloc */ + + if (use_calloc) + { + blk->ptr = calloc(sz, 1); + blk->is_calloc = 1; + blk->size = sz; + if (!blk->ptr) + { + fprintf(stderr, "[ERROR] calloc returned NULL\n"); + continue; + } + /* we only check zero once; then we switch to pattern mode */ + if (!check_zero(blk->ptr, blk->size)) + fprintf(stderr, "[ERROR] calloc block not zeroed (idx=%d)\n", idx); + blk->pattern = (unsigned char)((PATTERN_BASE + idx) & 0xFF); + fill_pattern(blk->ptr, blk->size, blk->pattern); + blk->is_calloc = 0; + } + else + { + blk->ptr = malloc(sz); + blk->is_calloc = 0; + blk->size = sz; + if (!blk->ptr) + { + fprintf(stderr, "[ERROR] malloc returned NULL\n"); + continue; + } + blk->pattern = (unsigned char)((PATTERN_BASE + idx) & 0xFF); + fill_pattern(blk->ptr, blk->size, blk->pattern); + } + } + else + { + /* grow via realloc */ + size_t old_size = blk->size; + size_t new_sz = old_size + 1 + (rand() % (old_size + 1)); + unsigned char pattern = blk->pattern; + + void *new_ptr = realloc(blk->ptr, new_sz); + if (!new_ptr) + { + fprintf(stderr, "[ERROR] realloc (grow) returned NULL\n"); + continue; /* keep old block as-is */ + } + blk->ptr = new_ptr; + blk->size = new_sz; + blk->pattern = pattern; + + /* Only the first old_size bytes must be preserved */ + if (!check_pattern(blk->ptr, old_size, pattern)) + { + fprintf(stderr, "[ERROR] pattern mismatch after realloc grow (idx=%d)\n", idx); + abort(); + } + /* Now enforce our invariant for the future */ + fill_pattern(blk->ptr, blk->size, blk->pattern); + } + } + else if (op == 1) + { + /* free */ + if (blk->ptr) + { + free(blk->ptr); + blk->ptr = NULL; + blk->size = 0; + blk->is_calloc = 0; + } + } + else if (op == 2) + { + /* explicit realloc up (if exists) */ + if (blk->ptr) + { + size_t old_size = blk->size; + size_t new_sz = old_size + 1 + (rand() % (old_size + 1)); + unsigned char pattern = blk->pattern; + + void *new_ptr = realloc(blk->ptr, new_sz); + if (!new_ptr) + { + fprintf(stderr, "[ERROR] realloc (grow2) returned NULL\n"); + continue; + } + + blk->ptr = new_ptr; + blk->size = new_sz; + blk->pattern = pattern; + + if (!check_pattern(blk->ptr, old_size, pattern)) + { + fprintf(stderr, "[ERROR] pattern mismatch after realloc grow2 (idx=%d)\n", idx); + abort(); + } + fill_pattern(blk->ptr, blk->size, blk->pattern); + } + } + else /* op == 3, realloc down */ + { + if (blk->ptr && blk->size > 1) + { + size_t old_size = blk->size; + size_t new_sz = 1 + (rand() % blk->size); + unsigned char pattern = blk->pattern; + + void *new_ptr = realloc(blk->ptr, new_sz); + if (!new_ptr) + { + fprintf(stderr, "[ERROR] realloc (shrink) returned NULL\n"); + continue; + } + + blk->ptr = new_ptr; + blk->size = new_sz; + blk->pattern = pattern; + + /* For shrink, we only expect the first new_sz bytes to still match */ + if (!check_pattern(blk->ptr, blk->size, blk->pattern)) + { + fprintf(stderr, "[ERROR] pattern mismatch after realloc shrink (idx=%d)\n", idx); + abort(); + } + /* Still keep invariant explicitly (optional here) */ + fill_pattern(blk->ptr, blk->size, blk->pattern); + } + } + + if ((iter % 50000) == 0 && iter != 0) + printf(" random_stress progress: %d / %d\n", iter, RANDOM_ITERS); + } + + free_all_blocks(); + printf("random_stress: DONE\n\n"); +} + +/* Fragmentation test: allocate many small then free some, then big allocs, etc. */ +static void fragmentation_test(void) +{ + printf("== fragmentation_test ==\n"); + + const int count = 10000; + void **arr = malloc(sizeof(void *) * count); + size_t *sizes = malloc(sizeof(size_t) * count); + if (!arr || !sizes) + { + fprintf(stderr, "[ERROR] fragmentation_test: malloc failed\n"); + free(arr); + free(sizes); + return; + } + + /* Step 1: allocate random small blocks */ + for (int i = 0; i < count; ++i) + { + size_t sz = 1 + (rand() % SMALL_MAX); + arr[i] = malloc(sz); + sizes[i] = sz; + if (!arr[i]) + { + fprintf(stderr, "[ERROR] fragmentation_test: malloc failed at i=%d\n", i); + continue; + } + memset(arr[i], 0x5A, sz); + } + + /* Step 2: free every other block */ + for (int i = 0; i < count; i += 2) + { + if (arr[i]) + { + free(arr[i]); + arr[i] = NULL; + sizes[i] = 0; + } + } + + /* Step 3: allocate a bunch of bigger blocks, try to reuse fragmentation */ + const int big_count = 1000; + void **big = malloc(sizeof(void *) * big_count); + size_t *big_sz = malloc(sizeof(size_t) * big_count); + if (!big || !big_sz) + { + fprintf(stderr, "[ERROR] fragmentation_test: big malloc failed\n"); + free(big); + free(big_sz); + free(arr); + free(sizes); + return; + } + + for (int i = 0; i < big_count; ++i) + { + size_t sz = SMALL_MAX + (rand() % (SMALL_MAX * 4)); + big[i] = malloc(sz); + big_sz[i] = sz; + if (!big[i]) + { + fprintf(stderr, "[ERROR] fragmentation_test: big malloc failed at i=%d\n", i); + continue; + } + memset(big[i], 0x6B, sz); + } + + /* cleanup */ + for (int i = 0; i < count; ++i) + free(arr[i]); + for (int i = 0; i < big_count; ++i) + free(big[i]); + free(arr); + free(sizes); + free(big); + free(big_sz); + + printf("fragmentation_test: DONE\n\n"); +} + +int main(void) +{ + srand((unsigned int)time(NULL)); + + basic_tests(); + random_stress(); + fragmentation_test(); + + printf("ALL TESTS DONE\n"); + return 0; +} diff --git a/main_bonus.c b/main_bonus.c new file mode 100644 index 0000000..9a9ac6e --- /dev/null +++ b/main_bonus.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/28 17:23:45 by thrieg #+# #+# */ +/* Updated: 2025/11/28 19:16:24 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "includes/ft_malloc_public.h" +#include +#include +#include + +int main(void) +{ + char *a = malloc(10); + char *b = malloc(100); + int *c = malloc(50 * sizeof(int)); + + for (int i = 0; i < 10; ++i) + a[i] = i; + for (int i = 0; i < 100; ++i) + b[i] = 0xAA; + for (int i = 0; i < 50; ++i) + c[i] = i * 2; + + write(1, "\n\n\n\n\nafter first alloc: \n\n\n\n\n", sizeof("\n\n\n\n\nafter first alloc: \n\n\n\n\n") - 1); + show_alloc_mem_ex(false); + + free(a); + free(b); + free(c); + + write(1, "\n\n\n\n\nafter free: \n\n\n\n\n", sizeof("\n\n\n\n\nafter free: \n\n\n\n\n") - 1); + show_alloc_mem_ex(false); + + a = malloc(20); + b = malloc(1000); + c = malloc(500 * sizeof(int)); + + for (int i = 0; i < 20; ++i) + a[i] = i; + for (int i = 0; i < 1000; ++i) + b[i] = 0xAA; + for (int i = 0; i < 500; ++i) + c[i] = i * 2; + + write(1, "\n\n\n\n\nafter allocating again: \n\n\n\n\n", sizeof("\n\n\n\n\nafter allocating again: \n\n\n\n\n") - 1); + show_alloc_mem_ex(false); + + a = realloc(a, 420); + + write(1, "\n\n\n\n\nafter realloc a: \n\n\n\n\n", sizeof("\n\n\n\n\nafter realloc a: \n\n\n\n\n") - 1); + show_alloc_mem_ex(false); + + free(a); + free(b); + free(c); + show_alloc_mem_ex(false); + return (0); +} + +// cc -g main_bonus.c -L. -lft_malloc -o test_show +// export LD_LIBRARY_PATH="$PWD" diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..c62a856 --- /dev/null +++ b/result.txt @@ -0,0 +1,582 @@ + + + + + +after first alloc: + + + + +-------------------------------- +new tiny zone: +size: 12288 +-------------------------------- +-------------------------------- +new allocated header: +size: 16 +-------------------------------- +0x744b0ba71040: 00 01 02 03 04 05 06 07 08 09 00 00 00 00 00 00 +-------------------------------- +new free header: +size: 12176 +-------------------------------- +-------------------------------- +new small zone: +size: 413696 +-------------------------------- +-------------------------------- +new allocated header: +size: 112 +-------------------------------- +0x744b0b79b040: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b050: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b060: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b070: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b080: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b090: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0a0: aa aa aa aa 00 00 00 00 00 00 00 00 00 00 00 00 +-------------------------------- +new allocated header: +size: 208 +-------------------------------- +0x744b0b79b0d0: 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 +0x744b0b79b0e0: 08 00 00 00 0a 00 00 00 0c 00 00 00 0e 00 00 00 +0x744b0b79b0f0: 10 00 00 00 12 00 00 00 14 00 00 00 16 00 00 00 +0x744b0b79b100: 18 00 00 00 1a 00 00 00 1c 00 00 00 1e 00 00 00 +0x744b0b79b110: 20 00 00 00 22 00 00 00 24 00 00 00 26 00 00 00 +0x744b0b79b120: 28 00 00 00 2a 00 00 00 2c 00 00 00 2e 00 00 00 +0x744b0b79b130: 30 00 00 00 32 00 00 00 34 00 00 00 36 00 00 00 +0x744b0b79b140: 38 00 00 00 3a 00 00 00 3c 00 00 00 3e 00 00 00 +0x744b0b79b150: 40 00 00 00 42 00 00 00 44 00 00 00 46 00 00 00 +0x744b0b79b160: 48 00 00 00 4a 00 00 00 4c 00 00 00 4e 00 00 00 +0x744b0b79b170: 50 00 00 00 52 00 00 00 54 00 00 00 56 00 00 00 +0x744b0b79b180: 58 00 00 00 5a 00 00 00 5c 00 00 00 5e 00 00 00 +0x744b0b79b190: 60 00 00 00 62 00 00 00 00 00 00 00 00 00 00 00 +-------------------------------- +new free header: +size: 413248 +-------------------------------- + + + + + +after free: + + + + +-------------------------------- +new tiny zone: +size: 12288 +-------------------------------- +-------------------------------- +new free header: +size: 12224 +-------------------------------- +-------------------------------- +new small zone: +size: 413696 +-------------------------------- +-------------------------------- +new free header: +size: 413632 +-------------------------------- + + + + + +after allocating again: + + + + +-------------------------------- +new tiny zone: +size: 12288 +-------------------------------- +-------------------------------- +new allocated header: +size: 32 +-------------------------------- +0x744b0ba71040: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +0x744b0ba71050: 10 11 12 13 00 00 00 00 00 00 00 00 00 00 00 00 +-------------------------------- +new free header: +size: 12160 +-------------------------------- +-------------------------------- +new small zone: +size: 413696 +-------------------------------- +-------------------------------- +new allocated header: +size: 1008 +-------------------------------- +0x744b0b79b040: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b050: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b060: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b070: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b080: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b090: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b100: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b110: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b120: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b130: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b140: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b150: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b160: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b170: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b180: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b190: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b200: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b210: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b220: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b230: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b240: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b250: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b260: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b270: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b280: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b290: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b300: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b310: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b320: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b330: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b340: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b350: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b360: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b370: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b380: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b390: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b400: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b410: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b420: aa aa aa aa aa aa aa aa 00 00 00 00 00 00 00 00 +-------------------------------- +new allocated header: +size: 2000 +-------------------------------- +0x744b0b79b450: 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 +0x744b0b79b460: 08 00 00 00 0a 00 00 00 0c 00 00 00 0e 00 00 00 +0x744b0b79b470: 10 00 00 00 12 00 00 00 14 00 00 00 16 00 00 00 +0x744b0b79b480: 18 00 00 00 1a 00 00 00 1c 00 00 00 1e 00 00 00 +0x744b0b79b490: 20 00 00 00 22 00 00 00 24 00 00 00 26 00 00 00 +0x744b0b79b4a0: 28 00 00 00 2a 00 00 00 2c 00 00 00 2e 00 00 00 +0x744b0b79b4b0: 30 00 00 00 32 00 00 00 34 00 00 00 36 00 00 00 +0x744b0b79b4c0: 38 00 00 00 3a 00 00 00 3c 00 00 00 3e 00 00 00 +0x744b0b79b4d0: 40 00 00 00 42 00 00 00 44 00 00 00 46 00 00 00 +0x744b0b79b4e0: 48 00 00 00 4a 00 00 00 4c 00 00 00 4e 00 00 00 +0x744b0b79b4f0: 50 00 00 00 52 00 00 00 54 00 00 00 56 00 00 00 +0x744b0b79b500: 58 00 00 00 5a 00 00 00 5c 00 00 00 5e 00 00 00 +0x744b0b79b510: 60 00 00 00 62 00 00 00 64 00 00 00 66 00 00 00 +0x744b0b79b520: 68 00 00 00 6a 00 00 00 6c 00 00 00 6e 00 00 00 +0x744b0b79b530: 70 00 00 00 72 00 00 00 74 00 00 00 76 00 00 00 +0x744b0b79b540: 78 00 00 00 7a 00 00 00 7c 00 00 00 7e 00 00 00 +0x744b0b79b550: 80 00 00 00 82 00 00 00 84 00 00 00 86 00 00 00 +0x744b0b79b560: 88 00 00 00 8a 00 00 00 8c 00 00 00 8e 00 00 00 +0x744b0b79b570: 90 00 00 00 92 00 00 00 94 00 00 00 96 00 00 00 +0x744b0b79b580: 98 00 00 00 9a 00 00 00 9c 00 00 00 9e 00 00 00 +0x744b0b79b590: a0 00 00 00 a2 00 00 00 a4 00 00 00 a6 00 00 00 +0x744b0b79b5a0: a8 00 00 00 aa 00 00 00 ac 00 00 00 ae 00 00 00 +0x744b0b79b5b0: b0 00 00 00 b2 00 00 00 b4 00 00 00 b6 00 00 00 +0x744b0b79b5c0: b8 00 00 00 ba 00 00 00 bc 00 00 00 be 00 00 00 +0x744b0b79b5d0: c0 00 00 00 c2 00 00 00 c4 00 00 00 c6 00 00 00 +0x744b0b79b5e0: c8 00 00 00 ca 00 00 00 cc 00 00 00 ce 00 00 00 +0x744b0b79b5f0: d0 00 00 00 d2 00 00 00 d4 00 00 00 d6 00 00 00 +0x744b0b79b600: d8 00 00 00 da 00 00 00 dc 00 00 00 de 00 00 00 +0x744b0b79b610: e0 00 00 00 e2 00 00 00 e4 00 00 00 e6 00 00 00 +0x744b0b79b620: e8 00 00 00 ea 00 00 00 ec 00 00 00 ee 00 00 00 +0x744b0b79b630: f0 00 00 00 f2 00 00 00 f4 00 00 00 f6 00 00 00 +0x744b0b79b640: f8 00 00 00 fa 00 00 00 fc 00 00 00 fe 00 00 00 +0x744b0b79b650: 00 01 00 00 02 01 00 00 04 01 00 00 06 01 00 00 +0x744b0b79b660: 08 01 00 00 0a 01 00 00 0c 01 00 00 0e 01 00 00 +0x744b0b79b670: 10 01 00 00 12 01 00 00 14 01 00 00 16 01 00 00 +0x744b0b79b680: 18 01 00 00 1a 01 00 00 1c 01 00 00 1e 01 00 00 +0x744b0b79b690: 20 01 00 00 22 01 00 00 24 01 00 00 26 01 00 00 +0x744b0b79b6a0: 28 01 00 00 2a 01 00 00 2c 01 00 00 2e 01 00 00 +0x744b0b79b6b0: 30 01 00 00 32 01 00 00 34 01 00 00 36 01 00 00 +0x744b0b79b6c0: 38 01 00 00 3a 01 00 00 3c 01 00 00 3e 01 00 00 +0x744b0b79b6d0: 40 01 00 00 42 01 00 00 44 01 00 00 46 01 00 00 +0x744b0b79b6e0: 48 01 00 00 4a 01 00 00 4c 01 00 00 4e 01 00 00 +0x744b0b79b6f0: 50 01 00 00 52 01 00 00 54 01 00 00 56 01 00 00 +0x744b0b79b700: 58 01 00 00 5a 01 00 00 5c 01 00 00 5e 01 00 00 +0x744b0b79b710: 60 01 00 00 62 01 00 00 64 01 00 00 66 01 00 00 +0x744b0b79b720: 68 01 00 00 6a 01 00 00 6c 01 00 00 6e 01 00 00 +0x744b0b79b730: 70 01 00 00 72 01 00 00 74 01 00 00 76 01 00 00 +0x744b0b79b740: 78 01 00 00 7a 01 00 00 7c 01 00 00 7e 01 00 00 +0x744b0b79b750: 80 01 00 00 82 01 00 00 84 01 00 00 86 01 00 00 +0x744b0b79b760: 88 01 00 00 8a 01 00 00 8c 01 00 00 8e 01 00 00 +0x744b0b79b770: 90 01 00 00 92 01 00 00 94 01 00 00 96 01 00 00 +0x744b0b79b780: 98 01 00 00 9a 01 00 00 9c 01 00 00 9e 01 00 00 +0x744b0b79b790: a0 01 00 00 a2 01 00 00 a4 01 00 00 a6 01 00 00 +0x744b0b79b7a0: a8 01 00 00 aa 01 00 00 ac 01 00 00 ae 01 00 00 +0x744b0b79b7b0: b0 01 00 00 b2 01 00 00 b4 01 00 00 b6 01 00 00 +0x744b0b79b7c0: b8 01 00 00 ba 01 00 00 bc 01 00 00 be 01 00 00 +0x744b0b79b7d0: c0 01 00 00 c2 01 00 00 c4 01 00 00 c6 01 00 00 +0x744b0b79b7e0: c8 01 00 00 ca 01 00 00 cc 01 00 00 ce 01 00 00 +0x744b0b79b7f0: d0 01 00 00 d2 01 00 00 d4 01 00 00 d6 01 00 00 +0x744b0b79b800: d8 01 00 00 da 01 00 00 dc 01 00 00 de 01 00 00 +0x744b0b79b810: e0 01 00 00 e2 01 00 00 e4 01 00 00 e6 01 00 00 +0x744b0b79b820: e8 01 00 00 ea 01 00 00 ec 01 00 00 ee 01 00 00 +0x744b0b79b830: f0 01 00 00 f2 01 00 00 f4 01 00 00 f6 01 00 00 +0x744b0b79b840: f8 01 00 00 fa 01 00 00 fc 01 00 00 fe 01 00 00 +0x744b0b79b850: 00 02 00 00 02 02 00 00 04 02 00 00 06 02 00 00 +0x744b0b79b860: 08 02 00 00 0a 02 00 00 0c 02 00 00 0e 02 00 00 +0x744b0b79b870: 10 02 00 00 12 02 00 00 14 02 00 00 16 02 00 00 +0x744b0b79b880: 18 02 00 00 1a 02 00 00 1c 02 00 00 1e 02 00 00 +0x744b0b79b890: 20 02 00 00 22 02 00 00 24 02 00 00 26 02 00 00 +0x744b0b79b8a0: 28 02 00 00 2a 02 00 00 2c 02 00 00 2e 02 00 00 +0x744b0b79b8b0: 30 02 00 00 32 02 00 00 34 02 00 00 36 02 00 00 +0x744b0b79b8c0: 38 02 00 00 3a 02 00 00 3c 02 00 00 3e 02 00 00 +0x744b0b79b8d0: 40 02 00 00 42 02 00 00 44 02 00 00 46 02 00 00 +0x744b0b79b8e0: 48 02 00 00 4a 02 00 00 4c 02 00 00 4e 02 00 00 +0x744b0b79b8f0: 50 02 00 00 52 02 00 00 54 02 00 00 56 02 00 00 +0x744b0b79b900: 58 02 00 00 5a 02 00 00 5c 02 00 00 5e 02 00 00 +0x744b0b79b910: 60 02 00 00 62 02 00 00 64 02 00 00 66 02 00 00 +0x744b0b79b920: 68 02 00 00 6a 02 00 00 6c 02 00 00 6e 02 00 00 +0x744b0b79b930: 70 02 00 00 72 02 00 00 74 02 00 00 76 02 00 00 +0x744b0b79b940: 78 02 00 00 7a 02 00 00 7c 02 00 00 7e 02 00 00 +0x744b0b79b950: 80 02 00 00 82 02 00 00 84 02 00 00 86 02 00 00 +0x744b0b79b960: 88 02 00 00 8a 02 00 00 8c 02 00 00 8e 02 00 00 +0x744b0b79b970: 90 02 00 00 92 02 00 00 94 02 00 00 96 02 00 00 +0x744b0b79b980: 98 02 00 00 9a 02 00 00 9c 02 00 00 9e 02 00 00 +0x744b0b79b990: a0 02 00 00 a2 02 00 00 a4 02 00 00 a6 02 00 00 +0x744b0b79b9a0: a8 02 00 00 aa 02 00 00 ac 02 00 00 ae 02 00 00 +0x744b0b79b9b0: b0 02 00 00 b2 02 00 00 b4 02 00 00 b6 02 00 00 +0x744b0b79b9c0: b8 02 00 00 ba 02 00 00 bc 02 00 00 be 02 00 00 +0x744b0b79b9d0: c0 02 00 00 c2 02 00 00 c4 02 00 00 c6 02 00 00 +0x744b0b79b9e0: c8 02 00 00 ca 02 00 00 cc 02 00 00 ce 02 00 00 +0x744b0b79b9f0: d0 02 00 00 d2 02 00 00 d4 02 00 00 d6 02 00 00 +0x744b0b79ba00: d8 02 00 00 da 02 00 00 dc 02 00 00 de 02 00 00 +0x744b0b79ba10: e0 02 00 00 e2 02 00 00 e4 02 00 00 e6 02 00 00 +0x744b0b79ba20: e8 02 00 00 ea 02 00 00 ec 02 00 00 ee 02 00 00 +0x744b0b79ba30: f0 02 00 00 f2 02 00 00 f4 02 00 00 f6 02 00 00 +0x744b0b79ba40: f8 02 00 00 fa 02 00 00 fc 02 00 00 fe 02 00 00 +0x744b0b79ba50: 00 03 00 00 02 03 00 00 04 03 00 00 06 03 00 00 +0x744b0b79ba60: 08 03 00 00 0a 03 00 00 0c 03 00 00 0e 03 00 00 +0x744b0b79ba70: 10 03 00 00 12 03 00 00 14 03 00 00 16 03 00 00 +0x744b0b79ba80: 18 03 00 00 1a 03 00 00 1c 03 00 00 1e 03 00 00 +0x744b0b79ba90: 20 03 00 00 22 03 00 00 24 03 00 00 26 03 00 00 +0x744b0b79baa0: 28 03 00 00 2a 03 00 00 2c 03 00 00 2e 03 00 00 +0x744b0b79bab0: 30 03 00 00 32 03 00 00 34 03 00 00 36 03 00 00 +0x744b0b79bac0: 38 03 00 00 3a 03 00 00 3c 03 00 00 3e 03 00 00 +0x744b0b79bad0: 40 03 00 00 42 03 00 00 44 03 00 00 46 03 00 00 +0x744b0b79bae0: 48 03 00 00 4a 03 00 00 4c 03 00 00 4e 03 00 00 +0x744b0b79baf0: 50 03 00 00 52 03 00 00 54 03 00 00 56 03 00 00 +0x744b0b79bb00: 58 03 00 00 5a 03 00 00 5c 03 00 00 5e 03 00 00 +0x744b0b79bb10: 60 03 00 00 62 03 00 00 64 03 00 00 66 03 00 00 +0x744b0b79bb20: 68 03 00 00 6a 03 00 00 6c 03 00 00 6e 03 00 00 +0x744b0b79bb30: 70 03 00 00 72 03 00 00 74 03 00 00 76 03 00 00 +0x744b0b79bb40: 78 03 00 00 7a 03 00 00 7c 03 00 00 7e 03 00 00 +0x744b0b79bb50: 80 03 00 00 82 03 00 00 84 03 00 00 86 03 00 00 +0x744b0b79bb60: 88 03 00 00 8a 03 00 00 8c 03 00 00 8e 03 00 00 +0x744b0b79bb70: 90 03 00 00 92 03 00 00 94 03 00 00 96 03 00 00 +0x744b0b79bb80: 98 03 00 00 9a 03 00 00 9c 03 00 00 9e 03 00 00 +0x744b0b79bb90: a0 03 00 00 a2 03 00 00 a4 03 00 00 a6 03 00 00 +0x744b0b79bba0: a8 03 00 00 aa 03 00 00 ac 03 00 00 ae 03 00 00 +0x744b0b79bbb0: b0 03 00 00 b2 03 00 00 b4 03 00 00 b6 03 00 00 +0x744b0b79bbc0: b8 03 00 00 ba 03 00 00 bc 03 00 00 be 03 00 00 +0x744b0b79bbd0: c0 03 00 00 c2 03 00 00 c4 03 00 00 c6 03 00 00 +0x744b0b79bbe0: c8 03 00 00 ca 03 00 00 cc 03 00 00 ce 03 00 00 +0x744b0b79bbf0: d0 03 00 00 d2 03 00 00 d4 03 00 00 d6 03 00 00 +0x744b0b79bc00: d8 03 00 00 da 03 00 00 dc 03 00 00 de 03 00 00 +0x744b0b79bc10: e0 03 00 00 e2 03 00 00 e4 03 00 00 e6 03 00 00 +-------------------------------- +new free header: +size: 410560 +-------------------------------- + + + + + +after realloc a: + + + + +-------------------------------- +new tiny zone: +size: 12288 +-------------------------------- +-------------------------------- +new free header: +size: 12224 +-------------------------------- +-------------------------------- +new small zone: +size: 413696 +-------------------------------- +-------------------------------- +new allocated header: +size: 1008 +-------------------------------- +0x744b0b79b040: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b050: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b060: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b070: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b080: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b090: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b0f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b100: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b110: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b120: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b130: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b140: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b150: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b160: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b170: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b180: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b190: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b1f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b200: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b210: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b220: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b230: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b240: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b250: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b260: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b270: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b280: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b290: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b2f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b300: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b310: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b320: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b330: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b340: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b350: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b360: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b370: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b380: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b390: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3a0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3b0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3c0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3d0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3e0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b3f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b400: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b410: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa +0x744b0b79b420: aa aa aa aa aa aa aa aa 00 00 00 00 00 00 00 00 +-------------------------------- +new allocated header: +size: 2000 +-------------------------------- +0x744b0b79b450: 00 00 00 00 02 00 00 00 04 00 00 00 06 00 00 00 +0x744b0b79b460: 08 00 00 00 0a 00 00 00 0c 00 00 00 0e 00 00 00 +0x744b0b79b470: 10 00 00 00 12 00 00 00 14 00 00 00 16 00 00 00 +0x744b0b79b480: 18 00 00 00 1a 00 00 00 1c 00 00 00 1e 00 00 00 +0x744b0b79b490: 20 00 00 00 22 00 00 00 24 00 00 00 26 00 00 00 +0x744b0b79b4a0: 28 00 00 00 2a 00 00 00 2c 00 00 00 2e 00 00 00 +0x744b0b79b4b0: 30 00 00 00 32 00 00 00 34 00 00 00 36 00 00 00 +0x744b0b79b4c0: 38 00 00 00 3a 00 00 00 3c 00 00 00 3e 00 00 00 +0x744b0b79b4d0: 40 00 00 00 42 00 00 00 44 00 00 00 46 00 00 00 +0x744b0b79b4e0: 48 00 00 00 4a 00 00 00 4c 00 00 00 4e 00 00 00 +0x744b0b79b4f0: 50 00 00 00 52 00 00 00 54 00 00 00 56 00 00 00 +0x744b0b79b500: 58 00 00 00 5a 00 00 00 5c 00 00 00 5e 00 00 00 +0x744b0b79b510: 60 00 00 00 62 00 00 00 64 00 00 00 66 00 00 00 +0x744b0b79b520: 68 00 00 00 6a 00 00 00 6c 00 00 00 6e 00 00 00 +0x744b0b79b530: 70 00 00 00 72 00 00 00 74 00 00 00 76 00 00 00 +0x744b0b79b540: 78 00 00 00 7a 00 00 00 7c 00 00 00 7e 00 00 00 +0x744b0b79b550: 80 00 00 00 82 00 00 00 84 00 00 00 86 00 00 00 +0x744b0b79b560: 88 00 00 00 8a 00 00 00 8c 00 00 00 8e 00 00 00 +0x744b0b79b570: 90 00 00 00 92 00 00 00 94 00 00 00 96 00 00 00 +0x744b0b79b580: 98 00 00 00 9a 00 00 00 9c 00 00 00 9e 00 00 00 +0x744b0b79b590: a0 00 00 00 a2 00 00 00 a4 00 00 00 a6 00 00 00 +0x744b0b79b5a0: a8 00 00 00 aa 00 00 00 ac 00 00 00 ae 00 00 00 +0x744b0b79b5b0: b0 00 00 00 b2 00 00 00 b4 00 00 00 b6 00 00 00 +0x744b0b79b5c0: b8 00 00 00 ba 00 00 00 bc 00 00 00 be 00 00 00 +0x744b0b79b5d0: c0 00 00 00 c2 00 00 00 c4 00 00 00 c6 00 00 00 +0x744b0b79b5e0: c8 00 00 00 ca 00 00 00 cc 00 00 00 ce 00 00 00 +0x744b0b79b5f0: d0 00 00 00 d2 00 00 00 d4 00 00 00 d6 00 00 00 +0x744b0b79b600: d8 00 00 00 da 00 00 00 dc 00 00 00 de 00 00 00 +0x744b0b79b610: e0 00 00 00 e2 00 00 00 e4 00 00 00 e6 00 00 00 +0x744b0b79b620: e8 00 00 00 ea 00 00 00 ec 00 00 00 ee 00 00 00 +0x744b0b79b630: f0 00 00 00 f2 00 00 00 f4 00 00 00 f6 00 00 00 +0x744b0b79b640: f8 00 00 00 fa 00 00 00 fc 00 00 00 fe 00 00 00 +0x744b0b79b650: 00 01 00 00 02 01 00 00 04 01 00 00 06 01 00 00 +0x744b0b79b660: 08 01 00 00 0a 01 00 00 0c 01 00 00 0e 01 00 00 +0x744b0b79b670: 10 01 00 00 12 01 00 00 14 01 00 00 16 01 00 00 +0x744b0b79b680: 18 01 00 00 1a 01 00 00 1c 01 00 00 1e 01 00 00 +0x744b0b79b690: 20 01 00 00 22 01 00 00 24 01 00 00 26 01 00 00 +0x744b0b79b6a0: 28 01 00 00 2a 01 00 00 2c 01 00 00 2e 01 00 00 +0x744b0b79b6b0: 30 01 00 00 32 01 00 00 34 01 00 00 36 01 00 00 +0x744b0b79b6c0: 38 01 00 00 3a 01 00 00 3c 01 00 00 3e 01 00 00 +0x744b0b79b6d0: 40 01 00 00 42 01 00 00 44 01 00 00 46 01 00 00 +0x744b0b79b6e0: 48 01 00 00 4a 01 00 00 4c 01 00 00 4e 01 00 00 +0x744b0b79b6f0: 50 01 00 00 52 01 00 00 54 01 00 00 56 01 00 00 +0x744b0b79b700: 58 01 00 00 5a 01 00 00 5c 01 00 00 5e 01 00 00 +0x744b0b79b710: 60 01 00 00 62 01 00 00 64 01 00 00 66 01 00 00 +0x744b0b79b720: 68 01 00 00 6a 01 00 00 6c 01 00 00 6e 01 00 00 +0x744b0b79b730: 70 01 00 00 72 01 00 00 74 01 00 00 76 01 00 00 +0x744b0b79b740: 78 01 00 00 7a 01 00 00 7c 01 00 00 7e 01 00 00 +0x744b0b79b750: 80 01 00 00 82 01 00 00 84 01 00 00 86 01 00 00 +0x744b0b79b760: 88 01 00 00 8a 01 00 00 8c 01 00 00 8e 01 00 00 +0x744b0b79b770: 90 01 00 00 92 01 00 00 94 01 00 00 96 01 00 00 +0x744b0b79b780: 98 01 00 00 9a 01 00 00 9c 01 00 00 9e 01 00 00 +0x744b0b79b790: a0 01 00 00 a2 01 00 00 a4 01 00 00 a6 01 00 00 +0x744b0b79b7a0: a8 01 00 00 aa 01 00 00 ac 01 00 00 ae 01 00 00 +0x744b0b79b7b0: b0 01 00 00 b2 01 00 00 b4 01 00 00 b6 01 00 00 +0x744b0b79b7c0: b8 01 00 00 ba 01 00 00 bc 01 00 00 be 01 00 00 +0x744b0b79b7d0: c0 01 00 00 c2 01 00 00 c4 01 00 00 c6 01 00 00 +0x744b0b79b7e0: c8 01 00 00 ca 01 00 00 cc 01 00 00 ce 01 00 00 +0x744b0b79b7f0: d0 01 00 00 d2 01 00 00 d4 01 00 00 d6 01 00 00 +0x744b0b79b800: d8 01 00 00 da 01 00 00 dc 01 00 00 de 01 00 00 +0x744b0b79b810: e0 01 00 00 e2 01 00 00 e4 01 00 00 e6 01 00 00 +0x744b0b79b820: e8 01 00 00 ea 01 00 00 ec 01 00 00 ee 01 00 00 +0x744b0b79b830: f0 01 00 00 f2 01 00 00 f4 01 00 00 f6 01 00 00 +0x744b0b79b840: f8 01 00 00 fa 01 00 00 fc 01 00 00 fe 01 00 00 +0x744b0b79b850: 00 02 00 00 02 02 00 00 04 02 00 00 06 02 00 00 +0x744b0b79b860: 08 02 00 00 0a 02 00 00 0c 02 00 00 0e 02 00 00 +0x744b0b79b870: 10 02 00 00 12 02 00 00 14 02 00 00 16 02 00 00 +0x744b0b79b880: 18 02 00 00 1a 02 00 00 1c 02 00 00 1e 02 00 00 +0x744b0b79b890: 20 02 00 00 22 02 00 00 24 02 00 00 26 02 00 00 +0x744b0b79b8a0: 28 02 00 00 2a 02 00 00 2c 02 00 00 2e 02 00 00 +0x744b0b79b8b0: 30 02 00 00 32 02 00 00 34 02 00 00 36 02 00 00 +0x744b0b79b8c0: 38 02 00 00 3a 02 00 00 3c 02 00 00 3e 02 00 00 +0x744b0b79b8d0: 40 02 00 00 42 02 00 00 44 02 00 00 46 02 00 00 +0x744b0b79b8e0: 48 02 00 00 4a 02 00 00 4c 02 00 00 4e 02 00 00 +0x744b0b79b8f0: 50 02 00 00 52 02 00 00 54 02 00 00 56 02 00 00 +0x744b0b79b900: 58 02 00 00 5a 02 00 00 5c 02 00 00 5e 02 00 00 +0x744b0b79b910: 60 02 00 00 62 02 00 00 64 02 00 00 66 02 00 00 +0x744b0b79b920: 68 02 00 00 6a 02 00 00 6c 02 00 00 6e 02 00 00 +0x744b0b79b930: 70 02 00 00 72 02 00 00 74 02 00 00 76 02 00 00 +0x744b0b79b940: 78 02 00 00 7a 02 00 00 7c 02 00 00 7e 02 00 00 +0x744b0b79b950: 80 02 00 00 82 02 00 00 84 02 00 00 86 02 00 00 +0x744b0b79b960: 88 02 00 00 8a 02 00 00 8c 02 00 00 8e 02 00 00 +0x744b0b79b970: 90 02 00 00 92 02 00 00 94 02 00 00 96 02 00 00 +0x744b0b79b980: 98 02 00 00 9a 02 00 00 9c 02 00 00 9e 02 00 00 +0x744b0b79b990: a0 02 00 00 a2 02 00 00 a4 02 00 00 a6 02 00 00 +0x744b0b79b9a0: a8 02 00 00 aa 02 00 00 ac 02 00 00 ae 02 00 00 +0x744b0b79b9b0: b0 02 00 00 b2 02 00 00 b4 02 00 00 b6 02 00 00 +0x744b0b79b9c0: b8 02 00 00 ba 02 00 00 bc 02 00 00 be 02 00 00 +0x744b0b79b9d0: c0 02 00 00 c2 02 00 00 c4 02 00 00 c6 02 00 00 +0x744b0b79b9e0: c8 02 00 00 ca 02 00 00 cc 02 00 00 ce 02 00 00 +0x744b0b79b9f0: d0 02 00 00 d2 02 00 00 d4 02 00 00 d6 02 00 00 +0x744b0b79ba00: d8 02 00 00 da 02 00 00 dc 02 00 00 de 02 00 00 +0x744b0b79ba10: e0 02 00 00 e2 02 00 00 e4 02 00 00 e6 02 00 00 +0x744b0b79ba20: e8 02 00 00 ea 02 00 00 ec 02 00 00 ee 02 00 00 +0x744b0b79ba30: f0 02 00 00 f2 02 00 00 f4 02 00 00 f6 02 00 00 +0x744b0b79ba40: f8 02 00 00 fa 02 00 00 fc 02 00 00 fe 02 00 00 +0x744b0b79ba50: 00 03 00 00 02 03 00 00 04 03 00 00 06 03 00 00 +0x744b0b79ba60: 08 03 00 00 0a 03 00 00 0c 03 00 00 0e 03 00 00 +0x744b0b79ba70: 10 03 00 00 12 03 00 00 14 03 00 00 16 03 00 00 +0x744b0b79ba80: 18 03 00 00 1a 03 00 00 1c 03 00 00 1e 03 00 00 +0x744b0b79ba90: 20 03 00 00 22 03 00 00 24 03 00 00 26 03 00 00 +0x744b0b79baa0: 28 03 00 00 2a 03 00 00 2c 03 00 00 2e 03 00 00 +0x744b0b79bab0: 30 03 00 00 32 03 00 00 34 03 00 00 36 03 00 00 +0x744b0b79bac0: 38 03 00 00 3a 03 00 00 3c 03 00 00 3e 03 00 00 +0x744b0b79bad0: 40 03 00 00 42 03 00 00 44 03 00 00 46 03 00 00 +0x744b0b79bae0: 48 03 00 00 4a 03 00 00 4c 03 00 00 4e 03 00 00 +0x744b0b79baf0: 50 03 00 00 52 03 00 00 54 03 00 00 56 03 00 00 +0x744b0b79bb00: 58 03 00 00 5a 03 00 00 5c 03 00 00 5e 03 00 00 +0x744b0b79bb10: 60 03 00 00 62 03 00 00 64 03 00 00 66 03 00 00 +0x744b0b79bb20: 68 03 00 00 6a 03 00 00 6c 03 00 00 6e 03 00 00 +0x744b0b79bb30: 70 03 00 00 72 03 00 00 74 03 00 00 76 03 00 00 +0x744b0b79bb40: 78 03 00 00 7a 03 00 00 7c 03 00 00 7e 03 00 00 +0x744b0b79bb50: 80 03 00 00 82 03 00 00 84 03 00 00 86 03 00 00 +0x744b0b79bb60: 88 03 00 00 8a 03 00 00 8c 03 00 00 8e 03 00 00 +0x744b0b79bb70: 90 03 00 00 92 03 00 00 94 03 00 00 96 03 00 00 +0x744b0b79bb80: 98 03 00 00 9a 03 00 00 9c 03 00 00 9e 03 00 00 +0x744b0b79bb90: a0 03 00 00 a2 03 00 00 a4 03 00 00 a6 03 00 00 +0x744b0b79bba0: a8 03 00 00 aa 03 00 00 ac 03 00 00 ae 03 00 00 +0x744b0b79bbb0: b0 03 00 00 b2 03 00 00 b4 03 00 00 b6 03 00 00 +0x744b0b79bbc0: b8 03 00 00 ba 03 00 00 bc 03 00 00 be 03 00 00 +0x744b0b79bbd0: c0 03 00 00 c2 03 00 00 c4 03 00 00 c6 03 00 00 +0x744b0b79bbe0: c8 03 00 00 ca 03 00 00 cc 03 00 00 ce 03 00 00 +0x744b0b79bbf0: d0 03 00 00 d2 03 00 00 d4 03 00 00 d6 03 00 00 +0x744b0b79bc00: d8 03 00 00 da 03 00 00 dc 03 00 00 de 03 00 00 +0x744b0b79bc10: e0 03 00 00 e2 03 00 00 e4 03 00 00 e6 03 00 00 +-------------------------------- +new allocated header: +size: 432 +-------------------------------- +0x744b0b79bc40: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +0x744b0b79bc50: 10 11 12 13 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bc60: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bc70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bc80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bc90: 50 43 06 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bca0: 00 b0 79 0b 4b 74 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bcb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bcc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bcd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bcf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bd90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bda0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bdb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bdc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bdd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0x744b0b79bde0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +-------------------------------- +new free header: +size: 410096 +-------------------------------- +-------------------------------- +new tiny zone: +size: 12288 +-------------------------------- +-------------------------------- +new free header: +size: 12224 +-------------------------------- +-------------------------------- +new small zone: +size: 413696 +-------------------------------- +-------------------------------- +new free header: +size: 413632 +-------------------------------- diff --git a/srcs/bonus_utils.c b/srcs/bonus_utils.c new file mode 100644 index 0000000..bd90f25 --- /dev/null +++ b/srcs/bonus_utils.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* bonus_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/28 16:42:13 by thrieg #+# #+# */ +/* Updated: 2025/11/28 18:25:49 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" +#include "../libft/ft_printf/ft_printf.h" + +// bytes_per_line has to be a power of 2 +static void hexdump_block(void *addr, size_t size, size_t bytes_per_Line) +{ + unsigned char *p = (unsigned char *)addr; + uintptr_t start = (uintptr_t)p; + uintptr_t end = start + size; + + // align down to bytes_per_Line bytes + uintptr_t line_start = start & ~(uintptr_t)(bytes_per_Line - 1); + + while (line_start < end) + { + ft_printf("%p: ", (void *)line_start); + + for (size_t i = 0; i < bytes_per_Line; ++i) + { + uintptr_t pos = line_start + (uintptr_t)i; + + if (pos < start || pos >= end) + { + // outside the block; print spaces to keep alignment + ft_printf(" "); + } + else + { + unsigned char byte = *(unsigned char *)pos; + ft_printf("%02x ", (unsigned int)byte); + } + } + ft_printf("\n"); + line_start += bytes_per_Line; + } +} + +void print_zone(t_zone *zone, bool hexdump_free_zones) +{ + ft_printf("--------------------------------\n"); + ft_printf("new %s zone:\n", zone->type == E_TINY ? "tiny" : (zone->type == E_SMALL ? "small" : "large")); + ft_printf("size: %u\n", (unsigned int)zone->size); + ft_printf("--------------------------------\n"); + + char *zone_end = (char *)zone + zone->size; + t_header *header = (t_header *)(zone + 1); + while ((char *)header + sizeof(t_header) <= zone_end) + { + ft_printf("--------------------------------\n"); + ft_printf("new %s header:\n", header->occupied ? "allocated" : "free"); + ft_printf("size: %u\n", (unsigned int)header->size); + ft_printf("--------------------------------\n"); + if (header->occupied || hexdump_free_zones) + hexdump_block(header + 1, header->size, 16); + header = (t_header *)((char *)(header + 1) + header->size); + } +} + +void print_all_zones(t_zone *first_zone, bool hexdump_free_zones) +{ + while (first_zone) + { + print_zone(first_zone, hexdump_free_zones); + first_zone = first_zone->next; + } +} + +void show_alloc_mem_ex(bool hexdump_free_zones) +{ + print_all_zones(g_state.tiny_zone, hexdump_free_zones); + print_all_zones(g_state.small_zone, hexdump_free_zones); + print_all_zones(g_state.large_zone, hexdump_free_zones); +} diff --git a/srcs/bonus_utils.o b/srcs/bonus_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..63358b85be729f5407234ccdd72af33dd3a94f77 GIT binary patch literal 3696 zcmbtW-D_M$6hC*jw%hdMZa>hLs=aE1BIJ@ytxXecx9ZpdQ!PS3uwi?X+ZNYb&&RPb^OWMsVxhK^I=wivGaIn8^hlHXJ2y}xy~4suYtl=` z%C|!NiaDisxGtjyW3nu&=z}cH8nP@Z(i0U`?-f=3;;wyTv-R%Ge6q1^F0f5hlipZ7!J`{y05$f$-c z*JPv7kfonH2X0clk6^H6xv(h9{r>8BWh!c7K}N-*EQ@)Gb?ug{Y2URu85Og#EUrsWT$jCKK|j0E@4?o*es&AC zmIbu7g9OtsC9dgL3)e#Z&5260xZK&=1zhej8`2Y185PR++5tZrM+R<=T%vfym*rn+ zvJU#W7uB?r^=a{Nm!@A`Y-XeMl5trU_1YcZP<-I#h`#e2y21GzPfn>^Zb;8hSg(6p zG=gS`F2-8$@#TC8XX$tX+8}G6G};~GbS`W6w1GRGJq1q2N~a-hm zk?1lz%|u6HUqSWm2H2{i0HB@z5VT@k+p&I4?2-oXEchQ{0xyVz8{-!uZ*N!~J+7@^ z6I1Q~mem?+2AmZ;afWMc7XmgcI!13%u z5N-?pWdPU=5jaBuQ@H@3_8xhL$}#1mub-zbl^X!?3<;6O@1KSbyg?DTf13h)7xAcF z6X0clUmM^*2=K80&v8UM(EyLvBO*NSB=M-nJz+on+h(QS3+RLE`jYst{o5_{zqZi- z9?;`!%l_OA@aqHoy#SBD0IaXKupgtJhwyrJ;=}$w9nc5Y`&VSl;36>c)tCAza^f}>9LTW&-a-S&*ymSCVk6haK>^cQ|jqT zW$aAKE`pi2)0XMlMHkGWTqa{@U6{y^XI+$~@LhDk>@yuV4`X(5xR9Ah4W@HL$HC0z zT-!YKet(DKTG&pfPh?Wo@NnK4AB7P&rL2s=Xv%Rd*CwNAkmj_jrJ8@5~v z=T2bLpEJRa%KyMObZ><*Ne@OBog+r53ESvS=68z0dC@`n#0cgN0&^12To~8M;4vDH z?qG`J-HX6^5!=;!48Zp}BSYgpWrD!|bBXT**2AH!(s+EIg5Ysn_R;t-^v5mgG1@PD zZi0?)6LA{t|eS5x;G;e|!$HiSHbb=lJ12ShTN!zd3v~6^b;T{|~6yTsPw~ U?MoQnk^ga87{&|V-|+nZ0n}CwrvLx| literal 0 HcmV?d00001 diff --git a/srcs/ft_calloc.c b/srcs/ft_calloc.c new file mode 100644 index 0000000..bfcbcf2 --- /dev/null +++ b/srcs/ft_calloc.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/25 11:47:16 by thrieg #+# #+# */ +/* Updated: 2025/11/28 16:41:16 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" + +void *calloc(size_t nmemb, size_t size) +{ + size_t real_size = nmemb * size; + void *malloc_ret; + + if (real_size % ALLIGN_BYTES) + real_size = ((real_size / ALLIGN_BYTES) + 1) * ALLIGN_BYTES; + malloc_ret = malloc(real_size); + if (!malloc_ret) + return (NULL); + // pthread_mutex_lock(&g_mut); + ft_memset(malloc_ret, 0, real_size); // no need to lock because pointer is internal until we return it, user can't call any of our function on it + // pthread_mutex_unlock(&g_mut); + return (malloc_ret); +} diff --git a/srcs/ft_calloc.o b/srcs/ft_calloc.o new file mode 100644 index 0000000000000000000000000000000000000000..56a0ec39ad92f7290ebe47c61da889bd47974163 GIT binary patch literal 1272 zcmbu7&x_MQ6vw~mc7G^cTNXt@!QS+;W2=|-psY%C4#k7giy$SNP1nUFm1bJ1P!zHX zp_lznyn1v|5dVW7a}g?ds2Ax$sJvtz4WWDT1If&M-+S}k%)GZ|<6*%tz!A(_Nf}fu@Xp$naN9M#HI$dJ{P^r?ULfoXE(G<;aX>7?))@L;2`DfJ8Z&6lM6? zkSB35^%}+#+EPa5Scbzf%I`O6`OTb>{PSWGI2_ASGp_$hT}S3vM&?Y8%$W?o)}DVs zbFb&CUe$Ij|Df7;y1`+`uhwshny7ErZ}$@GEl?4J@#YDPLB+USTHiP}fGbEpBBI~D zbCnN;2b*h!qtg0DA}{3`fFgd+ml;=(xirmF09zS7$pzp7fC@WhXq=);?NbD>3gGWN zCCKPxW4)?%swi94Y7wIAxRy}PKtb3Y&vSf*wrY8f7dQ&S?aQu$dG>6X}Rkjxhj^ANN4cE`yIpzElorup#=cl{oc-C*w`!(hr0PlFu1YHo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/19 15:44:05 by thrieg #+# #+# */ +/* Updated: 2025/11/25 16:21:10 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" + +// returns non-0 (1) when the function munmap the zone +int defrag_zone(t_zone *zone) +{ + t_header *header = (t_header *)(zone + 1); + char *last_adr = ((char *)zone) + zone->size - sizeof(t_header); + while ((((char *)header) + header->size) < last_adr) + { + t_header *next_header = (t_header *)(((char *)header) + sizeof(t_header) + header->size); + if (!header->occupied && !next_header->occupied) + { + header->size = header->size + sizeof(t_header) + next_header->size; + } + else + { + header = next_header; + } + } + // if only 1 free header left, mmunmap the zone + if (header == (t_header *)(zone + 1) && !header->occupied) + { + if (zone->type == E_SMALL) + { + if (g_state.small_zone == zone) + { + if (zone->next) + g_state.small_zone = zone->next; + else + return (0); // last small zone, don't deallocate to avoid mmap stress + } + } + else if (zone->type == E_TINY) + { + if (g_state.tiny_zone == zone) + { + if (zone->next) + g_state.tiny_zone = zone->next; + else + return (0); // last tiny zone, don't deallocate to avoid mmap stress + } + } + if (zone->prev) + zone->prev->next = zone->next; + if (zone->next) + zone->next->prev = zone->prev; + munmap(zone, zone->size); + return (1); + } + return (0); +} + +void free(void *ptr) +{ + pthread_mutex_lock(&g_mut); + if (!ptr) + return ((void)pthread_mutex_unlock(&g_mut)); + t_header *header = ((t_header *)ptr) - 1; + if (header->zone->type == E_LARGE) + { + if (header->zone->prev) + header->zone->prev->next = header->zone->next; + if (header->zone->next) + header->zone->next->prev = header->zone->prev; + if (header->zone == g_state.large_zone) + { + if (g_state.large_zone->next) + g_state.large_zone = g_state.large_zone->next; + else + g_state.large_zone = NULL; + } + void *ptr = header->zone; + size_t len = header->zone->size; + munmap(ptr, len); + } + else if (header->zone->type == E_SMALL) + { + header->occupied = false; + defrag_zone(header->zone); + } + else if (header->zone->type == E_TINY) + { + header->occupied = false; + defrag_zone(header->zone); + } + pthread_mutex_unlock(&g_mut); +} diff --git a/srcs/ft_free.o b/srcs/ft_free.o new file mode 100644 index 0000000000000000000000000000000000000000..0b6098475b84067ea500328e1a1f887e7d1d1f25 GIT binary patch literal 2696 zcmbtW&1)QG82?SSO{S7MW39MYF^hB_q;$X7oh{p9 zP?@YSjE8y^y!0YS{{l~y7E=&Bcqlo>gRl!#Mh_Asu=2bgyR*}slRrr2eSh!s{XFmN zeCC{ccS_Tspy6$db|dKeXl?VQjmMy2m4&~v;Nb!bw__GLF$?Y#Sm^ZlIyxV-+=|YE zJNqnj_E|*y`5wz@Y}wg2f{Oq+NlNk{boPk)$JRBY`>GJw6T9b>c%-x7#{!F-J(knC zfl%*LfSd}QUjOUCU?APaT=wjJqkBdZ?u4}$#4Zk&G^2ZgD<7rASY+#L*@=zrlCT)F zpku<=$*XO|OeSSRruSz7>^g^}+kZg+_-b8B2TL%zAMuSe4`KZcWlmUsT5Xfo$Bkbf z8s{EFuspmxjGdEX2Ar5hcAkY4>M(YJ;r0QG-XfY?V8QkQjP4UWs1e<7imD&TnGiD**=DdbWpw`> zreK>a;8{JJq7QifMG;=RQ>P$upUnOR>qmFtcwY zj(2U7tc^Oty{SvUgVn_a*zU2Yz0WJuzr-zwc=!-LBZ;4EohCVEQO6Xbr^iHLbf3x; zO$0J3I}7d=F5kuKdb{Sg3#E!%+bmr3nyoAKT4C{wwO}pIFP?4l)7QuVK%+v?Zd`!Y zF||{(Gx|*ppaRn$;cuFemB-C5r`|a}o%=(ZozeN(oAUhj*!g$-JPS7g9Km0MN#{9C zJwi7CoJjCI766grr3#M$09{hvq!hL?_){4?-P%cZp3mTak^Wu*Fb&{vAn*oWcK=!N(aq za-u-#I=n9VbiQtar=`m4s|@~I$*1dcD!tk(4^J^wGh0aVMz@G%V~fbYjxJo1e}Geo0I&m>fRZ_BGg{=M4R*6HZ9~3v#dUQ2KpI5fake@cF@noCr@&3TlGv7lLafXN!=R`fGeQ zf{I_^(~SIImi1S8QT|k8rLXd*PqEy&K^?&7$|hk=>Z`txK0)QLa4U5$6dE%ASQ4a1 IB~APP4<$(~r2qf` literal 0 HcmV?d00001 diff --git a/srcs/ft_malloc.c b/srcs/ft_malloc.c new file mode 100644 index 0000000..099d2fe --- /dev/null +++ b/srcs/ft_malloc.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_malloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/17 15:02:55 by thrieg #+# #+# */ +/* Updated: 2025/11/25 14:30:44 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" + +void *malloc(size_t size) +{ + pthread_mutex_lock(&g_mut); + if (!size || size % ALLIGN_BYTES) + size = ((size / ALLIGN_BYTES) + 1) * ALLIGN_BYTES; + void *ret = NULL; + if (size > SMALL_SIZE_MAX) + { + ret = add_large(size); + } + else if (size > TINY_SIZE_MAX) + { + ret = add_small(size); + } + else + { + ret = add_tiny(size); + } + pthread_mutex_unlock(&g_mut); + return (ret); +} diff --git a/srcs/ft_malloc.o b/srcs/ft_malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..2ddfc4a9b7c4b245581ca9993274ee4755a02e96 GIT binary patch literal 1600 zcmbtUO=}ZD7=AWM)3mfrC<;Oqau5WeYoixED3KDKL-8O)yvVXmHfiX7l+C0hLeR2O z2tg3^2MAs~>cw-5f`6kIp@N5akv#~JcXx&?ljP(ByEF5=pYy&m^P;lzAf;)L&~Oiv z)dVN$$-Ep*%UFhnDjWP@!LI@v^g}khOOkW?v7jF!|7xA4!%E14vpfrkxgeR-^9&14 zGiw$-VlzDb{S$Z59tLzuofOV(F&7rI$8KcRG>u7THs}1nv1_Xx)Ogv9g$ZqXCx@e}pge zyT4XAPHnGdQ=eBBa}hlg?*L@*dpt{+Mrw)<0IJ3muFm19ceC^_&f#AJSWm=__5xsg zj=nyJ&x;JN1IPmSJB}gimjOU!k$hd~6HiA=@<$1tWRicI;1?47hdFUSCiIsQ`bEK0 zrIXdpr85glS(x>@!CP(*x^LO0&aEy-({MT*dd+hj%jJ_Mu~#^}63~HAN(A&uI9jV@2+5({Ea!7+wtxZp1Ua z2EEOFZtg;F_Z%AkAMZu|Rji5o{z(z2Zv*w6IO=&4@f#uTMgr>DT#oL;G?-|P>?8G% zD0#Im36l*Ge@k)kN35?Yyv$#YPlUaSD^fv$O7~*>gXCEv6ouk##a`ww!RPFMBpk|p u(*CK&(q8fn>fg@T1MpJ%B;-W@WM9ahpyp5YRdXji6^hZDEbPdo8vh?>zTSEO literal 0 HcmV?d00001 diff --git a/srcs/ft_realloc.c b/srcs/ft_realloc.c new file mode 100644 index 0000000..98df6c3 --- /dev/null +++ b/srcs/ft_realloc.c @@ -0,0 +1,146 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_realloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/25 11:47:23 by thrieg #+# #+# */ +/* Updated: 2025/11/28 16:37:22 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" + +// returns non-0 (1) is the zone changes type to a higher type (tiny to small or small to large) +static bool is_upgraded(size_t size, t_type current_type) +{ + if (size > SMALL_SIZE_MAX && current_type != E_LARGE) + return (1); + else if (size > TINY_SIZE_MAX && current_type != E_SMALL) + return (1); + else + return (0); +} + +void *realloc(void *ptr, size_t size) +{ + if (size == 0) + { + free(ptr); + return (NULL); + } + else if (!ptr) + { + return (malloc(size)); + } + size_t original_size = size; + if (size % ALLIGN_BYTES) + size = ((size / ALLIGN_BYTES) + 1) * ALLIGN_BYTES; + void *ret = NULL; + pthread_mutex_lock(&g_mut); + t_header *header = ((t_header *)ptr) - 1; + if (header->zone->type == E_LARGE) + { + pthread_mutex_unlock(&g_mut); + ret = malloc(size); + if (!ret) + return (NULL); + pthread_mutex_lock(&g_mut); + if (original_size > header->size) + ft_memcpy(ret, ptr, header->size); // if grow, copy the entire last buffer + else + ft_memcpy(ret, ptr, original_size); // if shrink, copy the new amount of bytes from older buffer + pthread_mutex_unlock(&g_mut); + free(ptr); + pthread_mutex_lock(&g_mut); + } + else if (is_upgraded(size, header->zone->type)) + { + pthread_mutex_unlock(&g_mut); + ret = malloc(size); + if (!ret) + return (NULL); + pthread_mutex_lock(&g_mut); + if (original_size > header->size) + ft_memcpy(ret, ptr, header->size); // if grow, copy the entire last buffer + else + ft_memcpy(ret, ptr, original_size); // if shrink, copy the new amount of bytes from older buffer + pthread_mutex_unlock(&g_mut); + free(ptr); + pthread_mutex_lock(&g_mut); + } + else if (header->zone->type == E_SMALL || header->zone->type == E_TINY) + { + t_header *next_header = (t_header *)(((char *)header) + sizeof(t_header) + header->size); + if ((char *)next_header > (((char *)header->zone) + header->zone->size - sizeof(t_header))) + next_header = NULL; // next header out of the zone + if (size > header->size) + { + if (next_header && !next_header->occupied && (header->size + next_header->size + sizeof(t_header)) >= size) + { + const size_t available_space = (header->size + next_header->size + sizeof(t_header)); + if (available_space - size > sizeof(t_header)) + { + // Split the block: create a new header in the remaining space + char *new_addr = (char *)(header + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = available_space - size - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = header->zone; + + header->size = size; + } + else + { + header->size = available_space; + } + ret = ptr; + } + else + { + pthread_mutex_unlock(&g_mut); + ret = malloc(size); + if (!ret) + return (NULL); + pthread_mutex_lock(&g_mut); + if (original_size > header->size) + ft_memcpy(ret, ptr, header->size); // if grow, copy the entire last buffer + else + ft_memcpy(ret, ptr, original_size); // if shrink, copy the new amount of bytes from older buffer + pthread_mutex_unlock(&g_mut); + free(ptr); + pthread_mutex_lock(&g_mut); + } + } + else + { + ret = ptr; // in all case we just return the original ptr, rest is just internal logic + size_t available_space = header->size - size; // zones are defragmented so all available contiguous space must be in a single header + if (next_header && !next_header->occupied) + available_space += next_header->size + sizeof(t_header); + if (available_space > sizeof(t_header)) + { + if (available_space > sizeof(t_header)) + { + // Split the block: create a new header in the remaining space + char *new_addr = (char *)(header + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = available_space - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = header->zone; + + header->size = size; + } + else + { + header->size = available_space; + } + } + } + } + pthread_mutex_unlock(&g_mut); + return (ret); +} diff --git a/srcs/ft_realloc.o b/srcs/ft_realloc.o new file mode 100644 index 0000000000000000000000000000000000000000..cedb7e1dc2dbe0b3080cd6cc2c6be845f3e416d6 GIT binary patch literal 3680 zcmcgvU1%It6h5=NO}4dl)+(YXbQNvElBKOLtx-wUYmbsuYzc@^mhEPe*6t?D{*JFv5E`HCi?t|)4J~a1k?2!=k$tE#OZ%|CNCY8r?oVHp>!NrVBMl=v1(~c7n3DZ{K_d>Z zVA;(rB;P--e)s=b{d|n1GGbfyj8ef6U^l0Yh1*I?5#ttmVhMe^vdiedltO=G8U3Rv zjK7>jcd?C!mh9Q2+L5L8<}e#DX32h90(<7Flw2(RK9scV<`?Q|8GS%MyF`g7=b#Ae z3m^2J^F#}M(ZanVKzB85&mJ>&OW&?CPY4pV<^pZ5(7)ojh zFr{c3vuZ=VWQX1%=}M|dmo9o@rSp;GH?_z5i_xL(IkX}6$l7t;3Zn>6dn+gFw0GE;aSeKC)om_t9ipw*pIQq6_box|Sh zE@*Y-S<>rINVpX`eb5)H=w2@$zc!Y!cg;|zfxYVmQ0JT1=z8@#c)rnv6o5TTD|8!o zV)o2d0JtI6tj?oqS>2)aS&Pjklo`A&)*iF$%dO+rVB|!7qE=5AiusB0^ckm8JvBLz z-hUvoFSCDO|Dn2^eG-6!I!a$#*S)he2J0A1M6cyHm5V=XdnQze{ZI zPs;hH||)vjC*k-$37%UOas; zdhvb)|5OD3cm)4G0PJLSO3eTutt+Hu(e>w=!ePeuGyWaTKLG%JjDL^Wle{L*ml5_~ zGka+4H>LGoI^nD}uir5x>jqd7XbSp6g>;Fs$B)1MJp?=fS8K-!2&L#SjTermeV62uaIi*5*8Zs59n9tOlsTz#u zO7$9K3X`RhGf{(b?PSHtj}qxj zM=RA+<2t@`GB;MqmmCzLR6^4rW{>NhwY zvHtEhWntDu>nDwkzghor+P~qoNdS1u#3ZEk{%IMdKOtN{{gMvXPFU6TC$$3&v`^vu Fe*q7yjS&C< literal 0 HcmV?d00001 diff --git a/srcs/init_state.c b/srcs/init_state.c new file mode 100644 index 0000000..cc82718 --- /dev/null +++ b/srcs/init_state.c @@ -0,0 +1,267 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_state.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: thrieg < thrieg@student.42mulhouse.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/11/18 16:44:13 by thrieg #+# #+# */ +/* Updated: 2025/11/28 16:41:55 by thrieg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/ft_malloc.h" + +pthread_mutex_t g_mut = PTHREAD_MUTEX_INITIALIZER; +t_state g_state = {.tiny_zone = NULL, .small_zone = NULL, .large_zone = NULL}; + +// only call this for TINY or SMALL +void *add_page(t_type type) +{ + size_t size; + if (type == E_TINY) + size = ((((((TINY_SIZE_MAX + sizeof(t_header)) * 100) + sizeof(t_zone))) / getpagesize()) + 1) * getpagesize(); + else if (type == E_SMALL) + size = ((((((SMALL_SIZE_MAX + sizeof(t_header)) * 100) + sizeof(t_zone))) / getpagesize()) + 1) * getpagesize(); + else + return (NULL); // TODO handle error somehow + t_zone *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, -1, 0); + if (ptr == MAP_FAILED) + return (NULL); + ptr->size = size; + if (type == E_TINY) + { + ptr->type = E_TINY; + ptr->prev = NULL; + t_header *header = (t_header *)(ptr + 1); + header->occupied = false; + header->size = size - sizeof(t_zone) - sizeof(t_header); + header->zone = ptr; + ptr->next = g_state.tiny_zone; // tiny_zone can be NULL but that's fine + if (g_state.tiny_zone) + g_state.tiny_zone->prev = ptr; + g_state.tiny_zone = ptr; + } + else if (type == E_SMALL) + { + ptr->type = E_SMALL; + ptr->prev = NULL; + t_header *header = (t_header *)(ptr + 1); + header->occupied = false; + header->size = size - sizeof(t_zone) - sizeof(t_header); + header->zone = ptr; + ptr->next = g_state.small_zone; // small_zone can be NULL but that's fine + if (g_state.small_zone) + g_state.small_zone->prev = ptr; + g_state.small_zone = ptr; + } + return (ptr); +} + +// returns the start of the buffer (returned by malloc) +void *add_large(size_t size) +{ + size = (((size + sizeof(t_header) + sizeof(t_zone)) / getpagesize()) + 1) * getpagesize(); + t_zone *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, -1, 0); + if (ptr == MAP_FAILED) + return (NULL); + ptr->size = size; + ptr->type = E_LARGE; + ptr->prev = NULL; + ptr->next = g_state.large_zone; // large_zone can be NULL but that's fine + if (g_state.large_zone) + g_state.large_zone->prev = ptr; + g_state.large_zone = ptr; + t_header *header = (t_header *)(ptr + 1); + header->occupied = true; + header->size = size - sizeof(t_zone) - sizeof(t_header); + header->zone = ptr; + return ((void *)(header + 1)); +} + +// returns the start of the buffer (returned by malloc) +// size has to be alligned +void *add_small(size_t size) +{ + t_zone *zone; + t_header *hdr; + void *result = NULL; + + zone = g_state.small_zone; + while (zone && !result) + { + char *zone_start = (char *)zone; + char *zone_end = zone_start + zone->size; + + // First header is right after the zone struct + hdr = (t_header *)(zone + 1); + + while ((char *)hdr + sizeof(t_header) <= zone_end) + { + if (!hdr->occupied && hdr->size >= size) + { + // Found a free block big enough + size_t remaining = hdr->size - size; + + if (remaining > sizeof(t_header)) + { + // Split the block: create a new header in the remaining space + char *new_addr = (char *)(hdr + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = remaining - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = zone; + + hdr->size = size; + } + // else: not enough room for another header, we just don't touch the size + + hdr->occupied = true; + result = (void *)(hdr + 1); + break; + } + + char *next_addr = (char *)(hdr + 1) + hdr->size; + + // If there's no room for another valid header, stop. + if (next_addr + sizeof(t_header) > zone_end) + break; + + hdr = (t_header *)next_addr; + } + + zone = zone->next; + } + + if (result) + return result; + + // not enough room, create a new page + zone = (t_zone *)add_page(E_SMALL); + if (!zone) + return (NULL); + + hdr = (t_header *)(zone + 1); + + if (hdr->size >= size) + { + size_t remaining = hdr->size - size; + + if (remaining > sizeof(t_header)) // should always be true (enough room for 100 allocs in a page) + { + char *new_addr = (char *)(hdr + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = remaining - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = zone; + + hdr->size = size; + } + hdr->occupied = true; + result = (void *)(hdr + 1); + } + else + { + // wtf, not possible, but nice to handle I guess + result = NULL; + } + + return (result); +} + +// returns the start of the buffer (returned by malloc) +// size has to be alligned +void *add_tiny(size_t size) +{ + t_zone *zone; + t_header *hdr; + void *result = NULL; + + zone = g_state.tiny_zone; + while (zone && !result) + { + char *zone_start = (char *)zone; + char *zone_end = zone_start + zone->size; + + // First header is right after the zone struct + hdr = (t_header *)(zone + 1); + + while ((char *)hdr + sizeof(t_header) <= zone_end) + { + if (!hdr->occupied && hdr->size >= size) + { + // Found a free block big enough + size_t remaining = hdr->size - size; + + if (remaining > sizeof(t_header)) + { + // Split the block: create a new header in the remaining space + char *new_addr = (char *)(hdr + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = remaining - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = zone; + + hdr->size = size; + } + // else: not enough room for another header, we just + + hdr->occupied = true; + result = (void *)(hdr + 1); + break; + } + + char *next_addr = (char *)(hdr + 1) + hdr->size; + + // If there's no room for another valid header, stop. + if (next_addr + sizeof(t_header) > zone_end) + break; + + hdr = (t_header *)next_addr; + } + + zone = zone->next; + } + + if (result) + return result; + + // not enough room, create a new page + zone = (t_zone *)add_page(E_TINY); + if (!zone) + return (NULL); + + hdr = (t_header *)(zone + 1); + + // hdr->size should always be >= size here + if (hdr->size >= size) + { + size_t remaining = hdr->size - size; + + if (remaining > sizeof(t_header)) // should always be true (enough room for 100 allocs in a page) + { + char *new_addr = (char *)(hdr + 1) + size; + t_header *newhdr = (t_header *)new_addr; + + newhdr->size = remaining - sizeof(t_header); + newhdr->occupied = false; + newhdr->zone = zone; + + hdr->size = size; + } + hdr->occupied = true; + result = (void *)(hdr + 1); + } + else + { + // wtf, not possible, but nice to handle I guess + result = NULL; + } + + return (result); +} diff --git a/srcs/init_state.o b/srcs/init_state.o new file mode 100644 index 0000000000000000000000000000000000000000..3cc3cef0288ef40d4b7eed665ce29282d2357472 GIT binary patch literal 4192 zcmeHKU1%It6#gcO?X*@WR&5Ivvxwp!U9$eRRAr;ydLNQv3-LiLakJU3(cMkSPD)Z- zv~E&69ii)kQlE@368q9TMnT-t(xf0X__W~5z6i5WWD8OAAg-MIGdnxYSReF7JTT16 zckj9P-0wT*%Wh*>=m0K4sa))`1LjcO9H6!dkxT(Xv+IFu7 z-6=M{%+_h!#-|3*5COPTUZOhST>PdRz}F7|7+7kxTCG9nnvBq4b-r9Bi0@-{Yp!FR zg9gCeA&W5dxo7|FswOpXzUP0K&OfEHO1rHD;YU zphsxgZZWjPUADv>w#eO~s;Z+!K@3~;^VlVb2omB+-ZZ5?XSK$&!R4v2x~VBGaF;Fk z!JiW67NijDuzI798U&Fblw@Ax+do<@Ntt9%R5n|0d=KC|Dn8v_JVA3P&AyaTbg2Iq z+|2WGX?|mF&T*HW;|{BEcW7R5Q<2FH=|m=19$eG>U!ypP2GvEZJSLo{+#lCkxJAbf8NmJ zZ>aItJN$=z|992+YaQc<#CVi_1fT~uS{sdbi*HM(QE%LiE+lCWK*ma+c!g^dX9N&e zc!hrB05W#sN8wG;_aS2ja4&$n&?DxOJ))jQ6|UdKPa5(A(5vPI?a>H)hnhq?Yyt2) z{km$kTKy6Da0EUPfiDH{t%3EEbYK9F0iaf<_dOheXCv^L2>izg{O1U~N9h-iXJ-U{ zMB!oHrX%q40X)dVFA?jTDnG*U+#i7_BJlGO_)e8)6hB>>|E-%g)}^>v;^Fx*35&{5 zM-e9fbF^_?A8&@{>pGxs78$KUm#%}JEn7{b#>PhM@xlz^lbKv9ZfB-#WJmH-Hsa}t zd_GgK5g#oUkw`8u6k%X{SaJFV5uY{twt^ z0F-1Mwzf^ae$|1>z7aG_VM<2dv>pej*a8;r6_lH#aoAp^0l?RhUP&jtobEplDlB}4 z(`urQL!0*3wp+!o`;Rv5|F8y>sdD!3dpF>O>_T{>kiRzSV+L?6n9F2~%Kx06s4Tqf z+Y$U#lzuw@i9aeS?XUUcr2n93r@ADBHI={CM#g~E D*vw1z literal 0 HcmV?d00001 diff --git a/test_malloc b/test_malloc new file mode 100755 index 0000000000000000000000000000000000000000..7c63b0b3ec7fcdaa26b61d6fb8873cbfd999764e GIT binary patch literal 25624 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 M|9=B{0(mI>8;#6$4*&oF literal 0 HcmV?d00001 diff --git a/test_show b/test_show new file mode 100755 index 0000000000000000000000000000000000000000..af191f2dd5f95f6f64111888edec9ac2627c270d GIT binary patch literal 17256 zcmeHOeQXrR6@Po@T^|^1^BDvAa7bvr>a`7o5+HDV9IU~7gg{C@$g+30wy(Vp=WY+| zG$bTW(@+-)q$;h{3MFdP(yCD+HGhz_3ML>RDV3bmQk{w@6b0q1q~WU2iZ+3*-pqUF z^I}VBRaI5BKk&VMGw(O^W@bNTcIQ12XbSOLi>TLzGzGFxW#W>(L>Al7w2R zBTvOc(t+B?@*VPnCEJzitC!_KJ=I5YJ~_s+oQJLy8zirIx8$+hLH*J}l6k0#Cg@b( zQmT(+k?Lc~{fT{oe+#J{3#mU@mfWXey}WJ2+eSQ=tH_=u_x-)+o%p{~-zMU9kt1Ey zk1W4R^|9po?m6$oX=uL`c$ha+ePfM7E%iT3>RxC}CZY@GHzwl^$wWHe)zGzYLBoRi zdM=~S74@TESO=a{Yc_0!z#izsH0I;+Q~+_FWB&UMzuf+(LoeI6^hUoweeLCn4-5NW z<1&zgHV7OBJ|$SkvBI{aeWgep3A9HZ`oi_2DzwmGIOL(gSUN2xD>HLWcxR+@A5x%!=@<9YMZa|Hqr1f}#Z01ubl zUh*>&<8V|uDDBk)&uKWa4mG;COkUSGuI1x>sVrUGuLyNvX^-R2V~nUTOQ%a%;MTHq zJZ~6HW$ESD)55a!(atd+K79D_;lqayAO9cttmgWE7(Jhaj9zu95y1F%pA&HVjh^G7 zW1@lXo#z?>+&LdM0@U0P26qnXIID%Bv##s9bN+}rPDzLQh5jz;IHeux6Z+ezu>&Z%ieb$Hujz~dOj>}+7fB*Yktc(d9rg-7~E;=8UZf0=`}Yz zE&M_IW5eqH!<)ikFz&`*XUbtT!6uA5f(h=~w*AN2hK;qDa zo=?IjBVVAiN5%s{;iD_AYwV2_kHk@XPiloDr%?N?)XtuaoIyg*?la?S_FWGEy^%A| zzG?JEibibxnP;bldLw6g`jowqGed)}>z<4ZO7p>Z&Ayq~ExnO~5nDfaq9XK*-pHUZ z9UM9%Ob4Xtz}%XBH(<$I2acXojNZsuBes5E@6=~|BLl*IVCWC7>mI?uHr}Y9mHX@0 zp_>;kyKb{vn26r??k)=5=-pi?e0*7?oGqNYT%yiq>U5;OCaLdYJ}#LHgGj;dC!-o$aK79D_ z;lqayA6EmvVvR>wZH}F-Z%brzPQCbMwy0jDkI2p1_9)51+;S4>_Ij(`N~A|Ip-*!4 z7UwCmf{XDRFTMykbis8y0U%U#T?4;i7hU%u0Jv0i-5-+6xG+R0k8TE~t5%scp)#~z zk>6nPo8{pPuKN`ZH{+5`l$8X4ZAI7Jf^RXFSJyrhSUFJ(ZVXJQzn85^Yo^M=DbjwAD=r{Z<>D_B?B47l2*FCey5$yB{FHu zYtow=n(vaFd2olq8~#J0&nAFa<^#Yy0Kh#02wbWM$`$3l&G@!p@^l3t7&y@RAZk;u zlUhd78I_~$b&}J(D z>UP{8u4p1hnWW6Ao}vb;YpP1zHt8SUmGG*BefZ%)xP*Tej zfQl+%1)$yx!Rn<|RaF354PX|e#2DZ!6h%=!ubzkkyF|hNxPjV?X43hb9+PLoxY9@j zCoAfN@#oc$c2J$5trN0JTc=iP2h}RARh_CiYGAE8UTar_+BP-xlsZ#etOm6GYL)f? z=LWTQHKaYI&eB@ESxB6qEm4C@%DCEtp&qqzry9`Ks+HRP)SQ}X9puRo5*pINdk!k_A$s-~?~D-Nmwt#xew?#~B8peSGN(iqY6jUAbk-RN{= z6Lx#!Dm(X0C)3$j+SD#=A(3{#f>?)@g(xKCV2uHB#=~D+Z#LfV6sUm5=>E%l`Eif_ zX!f`{Bmgzg=eb|tmI_QSdeSkv0@L~V#K8B03d{uDw}TM(0=)3W@wC$Oh4C#aho5(h z?+E*;rRNpnr(^g(R=a*B%9#R9H%foXFiKY1yqvDz^q=j7Yk^cckLtlgf- zId;}`Qf4ffN!vLv&3MLaPiCT4(u_NqY|gauT@cHpI+M0z$MvSsEzGt=I$>JbtkrGW zX(!taZCNX2oAG=q)eWXurkRO!!Wm&Y;?855t2ZxSA2A~vR+%Q4tM1>he0|GGFwHd^ zwwe)xa*b7+!Cce2amDghbK~mO_eQpuTb8eAjhLlyovXrf!W?`vZ@!G&DJ5VujtKQJ z?YQMwAR2@1v>Z#u^?2ihu8svV&3GN!KbR5ih(#+b) zOw4j@EYwNF%+3Uc4@Gl1szpQ(ndX-DE4lgDR~(H5dagU=SW(b(PFBheK1!q=JKG6* zI^)=SdpfUoW;303*6A)wislo^ctaviNy}HXG~gK_%sZ@H2k7zcbgnxkrIVF8G?f~m zm|4)XcG5xu9d#xh(1o|UV|O{A;|T$JHY0jew>#(*=!j>BHOY|Yf@JV%qh1Ag})z-tl_`K&-u(&+Dy)^dR7PQTCthSUwIQ z)^e=#dd?s|um8OMGxpK9PUiFavCG5f`nmtO{XZc73M!D-qlbvk>sRC>$IE|#&i_)( zAJ4m};k<5V@VGO6?BUlFzn=Kwn`#-jKUx0F!{_+&J!G(o&I1PX7%zGF{QluMu1^3; z?quJbsMd z<0osn1`zzdh2xsN_N=q~003&r`20TR62+&p9fNh2A5#o+X_)xE0mZ3%Up`d zO~m)wd+$FJseZmsFqnT2ClHv=5*PP;T#gs0K%AeK!=nPeDDb8s`tjul0LbX`VR&tu z#^BG9;qdT?hu~4gdH~bB?SBs6ZU8{raMc3LFPD7njQ~Bk_S3-JNb4XT559lmdpRDv da_s+_)PBbm5j-lcG)Cobze^I