about summary refs log tree commit diff stats
path: root/src/librarian
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-16 11:35:13 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-16 11:35:13 +0100
commitfa11368599d2c21c814a61b6254604fa8d3cb2e7 (patch)
treec8173a9ba153bf6cdde817d15f810d14f371ddc3 /src/librarian
parentf4fd01c77705b31c4525e66dcbc7dfe966456006 (diff)
downloadbox64-fa11368599d2c21c814a61b6254604fa8d3cb2e7.tar.gz
box64-fa11368599d2c21c814a61b6254604fa8d3cb2e7.zip
[ELFLOADER] Improved inter-library dependancie managment
Diffstat (limited to 'src/librarian')
-rw-r--r--src/librarian/library.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/librarian/library.c b/src/librarian/library.c
index e7ca6bd5..6d888fdc 100644
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -1056,6 +1056,7 @@ needed_libs_t* new_neededlib(int n)
 {
     needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t));
     ret->cap = ret->size = n;
+    ret->init_size = n;
     ret->libs = (library_t**)calloc(n, sizeof(library_t*));
     ret->names = (char**)calloc(n, sizeof(char*));
     return ret;
@@ -1081,6 +1082,7 @@ void add1_neededlib(needed_libs_t* needed)
     needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
     needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
     needed->size++;
+    needed->init_size++;
 }
 void add1lib_neededlib(needed_libs_t* needed, library_t* lib, const char* name)
 {
@@ -1091,14 +1093,34 @@ void add1lib_neededlib(needed_libs_t* needed, library_t* lib, const char* name)
         if(needed->libs[i]==lib)
             return;
     // add it
-    if(needed->size+1<=needed->cap)
-        return;
-    needed->cap = needed->size+1;
-    needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
-    needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+    if(needed->size==needed->cap) {
+        needed->cap = needed->size+1;
+        needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
+        needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+    }
     needed->libs[needed->size] = lib;
     needed->names[needed->size] = (char*)name;
     needed->size++;
+    needed->init_size++;
+}
+void add1libref_neededlib(needed_libs_t* needed, library_t* lib)
+{
+    if(!needed || !lib)
+        return;
+    // check if lib is already present
+    for (int i=0; i<needed->size; ++i)
+        if(needed->libs[i]==lib)
+            return;
+    // add it
+    if(needed->size==needed->cap) {
+        needed->cap = needed->size+4;
+        needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
+        needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+    }
+    needed->libs[needed->size] = lib;
+    needed->names[needed->size] = (char*)lib->name;
+    needed->size++;
+    IncRefCount(lib, NULL);
 }
 needed_libs_t* copy_neededlib(needed_libs_t* needed)
 {
@@ -1107,6 +1129,7 @@ needed_libs_t* copy_neededlib(needed_libs_t* needed)
     needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t));
     ret->cap = needed->cap;
     ret->size = needed->size;
+    ret->init_size = needed->init_size;
     ret->libs = (library_t**)calloc(ret->cap, sizeof(library_t*));
     ret->names = (char**)calloc(ret->cap, sizeof(char*));
     memcpy(ret->libs, needed->libs, ret->size*sizeof(library_t*));