#ifndef DATGPT_WIN_DIRENT_H #define DATGPT_WIN_DIRENT_H #ifdef _WIN32 #include #include #include #include #include #define NAME_MAX MAX_PATH typedef struct dirent { char d_name[MAX_PATH]; } struct_dirent_t; typedef struct dat_win_dir { HANDLE handle; WIN32_FIND_DATAA data; int first; struct dirent entry; } DIR; static DIR *dat_opendir(const char *path) { DIR *dir = (DIR *)calloc(1, sizeof(*dir)); char pattern[MAX_PATH * 2]; int n; if (!dir) return NULL; n = snprintf(pattern, sizeof(pattern), "%s\\*", path); if (n < 0 || (size_t)n >= sizeof(pattern)) { free(dir); errno = ENAMETOOLONG; return NULL; } dir->handle = FindFirstFileA(pattern, &dir->data); if (dir->handle == INVALID_HANDLE_VALUE) { free(dir); errno = ENOENT; return NULL; } dir->first = 1; return dir; } static struct dirent *dat_readdir(DIR *dir) { if (!dir) return NULL; if (dir->first) dir->first = 0; else if (!FindNextFileA(dir->handle, &dir->data)) return NULL; strncpy(dir->entry.d_name, dir->data.cFileName, sizeof(dir->entry.d_name) - 1); dir->entry.d_name[sizeof(dir->entry.d_name) - 1] = 0; return &dir->entry; } static int dat_closedir(DIR *dir) { int rc; if (!dir) { errno = EINVAL; return -1; } rc = FindClose(dir->handle) ? 0 : -1; free(dir); return rc; } #define opendir dat_opendir #define readdir dat_readdir #define closedir dat_closedir #else #include #endif #endif