From 2860380395c78661e664d917f56945118d23d4a8 Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Thu, 13 Aug 2026 17:55:40 +0200 Subject: [PATCH] Added error trace. --- src/asset_manager.c | 16 ++++---- src/ecs.c | 34 ++++++++-------- src/event_bus.c | 52 +++++++++--------------- src/headers/errors.h | 12 ++++++ src/headers/linked_list.h | 8 +--- src/linked_list.c | 85 ++++++++++++--------------------------- 6 files changed, 83 insertions(+), 124 deletions(-) diff --git a/src/asset_manager.c b/src/asset_manager.c index 88638b6..aa3932e 100644 --- a/src/asset_manager.c +++ b/src/asset_manager.c @@ -63,12 +63,12 @@ int asset_manager_init(asset_manager_t *asset_manager) return EXIT_FAILURE; } - if(linked_list_reserve(&asset_manager->assets_header_defs, nb_assets + 1)) return EXIT_FAILURE; + if(linked_list_reserve(&asset_manager->assets_header_defs, nb_assets + 1)) return_failure_int; for(size_t i = 0; i < nb_assets; i++) { elem_t *asset_header_def_elem = create_elem(&asset_manager->assets_header_defs); - if(!asset_header_def_elem) return EXIT_FAILURE; + if(!asset_header_def_elem) return_failure_int; asset_header_def_t *asset_header_def = asset_header_def_elem->data; size_t cap = 0; @@ -87,7 +87,7 @@ int asset_manager_init(asset_manager_t *asset_manager) return EXIT_FAILURE; } - if(linked_list_push_back(&asset_manager->assets_header_defs, asset_header_def_elem)) return EXIT_FAILURE; + linked_list_push_back(&asset_manager->assets_header_defs, asset_header_def_elem); } debug_printf("Initialized asset manager."); @@ -98,8 +98,8 @@ int asset_manager_exit(asset_manager_t *asset_manager) { assert("Asset manager cannot be NULL" && asset_manager); - if(linked_list_exit(&asset_manager->assets_header_defs)) return EXIT_FAILURE; - if(linked_list_exit(&asset_manager->assets)) return EXIT_FAILURE; + if(linked_list_exit(&asset_manager->assets_header_defs)) return_failure_int; + if(linked_list_exit(&asset_manager->assets)) return_failure_int; if(fclose(asset_manager->asset_file)) { @@ -122,7 +122,7 @@ inline int asset_manager_collect_garbage(asset_manager_t *asset_manager) { assert("Asset manager cannot be NULL" && asset_manager); - if(linked_list_remove_if(&asset_manager->assets, condition_is_asset_unused)) return EXIT_FAILURE; + if(linked_list_remove_if(&asset_manager->assets, condition_is_asset_unused)) return_failure_int; return EXIT_SUCCESS; } @@ -230,7 +230,7 @@ int asset_manager_load_asset(asset_manager_t *asset_manager, const char *asset_n asset_header_def_t *asset_header_def = asset_header_def_elem->data; asset_elem = create_elem(&asset_manager->assets, asset_type); - if(!asset_elem) return EXIT_FAILURE; + if(!asset_elem) return_failure_int; asset_t *asset = asset_elem->data; asset->name = calloc(strlen(asset_name) + 1, sizeof(char)); @@ -246,7 +246,7 @@ int asset_manager_load_asset(asset_manager_t *asset_manager, const char *asset_n switch(asset_type) { case ASSET_TEXTURE: - if(load_texture(asset, asset_header_def, asset_manager->asset_file)) return EXIT_FAILURE; + if(load_texture(asset, asset_header_def, asset_manager->asset_file)) return_failure_int; break; default: diff --git a/src/ecs.c b/src/ecs.c index 26cdb03..2023a38 100644 --- a/src/ecs.c +++ b/src/ecs.c @@ -35,7 +35,7 @@ int create_component(component_t *component, va_list args) inline int destroy_component(component_t *component) { - if(component->deleter(component)) return EXIT_FAILURE; + if(component->deleter(component)) return_failure_int; return EXIT_SUCCESS; } @@ -52,7 +52,7 @@ int create_entity(entity_t *entity, va_list args) inline int destroy_entity(entity_t *entity) { - if(linked_list_exit(&entity->components)) return EXIT_FAILURE; + if(linked_list_exit(&entity->components)) return_failure_int; return EXIT_SUCCESS; } @@ -60,15 +60,15 @@ inline int destroy_entity(entity_t *entity) component_t *entity_new_component(entity_t *entity, component_type_t component_type) { elem_t *component_elem = create_elem(&entity->components, component_type); - if(!component_elem) return NULL; + if(!component_elem) return_failure_ptr; component_t *component = component_elem->data; component->entity = entity; - if(component->init(component)) return NULL; + if(component->init(component)) return_failure_ptr; - if(linked_list_push_front(&entity->components, component_elem)) return NULL; + linked_list_push_front(&entity->components, component_elem); return component; } @@ -96,33 +96,32 @@ static inline int action_update_component(elem_t *elem, va_list args __attribute { component_t *component = elem->data; - if(component->update(component)) return EXIT_FAILURE; + if(component->update(component)) return_failure_int; return EXIT_SUCCESS; } inline int update_entity(entity_t *entity) { - if(linked_list_for_each(&entity->components, action_update_component)) return EXIT_FAILURE; + if(linked_list_for_each(&entity->components, action_update_component)) return_failure_int; return EXIT_SUCCESS; } -// Only for this file // No args static inline int action_draw_component(elem_t *elem, va_list args __attribute__((unused))) { component_t *component = elem->data; if(component->draw) - if(component->draw(component)) return EXIT_FAILURE; + if(component->draw(component)) return_failure_int; return EXIT_SUCCESS; } inline int draw_entity(entity_t *entity) { - if(linked_list_for_each(&entity->components, action_draw_component)) return EXIT_FAILURE; + if(linked_list_for_each(&entity->components, action_draw_component)) return_failure_int; return EXIT_SUCCESS; } @@ -141,16 +140,15 @@ inline entity_t *entity_manager_new_entity(entity_manager_t *entity_manager, siz assert("Entity manager cannot be NULL" && entity_manager); elem_t *entity_elem = create_elem(&entity_manager->entities, id); - if(!entity_elem) return NULL; + if(!entity_elem) return_failure_ptr; - if(linked_list_push_back(&entity_manager->entities, entity_elem)) return NULL; + linked_list_push_back(&entity_manager->entities, entity_elem); debug_printf("Added entity %lu to entity manager.", id); return entity_elem->data; } -// Only for this file // No args static inline int action_update_entity(elem_t *elem, va_list args __attribute__((unused))) { @@ -161,7 +159,7 @@ inline int entity_manager_update(entity_manager_t *entity_manager) { assert("Entity manager cannot be NULL" && entity_manager); - if(linked_list_for_each(&entity_manager->entities, action_update_entity)) return EXIT_FAILURE; + if(linked_list_for_each(&entity_manager->entities, action_update_entity)) return_failure_int; return EXIT_SUCCESS; } @@ -174,7 +172,7 @@ static inline int action_draw_entity(elem_t *elem, va_list args __attribute__((u } // No args -static inline bool condition_is_draw_priority_higher(elem_t *elem, va_list args) +static inline bool condition_is_draw_priority_higher(elem_t *elem, va_list args __attribute__((unused))) { return ((entity_t *)elem->data)->draw_priority > ((entity_t *)elem->next->data)->draw_priority; } @@ -185,7 +183,7 @@ inline int entity_manager_draw(entity_manager_t *entity_manager) linked_list_insertion_sort(&entity_manager->entities, condition_is_draw_priority_higher); - if(linked_list_for_each(&entity_manager->entities, action_draw_entity)) return EXIT_FAILURE; + if(linked_list_for_each(&entity_manager->entities, action_draw_entity)) return_failure_int; return EXIT_SUCCESS; } @@ -201,7 +199,7 @@ inline int entity_manager_remove_entity(entity_manager_t *entity_manager, unsign { assert("Entity manager cannot be NULL" && entity_manager); - if(linked_list_remove_if(&entity_manager->entities, condition_is_entity_name, id)) return EXIT_FAILURE; + if(linked_list_remove_if(&entity_manager->entities, condition_is_entity_name, id)) return_failure_int; return EXIT_SUCCESS; } @@ -210,7 +208,7 @@ inline int entity_manager_exit(entity_manager_t *entity_manager) { assert("Entity manager cannot be NULL" && entity_manager); - if(linked_list_exit(&entity_manager->entities)) return EXIT_FAILURE; + if(linked_list_exit(&entity_manager->entities)) return_failure_int; debug_printf("Exited entity manager."); diff --git a/src/event_bus.c b/src/event_bus.c index 826b20d..faee90e 100644 --- a/src/event_bus.c +++ b/src/event_bus.c @@ -6,7 +6,7 @@ #include "errors.h" // Arg : callback_t callback -int create_subscription(subscription_t *subscription, va_list args) +inline int create_subscription(subscription_t *subscription, va_list args) { subscription->callback = va_arg(args, callback_t); subscription->data = va_arg(args, void *); @@ -15,7 +15,7 @@ int create_subscription(subscription_t *subscription, va_list args) } // Arg : size_t id -int create_topic(topic_t *topic, va_list args) +inline int create_topic(topic_t *topic, va_list args) { topic->id = va_arg(args, size_t); @@ -24,23 +24,23 @@ int create_topic(topic_t *topic, va_list args) return EXIT_SUCCESS; } -int destroy_topic(topic_t *topic) +inline int destroy_topic(topic_t *topic) { - if(linked_list_exit(&topic->subscriptions)) return EXIT_FAILURE; + if(linked_list_exit(&topic->subscriptions)) return_failure_int; return EXIT_SUCCESS; } -void event_bus_init(event_bus_t *event_bus) +inline void event_bus_init(event_bus_t *event_bus) { linked_list_init(&event_bus->topics, sizeof(topic_t), (allocator_t)create_topic, (deleter_t)destroy_topic); debug_printf("Initialized event bus."); } -int event_bus_exit(event_bus_t *event_bus) +inline int event_bus_exit(event_bus_t *event_bus) { - if(linked_list_exit(&event_bus->topics)) return EXIT_FAILURE; + if(linked_list_exit(&event_bus->topics)) return_failure_int; debug_printf("Exited event bus."); return EXIT_SUCCESS; @@ -49,9 +49,9 @@ int event_bus_exit(event_bus_t *event_bus) int event_bus_new_topic(event_bus_t *event_bus, size_t id) { elem_t *topic_elem = create_elem(&event_bus->topics, id); - if(!topic_elem) return EXIT_FAILURE; + if(!topic_elem) return_failure_int; - if(linked_list_push_back(&event_bus->topics, topic_elem)) return EXIT_FAILURE; + linked_list_push_back(&event_bus->topics, topic_elem); debug_printf("Created new topic with id : %lu", id); @@ -64,9 +64,9 @@ static inline bool condition_is_topic_id(elem_t *elem, va_list args) return ((topic_t *)elem->data)->id == va_arg(args, size_t); } -int event_bus_remove_topic(event_bus_t *event_bus, size_t id) +inline int event_bus_remove_topic(event_bus_t *event_bus, size_t id) { - if(linked_list_remove_if(&event_bus->topics, condition_is_topic_id, id)) return EXIT_FAILURE; + if(linked_list_remove_if(&event_bus->topics, condition_is_topic_id, id)) return_failure_int; return EXIT_SUCCESS; } @@ -74,11 +74,7 @@ int event_bus_remove_topic(event_bus_t *event_bus, size_t id) int event_bus_change_topic_id(event_bus_t *event_bus, size_t old_id, size_t new_id) { elem_t *topic_elem = linked_list_get_if(&event_bus->topics, condition_is_topic_id, old_id); - if(!topic_elem) - { - error_printf("No topics with id = %lu found.", old_id); - return EXIT_FAILURE; - } + if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; topic->id = new_id; @@ -86,15 +82,15 @@ int event_bus_change_topic_id(event_bus_t *event_bus, size_t old_id, size_t new_ return EXIT_SUCCESS; } -// Args : va_list_args -static inline int action_execute_callback(elem_t *elem, va_list args) +// Args : va_list args +static int action_execute_callback(elem_t *elem, va_list args) { subscription_t *subscription = elem->data; va_list args_copy; va_copy(args_copy, args); - if(subscription->callback(args_copy, subscription->data)) return EXIT_FAILURE; + if(subscription->callback(args_copy, subscription->data)) return_failure_int; va_end(args_copy); @@ -104,11 +100,7 @@ static inline int action_execute_callback(elem_t *elem, va_list args) int event_bus_publish(event_bus_t *event_bus, size_t id, ...) { elem_t *topic_elem = linked_list_get_if(&event_bus->topics, condition_is_topic_id, id); - if(!topic_elem) - { - error_printf("No topics with id = %lu found.", id); - return EXIT_FAILURE; - } + if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; @@ -116,7 +108,7 @@ int event_bus_publish(event_bus_t *event_bus, size_t id, ...) va_start(args, id); va_copy(args_copy, args); - if(linked_list_for_eachv(&topic->subscriptions, action_execute_callback, args_copy)) return EXIT_FAILURE; + if(linked_list_for_eachv(&topic->subscriptions, action_execute_callback, args_copy)) return_failure_int; va_end(args_copy); va_end(args); @@ -129,18 +121,14 @@ int event_bus_publish(event_bus_t *event_bus, size_t id, ...) int event_bus_subscribe(event_bus_t *event_bus, size_t id, callback_t callback, void *data) { elem_t *topic_elem = linked_list_get_if(&event_bus->topics, condition_is_topic_id, id); - if(!topic_elem) - { - error_printf("No topics with id = %lu found.", id); - return EXIT_FAILURE; - } + if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; elem_t *subscription_elem = create_elem(&topic->subscriptions, callback, data); - if(!subscription_elem) return EXIT_FAILURE; + if(!subscription_elem) return_failure_int; - if(linked_list_push_back(&topic->subscriptions, subscription_elem)) return EXIT_FAILURE; + linked_list_push_back(&topic->subscriptions, subscription_elem); debug_printf("Subscribed to topic with id : %lu", id); diff --git a/src/headers/errors.h b/src/headers/errors.h index 1ad75d0..4fa9439 100644 --- a/src/headers/errors.h +++ b/src/headers/errors.h @@ -32,4 +32,16 @@ fputc('\n', stderr); \ } while (0) +#define return_failure_int \ + do { \ + fprintf(stderr, " in %s:%d:%s()\n", __FILE__, __LINE__, __func__); \ + return EXIT_FAILURE; \ + } while (0); + +#define return_failure_ptr \ + do { \ + fprintf(stderr, " in %s:%d:%s()\n", __FILE__, __LINE__, __func__); \ + return NULL; \ + } while (0); + #endif // ERRORS_H \ No newline at end of file diff --git a/src/headers/linked_list.h b/src/headers/linked_list.h index f9af591..1433c49 100644 --- a/src/headers/linked_list.h +++ b/src/headers/linked_list.h @@ -172,20 +172,16 @@ int linked_list_clear(linked_list_t *linked_list); * * @param linked_list Pointer to a linked list * @param elem Pointer to an element - * - * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -int linked_list_push_back(linked_list_t *linked_list, elem_t *elem); +void linked_list_push_back(linked_list_t *linked_list, elem_t *elem); /** * @brief Insert an element from the front in a linked list, do nothing on error. * * @param linked_list Pointer to a linked list * @param elem Pointer to an element - * - * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -int linked_list_push_front(linked_list_t *linked_list, elem_t *elem); +void linked_list_push_front(linked_list_t *linked_list, elem_t *elem); /** * @brief Remove and return the last element in the given linked list, do nothing on error. diff --git a/src/linked_list.c b/src/linked_list.c index 6d1c1e5..8d818df 100644 --- a/src/linked_list.c +++ b/src/linked_list.c @@ -38,7 +38,7 @@ elem_t *create_elem(linked_list_t *linked_list, ...) va_start(args, linked_list); va_copy(args_copy, args); - if(linked_list->allocator(elem->data, args_copy)) return NULL; + if(linked_list->allocator(elem->data, args_copy)) return_failure_ptr; va_end(args_copy); va_end(args); @@ -51,14 +51,8 @@ inline int destroy_elem(linked_list_t *linked_list, elem_t *elem) { assert("Linked list cannot be NULL" && linked_list); - if(!elem) - { - error_printf("Elem cannot be NULL."); - return EXIT_FAILURE; - } - if(linked_list->deleter) - if(linked_list->deleter(elem->data)) return EXIT_FAILURE; + if(linked_list->deleter(elem->data)) return_failure_int; if(linked_list->size < linked_list->target_max_size) { @@ -74,7 +68,7 @@ inline int destroy_elem(linked_list_t *linked_list, elem_t *elem) return EXIT_SUCCESS; } -void linked_list_init(linked_list_t *linked_list, const size_t data_size, const allocator_t allocator, const deleter_t elem_deleter) +void linked_list_init(linked_list_t *linked_list, size_t data_size, const allocator_t allocator, const deleter_t elem_deleter) { assert("Linked list cannot be NULL" && linked_list); @@ -94,6 +88,8 @@ int linked_list_exit(linked_list_t *linked_list) { assert("Linked list cannot be NULL" && linked_list); + linked_list->target_max_size = 0; + elem_t *current_elem = linked_list->first; elem_t *tmp; @@ -103,11 +99,7 @@ int linked_list_exit(linked_list_t *linked_list) current_elem = current_elem->next; - if(linked_list->deleter) - if(linked_list->deleter(tmp->data)) return EXIT_FAILURE; - - free(tmp->data); - free(tmp); + if(destroy_elem(linked_list, tmp)) return_failure_int; } current_elem = linked_list->reserved; @@ -138,7 +130,7 @@ int linked_list_clear(linked_list_t *linked_list) current_elem = current_elem->next; - if(destroy_elem(linked_list, tmp)) return EXIT_FAILURE; + if(destroy_elem(linked_list, tmp)) return_failure_int; } linked_list->first = NULL; @@ -167,8 +159,8 @@ int linked_list_reserve(linked_list_t *linked_list, size_t target_max_size) elem->data = malloc(linked_list->data_size); if(!elem->data) { - error_printf("Failed to allocate memory : %d", errno); free(elem); + error_printf("Failed to allocate memory : %d", errno); return EXIT_FAILURE; } @@ -179,16 +171,10 @@ int linked_list_reserve(linked_list_t *linked_list, size_t target_max_size) return EXIT_SUCCESS; } -int linked_list_push_back(linked_list_t *linked_list, elem_t *elem) +void linked_list_push_back(linked_list_t *linked_list, elem_t *elem) { assert("Linked list cannot be NULL" && linked_list); - if(!elem) - { - error_printf("Elem cannot be NULL."); - return EXIT_FAILURE; - } - elem->prev = linked_list->last; elem->next = NULL; @@ -200,20 +186,12 @@ int linked_list_push_back(linked_list_t *linked_list, elem_t *elem) linked_list->last = elem; linked_list->size++; - - return EXIT_SUCCESS; } -int linked_list_push_front(linked_list_t *linked_list, elem_t *elem) +void linked_list_push_front(linked_list_t *linked_list, elem_t *elem) { assert("Linked list cannot be NULL" && linked_list); - if(!elem) - { - error_printf("Elem cannot be NULL."); - return EXIT_FAILURE; - } - elem->next = linked_list->first; elem->prev = NULL; @@ -225,8 +203,6 @@ int linked_list_push_front(linked_list_t *linked_list, elem_t *elem) linked_list->first = elem; linked_list->size++; - - return EXIT_SUCCESS; } elem_t *linked_list_pop_back(linked_list_t *linked_list) @@ -287,11 +263,16 @@ elem_t *linked_list_get(const linked_list_t *linked_list, size_t index) if(index == 0) return linked_list->first; + if(index == linked_list->size - 1) return linked_list->last; elem_t *current_elem = linked_list->first; - if(!current_elem) return NULL; + if(!current_elem) + { + error_printf("Failed to get element : linked list is empty."); + return NULL; + } for (size_t i = 0; i < index; i++) { @@ -305,29 +286,19 @@ int linked_list_insert(linked_list_t *linked_list, elem_t *elem, size_t index) / { assert("Linked list cannot be NULL" && linked_list); - if(!elem) - { - error_printf("Elem cannot be NULL."); - return EXIT_FAILURE; - } - - if(index > linked_list->size) - { - error_printf("Insert index out of range."); - return EXIT_FAILURE; - } - if(index == 0) { - return linked_list_push_front(linked_list, elem); + linked_list_push_front(linked_list, elem); + return EXIT_SUCCESS; } else if(index == linked_list->size) { - return linked_list_push_back(linked_list, elem); + linked_list_push_back(linked_list, elem); + return EXIT_SUCCESS; } elem_t *next_insert_elem = linked_list_get(linked_list, index); - if(!next_insert_elem) return EXIT_FAILURE; + if(!next_insert_elem) return_failure_int; elem_t *prev_insert_elem = next_insert_elem->prev; elem->prev = prev_insert_elem; @@ -345,19 +316,13 @@ int linked_list_remove(linked_list_t *linked_list, elem_t *elem) { assert("Linked list cannot be NULL" && linked_list); - if(!elem) - { - error_printf("Elem cannot be NULL."); - return EXIT_FAILURE; - } - elem_t *prev_elem = elem->prev; elem_t *next_elem = elem->next; if(prev_elem) prev_elem->next = next_elem; if(next_elem) next_elem->prev = prev_elem; - if(destroy_elem(linked_list, elem)) return EXIT_FAILURE; + if(destroy_elem(linked_list, elem)) return_failure_int; linked_list->size--; @@ -425,7 +390,7 @@ int linked_list_remove_if(linked_list_t *linked_list, const condition_t conditio va_end(args_copy); va_end(args); - return EXIT_FAILURE; + return_failure_int; } } @@ -459,7 +424,7 @@ int linked_list_for_each(const linked_list_t *linked_list, const action_t action va_end(args_copy); va_end(args); - return EXIT_FAILURE; + return_failure_int; } va_end(args_copy); @@ -489,7 +454,7 @@ int linked_list_for_eachv(const linked_list_t *linked_list, const action_t actio va_end(args_copy); va_end(args); - return EXIT_FAILURE; + return_failure_int; } va_end(args_copy);