From a0c9cdb5774481b97ae23abcd5d62e9819d87ae3 Mon Sep 17 00:00:00 2001 From: anth64 Date: Sun, 2 Nov 2025 13:55:09 +0100 Subject: [PATCH] Windows implementation for platform_directory_init_scan --- src/platform.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/platform.c b/src/platform.c index e54f80d..b1d2e29 100644 --- a/src/platform.c +++ b/src/platform.c @@ -281,9 +281,68 @@ char **platform_directory_init_scan(const char *path, size_t *out_count) strcpy(file_list[index], entry->d_name); ++index; } + closedir(dir); #elif defined(_WIN32) - return NULL; + WIN32_FIND_DATAW find_data; + HANDLE find_handle; + WCHAR search_path[PATH_BUFFER_SIZE]; + int utf8_len; + + swprintf(search_path, PATH_BUFFER_SIZE, L"%S\\*", path); + + find_handle = FindFirstFileW(search_path, &find_data); + if (find_handle == INVALID_HANDLE_VALUE) { + *out_count = 0; + return NULL; + } + + do { + if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + count++; + } while (FindNextFileW(find_handle, &find_data)); + + FindClose(find_handle); + + if (count == 0) { + *out_count = 0; + return NULL; + } + + find_handle = FindFirstFileW(search_path, &find_data); + if (find_handle == INVALID_HANDLE_VALUE) { + *out_count = 0; + return NULL; + } + + file_list = (char **)malloc(count * sizeof(char *)); + if (!file_list) { + FindClose(find_handle); + *out_count = 0; + return NULL; + } + + do { + if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + index < count) { + utf8_len = + WideCharToMultiByte(CP_UTF8, 0, find_data.cFileName, + -1, NULL, 0, NULL, NULL); + if (utf8_len > 0) { + file_list[index] = (char *)malloc(utf8_len); + if (file_list[index]) { + WideCharToMultiByte( + CP_UTF8, 0, find_data.cFileName, -1, + file_list[index], utf8_len, NULL, + NULL); + index++; + } + } + } + } while (FindNextFileW(find_handle, &find_data) && index < count); + + FindClose(find_handle); + #else return NULL; #endif