mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-05 23:28:45 +00:00
Initial upload
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
////////////////////////////////
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user