From: Lukáš Jiřiště Date: Thu, 31 Jul 2025 10:11:55 +0000 (+0200) Subject: Harden ft_tree and change it a little X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=9a194b0e3bb3bffb2c8c2113c88b977929c01900;p=Libft.git Harden ft_tree and change it a little The change is to return t_tree from pointer to t_tree_node to just t_tree_node. I don't yet have much grasp on ergonomics of this but I think this is the better choice. --- diff --git a/ft_struct/ft_tree_access_child.c b/ft_struct/ft_tree_access_child.c index 50bc215..05c2308 100644 --- a/ft_struct/ft_tree_access_child.c +++ b/ft_struct/ft_tree_access_child.c @@ -3,5 +3,7 @@ t_tree_node *ft_tree_access_child(t_tree_node *tree_node, size_t i) { + if (!tree_node) + return (NULL); return (ft_vec_access(&tree_node->children, i)); } diff --git a/ft_struct/ft_tree_access_data.c b/ft_struct/ft_tree_access_data.c index 2eae4ca..50a8983 100644 --- a/ft_struct/ft_tree_access_data.c +++ b/ft_struct/ft_tree_access_data.c @@ -2,5 +2,7 @@ void *ft_tree_access_data(t_tree_node *tree_node) { + if (!tree_node) + return (NULL); return (&tree_node->data); } diff --git a/ft_struct/ft_tree_append_child.c b/ft_struct/ft_tree_append_child.c index 81884a6..2a5d9ef 100644 --- a/ft_struct/ft_tree_append_child.c +++ b/ft_struct/ft_tree_append_child.c @@ -6,6 +6,8 @@ t_ft_stat ft_tree_append_child(t_tree_node *tree_node, void *element) t_tree_node *new_node; t_ft_stat res; + if (!tree_node || !element) + return (invalid_input); res = ft_vec_append_empty(&tree_node->children); if (res != success) return (res); diff --git a/ft_struct/ft_tree_erase_child.c b/ft_struct/ft_tree_erase_child.c index 99c2cf9..1151451 100644 --- a/ft_struct/ft_tree_erase_child.c +++ b/ft_struct/ft_tree_erase_child.c @@ -1,14 +1,16 @@ #include "ft_struct.h" -void ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)) +t_ft_stat ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)) { t_tree_node *child_to_erase; + if (!tree_node || i >= tree_node->children.size) + return (invalid_input); child_to_erase = ft_tree_access_child(tree_node, i); while (child_to_erase->children.size > 0) ft_tree_erase_child(child_to_erase, 0, free_el); if (free_el) free_el(&child_to_erase->data); - ft_tree_forget_child(tree_node, i); - return ; + ft_vec_free(&child_to_erase->children, NULL); + return (ft_tree_forget_child(tree_node, i)); } diff --git a/ft_struct/ft_tree_forget_child.c b/ft_struct/ft_tree_forget_child.c index b74e8e1..30c47c8 100644 --- a/ft_struct/ft_tree_forget_child.c +++ b/ft_struct/ft_tree_forget_child.c @@ -1,8 +1,9 @@ #include "ft_struct.h" #include "libft.h" -void ft_tree_forget_child(t_tree_node *tree_node, size_t i) +t_ft_stat ft_tree_forget_child(t_tree_node *tree_node, size_t i) { - ft_vec_forget(&tree_node->children, i); - return ; + if (!tree_node) + return (invalid_input); + return (ft_vec_forget(&tree_node->children, i)); } diff --git a/ft_struct/ft_tree_free.c b/ft_struct/ft_tree_free.c index 16bc1fe..74e0b5b 100644 --- a/ft_struct/ft_tree_free.c +++ b/ft_struct/ft_tree_free.c @@ -3,13 +3,12 @@ void ft_tree_free(t_tree *tree, void (*free_el)(void *)) { - t_tree_node *root; - - root = *tree; - while (root->children.size > 0) - ft_tree_erase_child(root, 0, free_el); + if (!tree) + return ; + while (tree->children.size > 0) + ft_tree_erase_child(tree, 0, free_el); if (free_el) - free_el(&root->data); - ft_vec_free(&root->children, NULL); + free_el(&tree->data); + ft_vec_free(&tree->children, NULL); return ; } diff --git a/ft_struct/ft_tree_init.c b/ft_struct/ft_tree_init.c index 251daa3..60b09b6 100644 --- a/ft_struct/ft_tree_init.c +++ b/ft_struct/ft_tree_init.c @@ -4,12 +4,9 @@ t_ft_stat ft_tree_init(t_tree *tree, size_t el_size) { - t_tree_node *root; - - root = malloc(sizeof(t_tree_node) + el_size); - if (!root) - return (alloc_fail); - root->parent = NULL; - *tree = root; - return (ft_vec_init(&root->children, sizeof(t_tree_node) + el_size)); + if (!tree || el_size == 0) + return (invalid_input); + tree->parent = NULL; + ft_bzero(&tree->data, el_size); + return (ft_vec_init(&tree->children, sizeof(t_tree_node) + el_size)); } diff --git a/ft_struct/ft_tree_replace_with_child.c b/ft_struct/ft_tree_replace_with_child.c index 5eaf5e8..7296ddc 100644 --- a/ft_struct/ft_tree_replace_with_child.c +++ b/ft_struct/ft_tree_replace_with_child.c @@ -1,22 +1,25 @@ #include "ft_struct.h" #include "libft.h" -void ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)) +t_ft_stat ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)) { t_tree_node *child; t_ft_stat res; + size_t children_relocated_count; child = ft_tree_access_child(tree_node, i); if (!child) - return ; - res = ft_vec_insert_range(&tree_node->children, child->children.vec, child->children.size, i); + return (invalid_input); + children_relocated_count = child->children.size; + res = ft_vec_insert_range(&tree_node->children, child->children.vec, children_relocated_count, i); if (res != success) - return ; - i += child->children.size; + return (alloc_fail); + i += children_relocated_count; + child = ft_tree_access_child(tree_node, i); if (free_el) free_el(&tree_node->data); - ft_memcpy(&tree_node->data, &child->data, tree_node->children.size - sizeof(t_tree_node)); + ft_memcpy(&tree_node->data, &child->data, tree_node->children.el_size - sizeof(t_tree_node)); ft_vec_free(&child->children, NULL); ft_vec_forget(&tree_node->children, i); - return ; + return (success); } diff --git a/inc/ft_struct.h b/inc/ft_struct.h index 648ff4c..151bce4 100644 --- a/inc/ft_struct.h +++ b/inc/ft_struct.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */ -/* Updated: 2025/07/31 08:09:13 by ljiriste ### ########.fr */ +/* Updated: 2025/07/31 11:58:41 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,15 +47,15 @@ struct s_tree_node char data[]; }; -typedef t_tree_node *t_tree; +typedef t_tree_node t_tree; t_ft_stat ft_tree_init(t_tree *tree, size_t el_size); t_ft_stat ft_tree_append_child(t_tree_node *tree_node, void *element); t_tree_node *ft_tree_access_child(t_tree_node *tree_node, size_t i); void *ft_tree_access_data(t_tree_node *tree_node); -void ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)); -void ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)); -void ft_tree_forget_child(t_tree_node *tree_node, size_t i); +t_ft_stat ft_tree_erase_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)); +t_ft_stat ft_tree_replace_with_child(t_tree_node *tree_node, size_t i, void (*free_el)(void *)); +t_ft_stat ft_tree_forget_child(t_tree_node *tree_node, size_t i); void ft_tree_free(t_tree *tree, void (*free_el)(void *)); # ifdef __cplusplus