diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-16 11:35:13 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-16 11:35:13 +0100 |
| commit | fa11368599d2c21c814a61b6254604fa8d3cb2e7 (patch) | |
| tree | c8173a9ba153bf6cdde817d15f810d14f371ddc3 /src/librarian | |
| parent | f4fd01c77705b31c4525e66dcbc7dfe966456006 (diff) | |
| download | box64-fa11368599d2c21c814a61b6254604fa8d3cb2e7.tar.gz box64-fa11368599d2c21c814a61b6254604fa8d3cb2e7.zip | |
[ELFLOADER] Improved inter-library dependancie managment
Diffstat (limited to 'src/librarian')
| -rw-r--r-- | src/librarian/library.c | 33 |
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*)); |