implementation.c
1 // SPDX-FileCopyrightText: 2026 Le'Core collective 2 // 3 // SPDX-License-Identifier: LGPL-3.0-or-later 4 5 #include <time.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <stdarg.h> 9 #include <string.h> 10 #include <lecore/environment.h> 11 #include <lecore/plugin.h> 12 #include "hashmap.h" 13 14 #ifdef TEST_IMPLEMENTATION 15 16 #define LeCore_st something_st 17 #define LeCore_t something_t 18 #define LeCore_dispatch_fn something_dispatch_fn 19 #define LeCore_get_documentation get_something_documentation 20 #define LeCore_get_documentation_args get_something_documentation_args 21 #define LeCore_NR_get_documentation NR_get_something_documentation 22 #define LE_CORE_IMPL_GET_DOCUMENTATION 23 #include <lecore/core.inc> 24 25 #define LeCore_t something_t 26 #define LeCore_class "TEST::" 27 #define LeCore_implementation_t something_implementation_t 28 #define LeCore_implementation_dispatch_fn something_dispatch_fn 29 #define LeCore_register_implementation register_something 30 #define LeCore_register_implementation_args register_something_args 31 #define LeCore_NR_register_implementation NR_register_something 32 #define LeCore_deregister_implementation deregister_something 33 #define LeCore_deregister_implementation_args deregister_something_args 34 #define LeCore_NR_deregister_implementation NR_deregister_something 35 #define LeCore_find_implementation find_something 36 #define LeCore_find_implementation_args find_something_args 37 #define LeCore_NR_find_implementation NR_find_something 38 #define LeCore_do_all_implementations_callback_fn do_all_something_callback_fn 39 #define LeCore_do_all_implementations do_all_something 40 #define LeCore_do_all_implementations_args do_all_something_args 41 #define LeCore_NR_do_all_implementations NR_do_all_something 42 #define LeCore_init_implementation_bag init_something_bag 43 #define LeCore_create_implementation_bag create_something_bag 44 #include <lecore/implementation.inc> 45 46 #define LeCore_t something_t 47 #define LeCore_class "TEST::" 48 #define LeCore_implementation_t something_implementation_t 49 #define implementation_bag_data_t something_bag_data_t 50 #define implementation_data_t something_data_t 51 #define hash_implementation_data hash_something_data 52 #define compare_implementation_data compare_something_data 53 #define implementation_bag_dispatch something_bag_dispatch 54 #define LeCore_NR_register_implementation NR_register_something 55 #define LeCore_register_implementation_args register_something_args 56 #define LeCore_NR_deregister_implementation NR_deregister_something 57 #define LeCore_deregister_implementation_args deregister_something_args 58 #define LeCore_NR_find_implementation NR_find_something 59 #define LeCore_find_implementation_args find_something_args 60 #define LeCore_NR_do_all_implementation NR_do_all_something 61 #define LeCore_do_all_implementation_callback_fn do_all_something_callback_fn 62 #define LeCore_do_all_implementation_args do_all_something_args 63 #define LeCore_init_implementation_bag init_something_bag 64 #define LeCore_create_implementation_bag create_something_bag 65 #include <lecore/implementation_impl.inc> 66 67 static LE_STATUS something_dispatch(something_t data, int num, ...) {} 68 static LE_STATUS something_print(const char *class, 69 something_implementation_t impl, 70 void *user_arg, LeCore_env_t env) { 71 printf("FOUND %s : %s", class, impl.le_id); 72 printf(" ["); 73 if (impl.le_plugin.le_data) 74 printf("plugin: %p", (void *)impl.le_plugin.le_data); 75 else 76 printf("built in"); 77 if (env.le_data) 78 printf(", env: %p]", env.le_data); 79 else 80 printf(", env-independent]"); 81 printf("]\n"); 82 #if 0 83 LeCore_get 84 if (docstring) 85 printf("--BEGIN DOCS--\n%s\n--END DOCS--\n", docstring); 86 #endif 87 return LE_STS_SUCCESS; 88 } 89 90 int main() 91 { 92 LeCore_env_t env; 93 something_implementation_t impl; 94 LE_STATUS sts; 95 int e = 0; 96 97 // Setup 98 if (!LE_status_is_OK(sts = LeCore_create_environment(&env)) 99 || !LE_status_is_OK(sts = init_something_bag(env))) 100 e++; 101 102 // Add an implementation 103 impl = (something_implementation_t){{ NULL, }, 104 "something1", 105 something_dispatch, 106 NULL}; 107 108 sts = register_something(env, impl); 109 if (!LE_status_is_OK(sts)) 110 e++; 111 112 // Find the same implementation, and check it 113 sts = find_something(env, "something1", &impl); 114 if (!LE_status_is_OK(sts) || impl.le_dispatch != something_dispatch) 115 e++; 116 117 // Try printing 118 sts = do_all_something(env, something_print, NULL); 119 if (!LE_status_is_OK(sts)) 120 e++; 121 122 // Cleanup 123 if (!LE_status_is_OK(sts = LeCore_destroy_environment(&env))) 124 e++; 125 126 exit(e); 127 } 128 129 #endif