diff options
Diffstat (limited to 'src/common.cpp')
| -rw-r--r-- | src/common.cpp | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/src/common.cpp b/src/common.cpp index 8a220c799..9497aaf18 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -868,76 +868,77 @@ enum MemoryMappedFileError { MemoryMappedFile_COUNT, }; -MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile *memory_mapped_file) { +MemoryMappedFileError memory_map_file_32(char const *fullpath, MemoryMappedFile *memory_mapped_file, bool copy_file_contents) { MemoryMappedFileError err = MemoryMappedFile_None; -#if defined(GB_SYSTEM_WINDOWS) - isize w_len = 0; - wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len); - if (w_str == nullptr) { - return MemoryMappedFile_Invalid; - } - i64 file_size = 0; - LARGE_INTEGER li_file_size = {}; - HANDLE handle = nullptr; - HANDLE file_mapping = nullptr; - void *file_data = nullptr; - - handle = CreateFileW(w_str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); - if (handle == INVALID_HANDLE_VALUE) { - handle = nullptr; - goto window_handle_file_error; - } - - li_file_size = {}; - if (!GetFileSizeEx(handle, &li_file_size)) { - goto window_handle_file_error; - } - file_size = cast(i64)li_file_size.QuadPart; - if (file_size > I32_MAX) { - CloseHandle(handle); - return MemoryMappedFile_FileTooLarge; - } - - if (file_size == 0) { + if (!copy_file_contents) { + #if defined(GB_SYSTEM_WINDOWS) + isize w_len = 0; + wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len); + if (w_str == nullptr) { + return MemoryMappedFile_Invalid; + } + i64 file_size = 0; + LARGE_INTEGER li_file_size = {}; + HANDLE handle = nullptr; + HANDLE file_mapping = nullptr; + void *file_data = nullptr; + + handle = CreateFileW(w_str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (handle == INVALID_HANDLE_VALUE) { + handle = nullptr; + goto window_handle_file_error; + } + + li_file_size = {}; + if (!GetFileSizeEx(handle, &li_file_size)) { + goto window_handle_file_error; + } + file_size = cast(i64)li_file_size.QuadPart; + if (file_size > I32_MAX) { + CloseHandle(handle); + return MemoryMappedFile_FileTooLarge; + } + + if (file_size == 0) { + CloseHandle(handle); + err = MemoryMappedFile_Empty; + memory_mapped_file->handle = nullptr; + memory_mapped_file->data = nullptr; + memory_mapped_file->size = 0; + return err; + } + + file_mapping = CreateFileMappingW(handle, nullptr, PAGE_READONLY, 0, 0, nullptr); CloseHandle(handle); - err = MemoryMappedFile_Empty; - memory_mapped_file->handle = nullptr; - memory_mapped_file->data = nullptr; - memory_mapped_file->size = 0; + + file_data = MapViewOfFileEx(file_mapping, FILE_MAP_READ, 0, 0, 0/*file_size*/, nullptr/*base address*/); + memory_mapped_file->handle = cast(void *)file_mapping; + memory_mapped_file->data = file_data; + memory_mapped_file->size = cast(i32)file_size; return err; - } - - file_mapping = CreateFileMappingW(handle, nullptr, PAGE_READONLY, 0, 0, nullptr); - CloseHandle(handle); - - file_data = MapViewOfFileEx(file_mapping, FILE_MAP_READ, 0, 0, 0/*file_size*/, nullptr/*base address*/); - memory_mapped_file->handle = cast(void *)file_mapping; - memory_mapped_file->data = file_data; - memory_mapped_file->size = cast(i32)file_size; - return err; -window_handle_file_error:; - { - DWORD handle_err = GetLastError(); - CloseHandle(handle); - err = MemoryMappedFile_Invalid; - switch (handle_err) { - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: - case ERROR_INVALID_DRIVE: - err = MemoryMappedFile_NotExists; - break; - case ERROR_ACCESS_DENIED: - case ERROR_INVALID_ACCESS: - err = MemoryMappedFile_Permission; - break; + window_handle_file_error:; + { + DWORD handle_err = GetLastError(); + CloseHandle(handle); + err = MemoryMappedFile_Invalid; + switch (handle_err) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_DRIVE: + err = MemoryMappedFile_NotExists; + break; + case ERROR_ACCESS_DENIED: + case ERROR_INVALID_ACCESS: + err = MemoryMappedFile_Permission; + break; + } + return err; } - return err; + #endif } -#else - // TODO(bill): Memory map rather than copy contents gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath); if (fc.size > I32_MAX) { @@ -963,7 +964,6 @@ window_handle_file_error:; } } return err; -#endif } |