/ src / implementation.c
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