From 3c9aea642e3b2f4083705f1cd42fa911d35ee696 Mon Sep 17 00:00:00 2001 From: A404M Date: Fri, 23 May 2025 23:58:30 +0330 Subject: add way to call C functions --- src/utils/dl.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils/dl.h | 8 +++++++ 2 files changed, 74 insertions(+) create mode 100644 src/utils/dl.c create mode 100644 src/utils/dl.h (limited to 'src/utils') diff --git a/src/utils/dl.c b/src/utils/dl.c new file mode 100644 index 0000000..1a1c430 --- /dev/null +++ b/src/utils/dl.c @@ -0,0 +1,66 @@ +#include "dl.h" +#include "utils/memory.h" +#include "utils/string.h" +#include +#include +#include +#include + +void **dynamicLibraries; +char **dynamicLibraries_str; +size_t dynamicLibraries_length; +size_t dynamicLibraries_capacity; + +void dynamicLibraryInit() { + dynamicLibraries = a404m_malloc(0); + dynamicLibraries_str = a404m_malloc(0); + dynamicLibraries_length = 0; + dynamicLibraries_capacity = 0; +} + +void dynamicLibraryDestroy() { + for (size_t i = 0; i < dynamicLibraries_length; ++i) { + dlclose(dynamicLibraries[i]); + free(dynamicLibraries_str[i]); + } + free(dynamicLibraries); + free(dynamicLibraries_str); +} + +void *dynamicLibraryOpen(char *file) { + for (size_t i = 0; i < dynamicLibraries_length; ++i) { + if (strEquals(file, dynamicLibraries_str[i])) { + return dynamicLibraries[i]; + } + } + + void *dl = dlopen(file, RTLD_LAZY); + if (dl == NULL) { + fputs(dlerror(), stderr); + return NULL; + } + + if (dynamicLibraries_capacity == dynamicLibraries_length) { + dynamicLibraries_capacity += dynamicLibraries_capacity / 2 + 1; + dynamicLibraries_str = + a404m_realloc(dynamicLibraries_str, sizeof(*dynamicLibraries_str) * + dynamicLibraries_capacity); + dynamicLibraries = + a404m_realloc(dynamicLibraries, + sizeof(*dynamicLibraries) * dynamicLibraries_capacity); + } + dynamicLibraries[dynamicLibraries_length] = dl; + + const size_t file_length = strLength(file); + dynamicLibraries_str[dynamicLibraries_length] = + a404m_malloc(sizeof(**dynamicLibraries) * (file_length + 1)); + + for (size_t i = 0; i < file_length; ++i) { + dynamicLibraries_str[dynamicLibraries_length][i] = file[i]; + } + dynamicLibraries_str[dynamicLibraries_length][file_length] = '\0'; + + dynamicLibraries_length += 1; + + return dl; +} diff --git a/src/utils/dl.h b/src/utils/dl.h new file mode 100644 index 0000000..74cb865 --- /dev/null +++ b/src/utils/dl.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +void dynamicLibraryInit(); +void dynamicLibraryDestroy(); + +void* dynamicLibraryOpen(char *file); -- cgit v1.2.3