aboutsummaryrefslogtreecommitdiff
path: root/src/utils/dl.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-23 23:58:30 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-23 23:58:30 +0330
commit3c9aea642e3b2f4083705f1cd42fa911d35ee696 (patch)
treed990b2ffdb63161a9aef7cce20e5714461f86085 /src/utils/dl.c
parent093c3bece426686b175db9ddaecd6abc8908fd87 (diff)
add way to call C functions
Diffstat (limited to 'src/utils/dl.c')
-rw-r--r--src/utils/dl.c66
1 files changed, 66 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;
+}