Minor image acquire/present refactor Unsigned integer limits Fixed typo in arena push/push copy macro
87 lines
2.0 KiB
C
87 lines
2.0 KiB
C
OS_Handle FS_FileOpen(Str8 path, FS_AccessFlags access) {
|
|
OS_Handle result = { 0 };
|
|
|
|
M_TempScope(0, 0) {
|
|
Str8 wpath = Win32_WideStr(temp.arena, path);
|
|
|
|
DWORD dwAccess = 0;
|
|
DWORD dwShare = FILE_SHARE_READ;
|
|
DWORD dwCreate = OPEN_EXISTING;
|
|
|
|
if (access & FS_ACCESS_WRITE) {
|
|
dwCreate = CREATE_ALWAYS;
|
|
dwAccess = GENERIC_WRITE;
|
|
}
|
|
|
|
if (access & FS_ACCESS_READ) {
|
|
dwAccess |= GENERIC_READ;
|
|
}
|
|
|
|
HANDLE hFile = CreateFileW((LPCWSTR) wpath.data, dwAccess, dwShare, 0, dwCreate, 0, 0);
|
|
|
|
result.v[0] = (hFile == INVALID_HANDLE_VALUE) ? 0 : ((U64) hFile);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void FS_FileClose(OS_Handle file) {
|
|
HANDLE hFile = cast(HANDLE) file.v[0];
|
|
if (hFile) {
|
|
CloseHandle(hFile);
|
|
}
|
|
}
|
|
|
|
void FS_FileRead(OS_Handle file, void *ptr, U64 size, U64 offset) {
|
|
HANDLE hFile = cast(HANDLE) file.v[0];
|
|
if (hFile) {
|
|
U8 *buffer = ptr;
|
|
U64 current = offset;
|
|
U64 remainder = size;
|
|
|
|
while (remainder != 0) {
|
|
OVERLAPPED overlapped = { 0 };
|
|
overlapped.Offset = cast(DWORD) (current & 0xFFFFFFFF);
|
|
overlapped.OffsetHigh = cast(DWORD) ((current >> 32) & 0xFFFFFFFF);
|
|
|
|
DWORD toread = (remainder > U32_MAX) ? U32_MAX : (DWORD) remainder;
|
|
DWORD nread = 0;
|
|
|
|
if (!ReadFile(hFile, buffer, toread, &nread, &overlapped)) {
|
|
break;
|
|
}
|
|
|
|
buffer += nread;
|
|
current += nread;
|
|
remainder -= nread;
|
|
}
|
|
}
|
|
}
|
|
|
|
void FS_FileWrite(OS_Handle file, void *ptr, U64 size, U64 offset) {
|
|
HANDLE hFile = cast(HANDLE) file.v[0];
|
|
if (hFile) {
|
|
U8 *buffer = ptr;
|
|
U64 current = offset;
|
|
U64 remainder = size;
|
|
|
|
while (remainder != 0) {
|
|
OVERLAPPED overlapped = { 0 };
|
|
overlapped.Offset = cast(DWORD) (current & 0xFFFFFFFF);
|
|
overlapped.OffsetHigh = cast(DWORD) ((current >> 32) & 0xFFFFFFFF);
|
|
|
|
DWORD towrite = (remainder > U32_MAX) ? U32_MAX : (DWORD) remainder;
|
|
DWORD nwritten = 0;
|
|
|
|
if (!WriteFile(hFile, buffer, towrite, &nwritten, &overlapped)) {
|
|
break;
|
|
}
|
|
|
|
buffer += nwritten;
|
|
current += nwritten;
|
|
remainder -= nwritten;
|
|
}
|
|
}
|
|
}
|
|
|
|
|