From de45b760b5569dcc9ce5eef3853c5f53c60dd542 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 28 Jul 2025 15:39:38 +0300 Subject: [PATCH] LibC: Implement alphasort and scandir --- userspace/libraries/LibC/dirent.cpp | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/userspace/libraries/LibC/dirent.cpp b/userspace/libraries/LibC/dirent.cpp index 78e42815..58818416 100644 --- a/userspace/libraries/LibC/dirent.cpp +++ b/userspace/libraries/LibC/dirent.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -109,3 +110,54 @@ void rewinddir(DIR* dirp) dirp->entry_index = 0; lseek(dirp->fd, 0, SEEK_SET); } + +int alphasort(const struct dirent** d1, const struct dirent** d2) +{ + return strcoll((*d1)->d_name, (*d2)->d_name); +} + +int scandir(const char* dir, struct dirent*** namelist, int (*sel)(const struct dirent*), int (*compar)(const struct dirent**, const struct dirent**)) +{ + DIR* dirp = opendir(dir); + if (dirp == nullptr) + return -1; + + size_t count = 0; + dirent** list = nullptr; + + dirent* dent; + while ((dent = readdir(dirp))) + { + if (sel && sel(dent) == 0) + continue; + + void* new_list = realloc(list, (count + 1) * sizeof(dirent*)); + if (new_list == nullptr) + goto scandir_error; + + list = static_cast(new_list); + list[count] = static_cast(malloc(sizeof(dirent))); + if (list[count] == nullptr) + goto scandir_error; + + memcpy(list[count], dent, sizeof(dirent)); + count++; + } + + closedir(dirp); + + qsort(list, count, sizeof(dirent*), reinterpret_cast(compar)); + + *namelist = list; + return count; + +scandir_error: + closedir(dirp); + + for (size_t i = 0; i < count; i++) + free(list[i]); + free(list); + + *namelist = nullptr; + return -1; +}