composite_resolver.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "composite_resolver.h"
  2. #include <m-list.h>
  3. #include <m-algo.h>
  4. LIST_DEF(ElfApiInterfaceList, const ElfApiInterface*, M_POD_OPLIST)
  5. #define M_OPL_ElfApiInterfaceList_t() LIST_OPLIST(ElfApiInterfaceList, M_POD_OPLIST)
  6. struct CompositeApiResolver {
  7. ElfApiInterface api_interface;
  8. ElfApiInterfaceList_t interfaces;
  9. };
  10. static bool composite_api_resolver_callback(
  11. const ElfApiInterface* interface,
  12. const char* name,
  13. Elf32_Addr* address) {
  14. CompositeApiResolver* resolver = (CompositeApiResolver*)interface;
  15. for
  16. M_EACH(interface, resolver->interfaces, ElfApiInterfaceList_t) {
  17. if((*interface)->resolver_callback(*interface, name, address)) {
  18. return true;
  19. }
  20. }
  21. return false;
  22. }
  23. CompositeApiResolver* composite_api_resolver_alloc() {
  24. CompositeApiResolver* resolver = malloc(sizeof(CompositeApiResolver));
  25. resolver->api_interface.api_version_major = 0;
  26. resolver->api_interface.api_version_minor = 0;
  27. resolver->api_interface.resolver_callback = &composite_api_resolver_callback;
  28. ElfApiInterfaceList_init(resolver->interfaces);
  29. return resolver;
  30. }
  31. void composite_api_resolver_free(CompositeApiResolver* resolver) {
  32. ElfApiInterfaceList_clear(resolver->interfaces);
  33. free(resolver);
  34. }
  35. void composite_api_resolver_add(CompositeApiResolver* resolver, const ElfApiInterface* interface) {
  36. if(ElfApiInterfaceList_empty_p(resolver->interfaces)) {
  37. resolver->api_interface.api_version_major = interface->api_version_major;
  38. resolver->api_interface.api_version_minor = interface->api_version_minor;
  39. }
  40. ElfApiInterfaceList_push_back(resolver->interfaces, interface);
  41. }
  42. const ElfApiInterface* composite_api_resolver_get(CompositeApiResolver* resolver) {
  43. return &resolver->api_interface;
  44. }