mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Force file copy on odin strip-semicolon
This commit is contained in:
+65
-65
@@ -868,76 +868,77 @@ enum MemoryMappedFileError {
|
|||||||
MemoryMappedFile_COUNT,
|
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;
|
MemoryMappedFileError err = MemoryMappedFile_None;
|
||||||
|
|
||||||
#if defined(GB_SYSTEM_WINDOWS)
|
if (!copy_file_contents) {
|
||||||
isize w_len = 0;
|
#if defined(GB_SYSTEM_WINDOWS)
|
||||||
wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len);
|
isize w_len = 0;
|
||||||
if (w_str == nullptr) {
|
wchar_t *w_str = gb__alloc_utf8_to_ucs2(temporary_allocator(), fullpath, &w_len);
|
||||||
return MemoryMappedFile_Invalid;
|
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);
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
|
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;
|
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;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
// TODO(bill): Memory map rather than copy contents
|
|
||||||
gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath);
|
gbFileContents fc = gb_file_read_contents(heap_allocator(), true, fullpath);
|
||||||
|
|
||||||
if (fc.size > I32_MAX) {
|
if (fc.size > I32_MAX) {
|
||||||
@@ -963,7 +964,6 @@ window_handle_file_error:;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -4645,7 +4645,8 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) {
|
|||||||
zero_item(&f->tokenizer);
|
zero_item(&f->tokenizer);
|
||||||
f->tokenizer.curr_file_id = f->id;
|
f->tokenizer.curr_file_id = f->id;
|
||||||
|
|
||||||
TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath);
|
bool copy_file_contents = build_context.command_kind == Command_strip_semicolon;
|
||||||
|
TokenizerInitError err = init_tokenizer_from_fullpath(&f->tokenizer, f->fullpath, copy_file_contents);
|
||||||
if (err != TokenizerInit_None) {
|
if (err != TokenizerInit_None) {
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case TokenizerInit_Empty:
|
case TokenizerInit_Empty:
|
||||||
|
|||||||
+6
-4
@@ -722,6 +722,8 @@ struct Tokenizer {
|
|||||||
i32 error_count;
|
i32 error_count;
|
||||||
|
|
||||||
bool insert_semicolon;
|
bool insert_semicolon;
|
||||||
|
|
||||||
|
MemoryMappedFile memory_mapped_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -811,17 +813,17 @@ TokenizerInitError memory_mapped_file_error_map_to_tokenizer[MemoryMappedFile_CO
|
|||||||
TokenizerInit_Permission, /*MemoryMappedFile_Permission*/
|
TokenizerInit_Permission, /*MemoryMappedFile_Permission*/
|
||||||
};
|
};
|
||||||
|
|
||||||
TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath) {
|
TokenizerInitError init_tokenizer_from_fullpath(Tokenizer *t, String const &fullpath, bool copy_file_contents) {
|
||||||
MemoryMappedFile memory_mapped_file = {};
|
|
||||||
MemoryMappedFileError mmf_err = memory_map_file_32(
|
MemoryMappedFileError mmf_err = memory_map_file_32(
|
||||||
alloc_cstring(temporary_allocator(), fullpath),
|
alloc_cstring(temporary_allocator(), fullpath),
|
||||||
&memory_mapped_file
|
&t->memory_mapped_file,
|
||||||
|
copy_file_contents
|
||||||
);
|
);
|
||||||
|
|
||||||
TokenizerInitError err = memory_mapped_file_error_map_to_tokenizer[mmf_err];
|
TokenizerInitError err = memory_mapped_file_error_map_to_tokenizer[mmf_err];
|
||||||
switch (mmf_err) {
|
switch (mmf_err) {
|
||||||
case MemoryMappedFile_None:
|
case MemoryMappedFile_None:
|
||||||
init_tokenizer_with_data(t, fullpath, memory_mapped_file.data, cast(isize)memory_mapped_file.size);
|
init_tokenizer_with_data(t, fullpath, t->memory_mapped_file.data, cast(isize)t->memory_mapped_file.size);
|
||||||
break;
|
break;
|
||||||
case MemoryMappedFile_FileTooLarge:
|
case MemoryMappedFile_FileTooLarge:
|
||||||
case MemoryMappedFile_Empty:
|
case MemoryMappedFile_Empty:
|
||||||
|
|||||||
Reference in New Issue
Block a user