//////////////////////////////// // TODO(allen): Write commentary for all of this. #define MAX_PATH 260 typedef unsigned long DWORD; typedef unsigned short WORD; typedef int BOOL; typedef void *HANDLE; typedef char CHAR; typedef const CHAR *LPCSTR; typedef struct _FILETIME _FILETIME; struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; }; typedef _FILETIME FILETIME; typedef _FILETIME *PFILETIME; typedef _FILETIME *LPFILETIME; typedef struct _WIN32_FIND_DATAA _WIN32_FIND_DATAA; struct _WIN32_FIND_DATAA { #define FILE_ATTRIBUTE_DIRECTORY 0x10 DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; CHAR cFileName[MAX_PATH]; CHAR cAlternateFileName[14]; DWORD dwFileType; DWORD dwCreatorType; WORD wFinderFlags; }; typedef _WIN32_FIND_DATAA WIN32_FIND_DATAA; typedef _WIN32_FIND_DATAA *PWIN32_FIND_DATAA; typedef _WIN32_FIND_DATAA *LPWIN32_FIND_DATAA; MD_C_LINKAGE_BEGIN HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); MD_C_LINKAGE_END #pragma comment(lib, "User32.lib") #define MD_IMPL_FileIterIncrement MD_WIN32_FileIterIncrement static MD_b32 MD_WIN32_FileIterIncrement(MD_FileIter *it, MD_String8 path, MD_FileInfo *out_info) { MD_b32 result = 0; WIN32_FIND_DATAA find_data = {0}; HANDLE state = *(HANDLE *)(&it->state); if(state == 0) { MD_b32 need_star = 0; if(path.str[path.size-1] == '/' || path.str[path.size-1] == '\\') { need_star = 1; } MD_String8 cpath = need_star ? MD_PushStringF("%.*s*", MD_StringExpand(path)) : path; state = FindFirstFileA((char*)cpath.str, &find_data); result = !!state; } else { result = !!FindNextFileA(state, &find_data); } it->state = *(MD_u64 *)(&state); if(result) { out_info->flags = 0; if(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { out_info->flags |= MD_FileFlag_Directory; } out_info->filename = MD_PushStringF("%s", find_data.cFileName); out_info->file_size = ((((MD_u64)find_data.nFileSizeHigh) << 32) | ((MD_u64)find_data.nFileSizeLow)); } return result; }