diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-23 23:58:30 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-23 23:58:30 +0330 |
commit | 3c9aea642e3b2f4083705f1cd42fa911d35ee696 (patch) | |
tree | d990b2ffdb63161a9aef7cce20e5714461f86085 /src/utils | |
parent | 093c3bece426686b175db9ddaecd6abc8908fd87 (diff) |
add way to call C functions
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/dl.c | 66 | ||||
-rw-r--r-- | src/utils/dl.h | 8 |
2 files changed, 74 insertions, 0 deletions
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 <dlfcn.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> + +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 <stddef.h> + +void dynamicLibraryInit(); +void dynamicLibraryDestroy(); + +void* dynamicLibraryOpen(char *file); |