From a7e3c16ad932e45dcd8efacdf496546e01102bba Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Fri, 14 Aug 2026 19:06:25 +0200 Subject: [PATCH] Removed variadic arguments from looping linked list functions. --- src/asset_manager.c | 28 +++++------ src/ecs.c | 43 +++++++++-------- src/event_bus.c | 40 ++++++---------- src/headers/asset_manager.h | 6 +-- src/headers/event_bus.h | 4 +- src/headers/linked_list.h | 28 ++++------- src/linked_list.c | 93 ++++--------------------------------- 7 files changed, 70 insertions(+), 172 deletions(-) diff --git a/src/asset_manager.c b/src/asset_manager.c index 78d84de..a32cd7a 100644 --- a/src/asset_manager.c +++ b/src/asset_manager.c @@ -109,36 +109,36 @@ int asset_manager_exit(void) // Only for this file // No args -static inline bool condition_is_asset_unused(elem_t *elem, va_list args __attribute__((unused))) +static inline bool condition_is_asset_unused(elem_t *elem, void *arg __attribute__((unused))) { return !((asset_t *)elem->data)->nb_refs; } inline int asset_manager_collect_garbage(void) { - if(linked_list_remove_if(&game.asset_manager.assets, condition_is_asset_unused)) return_failure_int; + if(linked_list_remove_if(&game.asset_manager.assets, condition_is_asset_unused, NULL)) return_failure_int; return EXIT_SUCCESS; } // Only for this file // Arg : const char *asset_name -static inline bool condition_is_asset_name(elem_t *elem, va_list args) +static inline bool condition_is_asset_name(elem_t *elem, void *arg) { - return !strcmp(((asset_t *)elem->data)->name, va_arg(args, const char *)); + return !strcmp(((asset_t *)elem->data)->name, (const char *)arg); } //Only for this file // Arg : const char *asset_name -static inline bool condition_is_asset_header_def_name(elem_t *elem, va_list args) +static inline bool condition_is_asset_header_def_name(elem_t *elem, void *arg) { - return !strcmp(((asset_header_def_t *)elem->data)->name, va_arg(args, const char *)); + return !strcmp(((asset_header_def_t *)elem->data)->name, (const char *)arg); } -asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_type) +asset_t *asset_manager_load_asset(char *asset_name, asset_type_t asset_type) { // Check if asset has alread been loaded. - elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, asset_name); + elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name); if(asset_elem) { ((asset_t *)asset_elem->data)->nb_refs++; @@ -148,7 +148,7 @@ asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_typ else { // If it didn't, load it - elem_t *asset_header_def_elem = linked_list_get_if(&game.asset_manager.assets_header_defs, condition_is_asset_header_def_name, asset_name); + elem_t *asset_header_def_elem = linked_list_get_if(&game.asset_manager.assets_header_defs, condition_is_asset_header_def_name, (void *)asset_name); if(!asset_header_def_elem) { error_printf("Asset doesn't exist in asset file : %s", asset_name); @@ -199,9 +199,9 @@ asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_typ return asset_elem->data; } -int asset_manager_let_go_asset(const char *asset_name) +int asset_manager_let_go_asset(char *asset_name) { - elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, asset_name); + elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name); if(!asset_elem) { error_printf("Asset doesn't exists : %s", asset_name); @@ -217,12 +217,12 @@ int asset_manager_let_go_asset(const char *asset_name) return EXIT_SUCCESS; } -asset_t *asset_manager_get_asset(const char *texture_name) +asset_t *asset_manager_get_asset(char *asset_name) { - elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, texture_name); + elem_t *asset_elem = linked_list_get_if(&game.asset_manager.assets, condition_is_asset_name, (void *)asset_name); if(!asset_elem) { - error_printf("Asset \"%s\" hasn't been loaded yet.", texture_name); + error_printf("Asset \"%s\" hasn't been loaded yet.", asset_name); return NULL; } diff --git a/src/ecs.c b/src/ecs.c index c189a7b..8de64a3 100644 --- a/src/ecs.c +++ b/src/ecs.c @@ -77,14 +77,14 @@ component_t *entity_new_component(entity_t *entity, component_type_t component_t // Only for this file // Arg : component_type_t component_type -static inline bool condition_is_component_type(elem_t *elem, va_list args) +static inline bool condition_is_component_type(elem_t *elem, void *arg) { - return ((component_t *)elem->data)->type == va_arg(args, component_type_t); + return ((component_t *)elem->data)->type == *(component_type_t *)arg; } inline component_t *entity_get_component(const entity_t *entity, component_type_t component_type) { - elem_t *component_elem = linked_list_get_if(&entity->components, condition_is_component_type, component_type); + elem_t *component_elem = linked_list_get_if(&entity->components, condition_is_component_type, &component_type); if(!component_elem) return NULL; component_t *component = component_elem->data; @@ -94,7 +94,7 @@ inline component_t *entity_get_component(const entity_t *entity, component_type_ // Only for this file // No args -static inline int action_update_component(elem_t *elem, va_list args __attribute__((unused))) +static inline int action_update_component(elem_t *elem, void *arg __attribute__((unused))) { component_t *component = elem->data; @@ -105,13 +105,13 @@ static inline int action_update_component(elem_t *elem, va_list args __attribute inline int update_entity(entity_t *entity) { - if(linked_list_for_each(&entity->components, action_update_component)) return_failure_int; + if(linked_list_for_each(&entity->components, action_update_component, NULL)) return_failure_int; return EXIT_SUCCESS; } // No args -static inline int action_draw_component(elem_t *elem, va_list args __attribute__((unused))) +static inline int action_draw_component(elem_t *elem, void *arg __attribute__((unused))) { component_t *component = elem->data; @@ -123,7 +123,7 @@ static inline int action_draw_component(elem_t *elem, va_list args __attribute__ inline int draw_entity(entity_t *entity) { - if(linked_list_for_each(&entity->components, action_draw_component)) return_failure_int; + if(linked_list_for_each(&entity->components, action_draw_component, NULL)) return_failure_int; return EXIT_SUCCESS; } @@ -148,50 +148,49 @@ inline entity_t *entity_manager_new_entity(size_t id) } // No args -static inline int action_update_entity(elem_t *elem, va_list args __attribute__((unused))) +static inline int action_update_entity(elem_t *elem, void *arg __attribute__((unused))) { return update_entity((entity_t *)elem->data); } inline int entity_manager_update(void) { - if(linked_list_for_each(&game.entity_manager.entities, action_update_entity)) return_failure_int; + if(linked_list_for_each(&game.entity_manager.entities, action_update_entity, NULL)) return_failure_int; return EXIT_SUCCESS; } -// Only for this file // No args -static inline int action_draw_entity(elem_t *elem, va_list args __attribute__((unused))) -{ - return draw_entity((entity_t *)elem->data); -} - -// No args -static inline bool condition_is_draw_priority_higher(elem_t *elem, va_list args __attribute__((unused))) +static inline bool condition_is_draw_priority_higher(elem_t *elem, void *arg __attribute__((unused))) { return ((entity_t *)elem->data)->draw_priority > ((entity_t *)elem->next->data)->draw_priority; } +// No args +static inline int action_draw_entity(elem_t *elem, void *arg __attribute__((unused))) +{ + return draw_entity((entity_t *)elem->data); +} + inline int entity_manager_draw(void) { - linked_list_insertion_sort(&game.entity_manager.entities, condition_is_draw_priority_higher); + linked_list_insertion_sort(&game.entity_manager.entities, condition_is_draw_priority_higher, NULL); - if(linked_list_for_each(&game.entity_manager.entities, action_draw_entity)) return_failure_int; + if(linked_list_for_each(&game.entity_manager.entities, action_draw_entity, NULL)) return_failure_int; return EXIT_SUCCESS; } // Only for this file // Arg : unsigned int id -static inline bool condition_is_entity_name(elem_t *elem, va_list args) +static inline bool condition_is_entity_name(elem_t *elem, void *arg) { - return ((entity_t *)elem->data)->id == va_arg(args, unsigned int); + return ((entity_t *)elem->data)->id == *(unsigned int *)arg; } inline int entity_manager_remove_entity(unsigned int id) { - if(linked_list_remove_if(&game.entity_manager.entities, condition_is_entity_name, id)) return_failure_int; + if(linked_list_remove_if(&game.entity_manager.entities, condition_is_entity_name, &id)) return_failure_int; return EXIT_SUCCESS; } diff --git a/src/event_bus.c b/src/event_bus.c index 30c118e..eb04f68 100644 --- a/src/event_bus.c +++ b/src/event_bus.c @@ -60,21 +60,21 @@ int event_bus_new_topic(size_t id) } // Arg : size_t id -static inline bool condition_is_topic_id(elem_t *elem, va_list args) +static inline bool condition_is_topic_id(elem_t *elem, void *arg) { - return ((topic_t *)elem->data)->id == va_arg(args, size_t); + return ((topic_t *)elem->data)->id == *(size_t *)arg; } inline int event_bus_remove_topic(size_t id) { - if(linked_list_remove_if(&game.event_bus.topics, condition_is_topic_id, id)) return_failure_int; + if(linked_list_remove_if(&game.event_bus.topics, condition_is_topic_id, &id)) return_failure_int; return EXIT_SUCCESS; } int event_bus_change_topic_id(size_t old_id, size_t new_id) { - elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, old_id); + elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &old_id); if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; @@ -84,35 +84,23 @@ int event_bus_change_topic_id(size_t old_id, size_t new_id) } // Args : va_list args -static int action_execute_callback(elem_t *elem, va_list args) +static int action_execute_callback(elem_t *elem, void *arg) { subscription_t *subscription = elem->data; - va_list args_copy; - va_copy(args_copy, args); - - if(subscription->callback(args_copy, subscription->data)) return_failure_int; - - va_end(args_copy); + if(subscription->callback(arg, subscription->data)) return_failure_int; return EXIT_SUCCESS; } -int event_bus_publish(size_t id, ...) +int event_bus_publish(size_t id, void *arg) { - elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id); + elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id); if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; - va_list args, args_copy; - va_start(args, id); - va_copy(args_copy, args); - - if(linked_list_for_eachv(&topic->subscriptions, action_execute_callback, args_copy)) return_failure_int; - - va_end(args_copy); - va_end(args); + if(linked_list_for_each(&topic->subscriptions, action_execute_callback, arg)) return_failure_int; debug_printf("Published event on topic with id : %lu", id); @@ -121,7 +109,7 @@ int event_bus_publish(size_t id, ...) int event_bus_subscribe(size_t id, callback_t callback, void *data) { - elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id); + elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id); if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; @@ -137,19 +125,19 @@ int event_bus_subscribe(size_t id, callback_t callback, void *data) } // Arg : callback_t callback -static inline bool condition_is_callback(elem_t *elem, va_list args) +static inline bool condition_is_callback(elem_t *elem, void *arg) { - return ((subscription_t *)elem->data)->callback == va_arg(args, callback_t); + return ((subscription_t *)elem->data)->callback == *(callback_t *)arg; } int event_bus_unsubscribe(size_t id, callback_t callback) { - elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, id); + elem_t *topic_elem = linked_list_get_if(&game.event_bus.topics, condition_is_topic_id, &id); if(!topic_elem) return_failure_int; topic_t *topic = topic_elem->data; - if(linked_list_remove_if(&topic->subscriptions, condition_is_callback, callback)) return_failure_int; + if(linked_list_remove_if(&topic->subscriptions, condition_is_callback, &callback)) return_failure_int; return EXIT_SUCCESS; } diff --git a/src/headers/asset_manager.h b/src/headers/asset_manager.h index f88de24..109861c 100644 --- a/src/headers/asset_manager.h +++ b/src/headers/asset_manager.h @@ -38,8 +38,8 @@ int asset_manager_init(void); int asset_manager_exit(void); int asset_manager_collect_garbage(void); -asset_t *asset_manager_load_asset(const char *asset_name, asset_type_t asset_type); -int asset_manager_let_go_asset(const char *asset_name); -asset_t *asset_manager_get_asset(const char *asset_name); +asset_t *asset_manager_load_asset(char *asset_name, asset_type_t asset_type); +int asset_manager_let_go_asset(char *asset_name); +asset_t *asset_manager_get_asset(char *asset_name); #endif // ASSET_MANAGER_H \ No newline at end of file diff --git a/src/headers/event_bus.h b/src/headers/event_bus.h index 7b0e721..bfd2bae 100644 --- a/src/headers/event_bus.h +++ b/src/headers/event_bus.h @@ -4,7 +4,7 @@ #include #include "linked_list.h" -typedef int (*callback_t)(va_list event_args, void *subscribtion_args); +typedef int (*callback_t)(void *event_arg, void *subscribtion_arg); typedef struct subscription_t { callback_t callback; @@ -32,7 +32,7 @@ int event_bus_new_topic(size_t id); int event_bus_remove_topic(size_t id); int event_bus_change_topic_id(size_t old_id, size_t new_id); -int event_bus_publish(size_t id, ...); +int event_bus_publish(size_t id, void *arg); int event_bus_subscribe(size_t id, callback_t callback, void *data); int event_bus_unsubscribe(size_t id, callback_t callback); diff --git a/src/headers/linked_list.h b/src/headers/linked_list.h index 1153aef..1aee598 100644 --- a/src/headers/linked_list.h +++ b/src/headers/linked_list.h @@ -59,11 +59,11 @@ typedef int (*deleter_t)(void *data); * bool name_of_your_condition(elem_t *elem, va_list); * * @param elem Processed element - * @param args Arguments to pass to the function + * @param arg Argument to pass to the function * * @return False, true for the element to be removed. */ -typedef bool (*condition_t)(elem_t *elem, va_list args); +typedef bool (*condition_t)(elem_t *elem, void *arg); /** * @brief A type for action used for function like linked_list_for_each @@ -73,11 +73,11 @@ typedef bool (*condition_t)(elem_t *elem, va_list args); * int name_of_your_condition(elem_t *elem, va_list); * * @param elem Processed element - * @param args Arguments to pass to the function + * @param arg Argument to pass to the function * * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -typedef int (*action_t)(elem_t *elem, va_list args); +typedef int (*action_t)(elem_t *elem, void *arg); /** * @brief Base of linked lists. @@ -244,7 +244,7 @@ int linked_list_remove(linked_list_t *linked_list, elem_t *elem); * * @return Pointer to element, NULL if no element verify the condition or if an error occurred. */ -elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, ...); +elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, void *arg); /** * @brief Remove every elements that the condition verify, do nothing on error. @@ -255,7 +255,7 @@ elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t c * * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, ...); +int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, void *arg); /** * @brief Apply an action to every elements in the list. @@ -267,19 +267,7 @@ int linked_list_remove_if(linked_list_t *linked_list, const condition_t conditio * * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -int linked_list_for_each(const linked_list_t *linked_list, const action_t action, ...); - -/** - * @brief Apply an action to every elements in the list. - * The action can be anything that doesn't destroy the element. - * - * @param linked_list Pointer to an linked list - * @param action Action to apply - * @param args Argument to pass to the action in the form of a va_list - * - * @return EXIT_SUCCESS, EXIT_FAILURE on error. -*/ -int linked_list_for_eachv(const linked_list_t *linked_list, const action_t action, va_list args); +int linked_list_for_each(const linked_list_t *linked_list, const action_t action, void *arg); /** * @brief Do an insertion sort data of the given linked list. @@ -290,6 +278,6 @@ int linked_list_for_eachv(const linked_list_t *linked_list, const action_t actio * * @return EXIT_SUCCESS, EXIT_FAILURE on error. */ -void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, ...); +void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, void *arg); #endif // LINKED_LIST_H diff --git a/src/linked_list.c b/src/linked_list.c index 8d818df..5979ca2 100644 --- a/src/linked_list.c +++ b/src/linked_list.c @@ -329,14 +329,11 @@ int linked_list_remove(linked_list_t *linked_list, elem_t *elem) return EXIT_SUCCESS; } -elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, ...) +elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t condition, void *arg) { assert("Linked list cannot be NULL" && linked_list); assert("Condition cannot be NULL" && condition); - va_list args; - va_start(args, condition); - elem_t *current_elem = linked_list->first; elem_t *next_elem; @@ -344,35 +341,22 @@ elem_t *linked_list_get_if(const linked_list_t *linked_list, const condition_t c { next_elem = current_elem->next; - va_list args_copy; - va_copy(args_copy, args); - - if(condition(current_elem, args_copy)) + if(condition(current_elem, arg)) { - va_end(args_copy); - va_end(args); - return current_elem; } - va_end(args_copy); - current_elem = next_elem; } - va_end(args); - return NULL; } -int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, ...) +int linked_list_remove_if(linked_list_t *linked_list, const condition_t condition, void *arg) { assert("Linked list cannot be NULL" && linked_list); assert("Condition cannot be NULL" && condition); - va_list args; - va_start(args, condition); - elem_t *actual_elem = linked_list->first; elem_t *next_elem; @@ -380,64 +364,21 @@ int linked_list_remove_if(linked_list_t *linked_list, const condition_t conditio { next_elem = actual_elem->next; - va_list args_copy; - va_copy(args_copy, args); - - if(condition(actual_elem, args_copy)) + if(condition(actual_elem, arg)) { if(linked_list_remove(linked_list, actual_elem)) { - va_end(args_copy); - va_end(args); - return_failure_int; } } - va_end(args_copy); - actual_elem = next_elem; } - va_end(args); - return EXIT_SUCCESS; } -int linked_list_for_each(const linked_list_t *linked_list, const action_t action, ...) -{ - assert("Linked list cannot be NULL" && linked_list); - assert("Action cannot be NULL" && action); - - va_list args; - va_start(args, action); - - elem_t *current_elem = linked_list->first; - - while(current_elem) - { - va_list args_copy; - va_copy(args_copy, args); - - if(action(current_elem, args_copy)) - { - va_end(args_copy); - va_end(args); - - return_failure_int; - } - - va_end(args_copy); - - current_elem = current_elem->next; - } - - va_end(args); - - return EXIT_SUCCESS; -} - -int linked_list_for_eachv(const linked_list_t *linked_list, const action_t action, va_list args) +int linked_list_for_each(const linked_list_t *linked_list, const action_t action, void *arg) { assert("Linked list cannot be NULL" && linked_list); assert("Action cannot be NULL" && action); @@ -446,19 +387,11 @@ int linked_list_for_eachv(const linked_list_t *linked_list, const action_t actio while(current_elem) { - va_list args_copy; - va_copy(args_copy, args); - - if(action(current_elem, args_copy)) + if(action(current_elem, arg)) { - va_end(args_copy); - va_end(args); - return_failure_int; } - va_end(args_copy); - current_elem = current_elem->next; } @@ -472,14 +405,11 @@ static inline void swap_elems_data(elem_t *elem_a, elem_t *elem_b) elem_b->data = tmp_data; } -void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, ...) +void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t condition, void *arg) { assert("Linked list cannot be NULL" && linked_list); assert("Condition cannot be NULL" && condition); - va_list args; - va_start(args, condition); - elem_t *actual_elem = linked_list->first; elem_t *next_elem; @@ -487,18 +417,11 @@ void linked_list_insertion_sort(linked_list_t *linked_list, const condition_t co { next_elem = actual_elem->next; - va_list args_copy; - va_copy(args_copy, args); - - if(condition(actual_elem, args_copy)) + if(condition(actual_elem, arg)) { swap_elems_data(actual_elem, next_elem); } - va_end(args_copy); - actual_elem = next_elem; } - - va_end(args); }