diff --git a/4coder_api_transition_30_31.cpp b/4coder_api_transition_30_31.cpp index 7fa6a790..8a31ab27 100644 --- a/4coder_api_transition_30_31.cpp +++ b/4coder_api_transition_30_31.cpp @@ -547,7 +547,9 @@ get_file_list(Application_Links *app, char *dir, int32_t len){ static bool32 file_exists(Application_Links *app, char *file_name, int32_t len){ - return(file_exists(app, make_string(file_name, len))); + File_Attributes attributes = {}; + file_get_attributes(app, make_string(file_name, len), &attributes); + return(attributes.last_write_time > 0); } static bool32 diff --git a/4coder_auto_indent.cpp b/4coder_auto_indent.cpp index f323d8d4..ccec0e85 100644 --- a/4coder_auto_indent.cpp +++ b/4coder_auto_indent.cpp @@ -6,7 +6,7 @@ static Hard_Start_Result buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t line_start, int32_t tab_width){ - tab_width -= 1; + int32_t tab_additional_width = tab_width - 1; Hard_Start_Result result = {}; result.all_space = true; @@ -32,7 +32,7 @@ buffer_find_hard_start(Application_Links *app, Buffer_Summary *buffer, int32_t l } if (c == '\t'){ - result.indent_pos += tab_width; + result.indent_pos += tab_additional_width; } if (c != ' '){ diff --git a/4coder_generated/app_functions.h b/4coder_generated/app_functions.h index 637fb47d..a7f9e25e 100644 --- a/4coder_generated/app_functions.h +++ b/4coder_generated/app_functions.h @@ -122,7 +122,7 @@ struct Application_Links; #define MEMORY_ALLOCATE_SIG(n) void* n(Application_Links *app, int32_t size) #define MEMORY_SET_PROTECTION_SIG(n) bool32 n(Application_Links *app, void *ptr, int32_t size, Memory_Protect_Flags flags) #define MEMORY_FREE_SIG(n) void n(Application_Links *app, void *ptr, int32_t size) -#define FILE_EXISTS_SIG(n) bool32 n(Application_Links *app, String file_name) +#define FILE_GET_ATTRIBUTES_SIG(n) bool32 n(Application_Links *app, String file_name, File_Attributes *attributes_out) #define DIRECTORY_CD_SIG(n) bool32 n(Application_Links *app, String *directory, String relative_path) #define GET_4ED_PATH_SIG(n) bool32 n(Application_Links *app, String *path_out, int32_t *required_size_out) #define SHOW_MOUSE_CURSOR_SIG(n) void n(Application_Links *app, Mouse_Cursor_Show_Type show) @@ -259,7 +259,7 @@ typedef SET_GUI_UP_DOWN_KEYS_SIG(Set_GUI_Up_Down_Keys_Function); typedef MEMORY_ALLOCATE_SIG(Memory_Allocate_Function); typedef MEMORY_SET_PROTECTION_SIG(Memory_Set_Protection_Function); typedef MEMORY_FREE_SIG(Memory_Free_Function); -typedef FILE_EXISTS_SIG(File_Exists_Function); +typedef FILE_GET_ATTRIBUTES_SIG(File_Get_Attributes_Function); typedef DIRECTORY_CD_SIG(Directory_CD_Function); typedef GET_4ED_PATH_SIG(Get_4ed_Path_Function); typedef SHOW_MOUSE_CURSOR_SIG(Show_Mouse_Cursor_Function); @@ -398,7 +398,7 @@ Set_GUI_Up_Down_Keys_Function *set_gui_up_down_keys; Memory_Allocate_Function *memory_allocate; Memory_Set_Protection_Function *memory_set_protection; Memory_Free_Function *memory_free; -File_Exists_Function *file_exists; +File_Get_Attributes_Function *file_get_attributes; Directory_CD_Function *directory_cd; Get_4ed_Path_Function *get_4ed_path; Show_Mouse_Cursor_Function *show_mouse_cursor; @@ -536,7 +536,7 @@ Set_GUI_Up_Down_Keys_Function *set_gui_up_down_keys_; Memory_Allocate_Function *memory_allocate_; Memory_Set_Protection_Function *memory_set_protection_; Memory_Free_Function *memory_free_; -File_Exists_Function *file_exists_; +File_Get_Attributes_Function *file_get_attributes_; Directory_CD_Function *directory_cd_; Get_4ed_Path_Function *get_4ed_path_; Show_Mouse_Cursor_Function *show_mouse_cursor_; @@ -682,7 +682,7 @@ app_links->set_gui_up_down_keys_ = Set_GUI_Up_Down_Keys;\ app_links->memory_allocate_ = Memory_Allocate;\ app_links->memory_set_protection_ = Memory_Set_Protection;\ app_links->memory_free_ = Memory_Free;\ -app_links->file_exists_ = File_Exists;\ +app_links->file_get_attributes_ = File_Get_Attributes;\ app_links->directory_cd_ = Directory_CD;\ app_links->get_4ed_path_ = Get_4ed_Path;\ app_links->show_mouse_cursor_ = Show_Mouse_Cursor;\ @@ -820,7 +820,7 @@ static void set_gui_up_down_keys(Application_Links *app, Key_Code up_key, Key_Mo static void* memory_allocate(Application_Links *app, int32_t size){return(app->memory_allocate(app, size));} static bool32 memory_set_protection(Application_Links *app, void *ptr, int32_t size, Memory_Protect_Flags flags){return(app->memory_set_protection(app, ptr, size, flags));} static void memory_free(Application_Links *app, void *ptr, int32_t size){(app->memory_free(app, ptr, size));} -static bool32 file_exists(Application_Links *app, String file_name){return(app->file_exists(app, file_name));} +static bool32 file_get_attributes(Application_Links *app, String file_name, File_Attributes *attributes_out){return(app->file_get_attributes(app, file_name, attributes_out));} static bool32 directory_cd(Application_Links *app, String *directory, String relative_path){return(app->directory_cd(app, directory, relative_path));} static bool32 get_4ed_path(Application_Links *app, String *path_out, int32_t *required_size_out){return(app->get_4ed_path(app, path_out, required_size_out));} static void show_mouse_cursor(Application_Links *app, Mouse_Cursor_Show_Type show){(app->show_mouse_cursor(app, show));} @@ -958,7 +958,7 @@ static void set_gui_up_down_keys(Application_Links *app, Key_Code up_key, Key_Mo static void* memory_allocate(Application_Links *app, int32_t size){return(app->memory_allocate_(app, size));} static bool32 memory_set_protection(Application_Links *app, void *ptr, int32_t size, Memory_Protect_Flags flags){return(app->memory_set_protection_(app, ptr, size, flags));} static void memory_free(Application_Links *app, void *ptr, int32_t size){(app->memory_free_(app, ptr, size));} -static bool32 file_exists(Application_Links *app, String file_name){return(app->file_exists_(app, file_name));} +static bool32 file_get_attributes(Application_Links *app, String file_name, File_Attributes *attributes_out){return(app->file_get_attributes_(app, file_name, attributes_out));} static bool32 directory_cd(Application_Links *app, String *directory, String relative_path){return(app->directory_cd_(app, directory, relative_path));} static bool32 get_4ed_path(Application_Links *app, String *path_out, int32_t *required_size_out){return(app->get_4ed_path_(app, path_out, required_size_out));} static void show_mouse_cursor(Application_Links *app, Mouse_Cursor_Show_Type show){(app->show_mouse_cursor_(app, show));} diff --git a/4ed.cpp b/4ed.cpp index 21470af2..5bfbad77 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -1006,7 +1006,6 @@ App_Step_Sig(app_step){ file_name = cl_file_name; } - //open_file(system, models, file_name); Buffer_ID id = 0; create_buffer(&models->app_links, file_name, 0, &id); } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 86c8c36e..2050aabc 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -3942,8 +3942,7 @@ DOC_SEE(memory_allocate) DOC_SEE(Memory_Protect_Flags) */{ Models *models = (Models*)app->cmd_context; - bool32 result = models->system->memory_set_protection(ptr, size, flags); - return(result); + return(models->system->memory_set_protection(ptr, size, flags)); } API_EXPORT void @@ -3958,16 +3957,12 @@ DOC_SEE(memory_allocate) models->system->memory_free(ptr, size); } -// TODO(allen): redocument API_EXPORT bool32 -File_Exists(Application_Links *app, String file_name) -/* -DOC_PARAM(filename, This parameter specifies the full path to a file; it need not be null terminated.) -DOC_PARAM(len, This parameter specifies the length of the filename string.) -DOC_RETURN(This call returns non-zero if and only if the file exists.) -*/{ +File_Get_Attributes(Application_Links *app, String file_name, File_Attributes *attributes_out) +{ Models *models = (Models*)app->cmd_context; - return(models->system->file_exists(file_name.str, file_name.size)); + *attributes_out = models->system->quick_file_attributes(file_name); + return(attributes_out->last_write_time > 0); } // TODO(allen): redocument diff --git a/4ed_file.cpp b/4ed_file.cpp index 0bf0779c..bb12814c 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -422,7 +422,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File * block_zero_struct(&file->state); Gap_Buffer_Init init = buffer_begin_init(&file->state.buffer, val.str, val.size); - for (; buffer_init_need_more(&init); ){ + for (;buffer_init_need_more(&init);){ i32 page_size = buffer_init_page_size(&init); page_size = l_round_up_i32(page_size, KB(4)); if (page_size < KB(4)){ @@ -448,15 +448,13 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File * Font_Pointers font = system->font.get_pointers_by_id(font_id); Assert(font.valid); - { - file_measure_starts(heap, &file->state.buffer); - - file_allocate_character_starts_as_needed(heap, file); - buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); - - file_measure_wraps(system, &models->mem, file, font); - //adjust_views_looking_at_files_to_new_cursor(system, models, file); - } + file_measure_starts(heap, &file->state.buffer); + + file_allocate_character_starts_as_needed(heap, file); + buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); + + file_measure_wraps(system, &models->mem, file, font); + //adjust_views_looking_at_files_to_new_cursor(system, models, file); file->lifetime_object = lifetime_alloc_object(heap, &models->lifetime_allocator, DynamicWorkspace_Buffer, file); diff --git a/4ed_system.h b/4ed_system.h index df5f1f63..dd9dd923 100644 --- a/4ed_system.h +++ b/4ed_system.h @@ -31,6 +31,9 @@ typedef Sys_Set_File_List_Sig(System_Set_File_List); typedef Sys_Get_Canonical_Sig(System_Get_Canonical); // file load/save +#define Sys_Quick_File_Attributes_Sig(name) File_Attributes name(String file_name) +typedef Sys_Quick_File_Attributes_Sig(System_Quick_File_Attributes); + #define Sys_Load_Handle_Sig(name) b32 name(char *filename, Plat_Handle *handle_out) typedef Sys_Load_Handle_Sig(System_Load_Handle); @@ -198,9 +201,6 @@ typedef Sys_Memory_Set_Protection_Sig(System_Memory_Set_Protection); typedef Sys_Memory_Free_Sig(System_Memory_Free); // file system -#define Sys_File_Exists_Sig(name) b32 name(char *filename, i32 len) -typedef Sys_File_Exists_Sig(System_File_Exists); - #define Sys_Directory_CD_Sig(name) bool32 name(char *dir, i32 *len, i32 cap, char *rel_path, i32 rel_len) typedef Sys_Directory_CD_Sig(System_Directory_CD); @@ -224,23 +224,21 @@ typedef Sys_Is_Fullscreen_Sig(System_Is_Fullscreen); #define Sys_Log_Sig(name) void name(char *message, u32 length) typedef Sys_Log_Sig(System_Log); -#define INTERNAL_Sys_Get_Thread_States_Sig(name) void name(Thread_Group_ID id, b8 *running, i32 *pending) -typedef INTERNAL_Sys_Get_Thread_States_Sig(INTERNAL_System_Get_Thread_States); - struct System_Functions{ Font_Functions font; - // files (tracked api): 10 - System_Set_File_List *set_file_list; - System_Get_Canonical *get_canonical; - System_Add_Listener *add_listener; - System_Remove_Listener *remove_listener; - System_Get_File_Change *get_file_change; - System_Load_Handle *load_handle; - System_Load_Attributes *load_attributes; - System_Load_File *load_file; - System_Load_Close *load_close; - System_Save_File *save_file; + // files (tracked api): 11 + System_Set_File_List *set_file_list; + System_Get_Canonical *get_canonical; + System_Add_Listener *add_listener; + System_Remove_Listener *remove_listener; + System_Get_File_Change *get_file_change; + System_Quick_File_Attributes *quick_file_attributes; + System_Load_Handle *load_handle; + System_Load_Attributes *load_attributes; + System_Load_File *load_file; + System_Load_Close *load_close; + System_Save_File *save_file; // time: 4 System_Now_Time *now_time; @@ -271,12 +269,11 @@ struct System_Functions{ System_Acquire_Lock *acquire_lock; System_Release_Lock *release_lock; - // custom: 10 + // custom: 9 System_Memory_Allocate *memory_allocate; System_Memory_Set_Protection *memory_set_protection; System_Memory_Free *memory_free; - System_File_Exists *file_exists; System_Directory_CD *directory_cd; System_Get_Current_Path *get_current_path; System_Get_4ed_Path *get_4ed_path; @@ -287,7 +284,6 @@ struct System_Functions{ // debug: 1 System_Log *log; - INTERNAL_System_Get_Thread_States *internal_get_thread_states; }; #endif diff --git a/4ed_working_set.cpp b/4ed_working_set.cpp index 4497d307..214c9ab2 100644 --- a/4ed_working_set.cpp +++ b/4ed_working_set.cpp @@ -491,9 +491,7 @@ buffer_unbind_name_low_level(Working_Set *working_set, Editing_File *file){ } internal void -buffer_bind_name(Models *models, Heap *heap, Partition *scratch, - Working_Set *working_set, - Editing_File *file, String base_name){ +buffer_bind_name(Models *models, Heap *heap, Partition *scratch, Working_Set *working_set, Editing_File *file, String base_name){ Temp_Memory temp = begin_temp_memory(scratch); // List of conflict files. diff --git a/platform_all/4ed_link_system_functions.cpp b/platform_all/4ed_link_system_functions.cpp index c6bb4864..31f17792 100644 --- a/platform_all/4ed_link_system_functions.cpp +++ b/platform_all/4ed_link_system_functions.cpp @@ -20,6 +20,7 @@ link_system_code(){ SYSLINK(add_listener); SYSLINK(remove_listener); SYSLINK(get_file_change); + SYSLINK(quick_file_attributes); SYSLINK(load_handle); SYSLINK(load_attributes); SYSLINK(load_file); @@ -54,7 +55,6 @@ link_system_code(){ SYSLINK(memory_set_protection); SYSLINK(memory_free); - SYSLINK(file_exists); SYSLINK(directory_cd); SYSLINK(get_current_path); SYSLINK(get_4ed_path); @@ -64,9 +64,6 @@ link_system_code(){ SYSLINK(show_mouse_cursor); SYSLINK(log); -#if defined(FRED_INTERNAL) - SYSLINK(internal_get_thread_states); -#endif } // BOTTOM diff --git a/platform_all/4ed_work_queues.cpp b/platform_all/4ed_work_queues.cpp index b29c806f..cb48a254 100644 --- a/platform_all/4ed_work_queues.cpp +++ b/platform_all/4ed_work_queues.cpp @@ -351,23 +351,6 @@ Sys_Grow_Thread_Memory_Sig(system_grow_thread_memory){ system_release_lock(cancel_lock); } -internal -INTERNAL_Sys_Get_Thread_States_Sig(system_internal_get_thread_states){ - Thread_Group *group = threadvars.groups + id; - Work_Queue *queue = threadvars.queues + id; - Unbounded_Work_Queue *source_queue = &group->queue; - u32 write = queue->write_position; - u32 read = queue->read_position; - if (write < read){ - write += QUEUE_WRAP; - } - *pending = (i32)(write - read) + source_queue->count - source_queue->skip; - - for (i32 i = 0; i < group->count; ++i){ - running[i] = (group->threads[i].running != 0); - } -} - internal void work_system_init(){ AssertThreadSizes(); diff --git a/platform_win32/win32_4ed_functions.cpp b/platform_win32/win32_4ed_functions.cpp index cfe0f0af..f2d85fb7 100644 --- a/platform_win32/win32_4ed_functions.cpp +++ b/platform_win32/win32_4ed_functions.cpp @@ -344,6 +344,17 @@ win32_file_attributes_from_HANDLE(HANDLE file){ return(result); } +internal +Sys_Quick_File_Attributes_Sig(system_quick_file_attributes){ + WIN32_FILE_ATTRIBUTE_DATA info = {}; + File_Attributes result = {}; + if (GetFileAttributesEx_utf8String(&shared_vars.scratch, file_name, GetFileExInfoStandard, &info)){ + result.size = ((u64)info.nFileSizeHigh << 32LL) | ((u64)info.nFileSizeLow); + result.last_write_time = ((u64)info.ftLastWriteTime.dwHighDateTime << 32LL) | ((u64)info.ftLastWriteTime.dwLowDateTime); + } + return(result); +} + internal Sys_Load_Handle_Sig(system_load_handle){ b32 result = false; @@ -416,29 +427,6 @@ Sys_Save_File_Sig(system_save_file){ // File System // -internal -Sys_File_Exists_Sig(system_file_exists){ - char full_filename_space[1024]; - String full_filename; - HANDLE file; - b32 result = 0; - - if (len < sizeof(full_filename_space)){ - full_filename = make_fixed_width_string(full_filename_space); - copy_ss(&full_filename, make_string(filename, len)); - terminate_with_null(&full_filename); - - file = CreateFile_utf8(&shared_vars.scratch, (u8*)full_filename.str, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (file != INVALID_HANDLE_VALUE){ - CloseHandle(file); - result = 1; - } - } - - return(result); -} - internal b32 system_directory_exists(char *path){ DWORD attrib = GetFileAttributes_utf8(&shared_vars.scratch, (u8*)path); diff --git a/platform_win32/win32_utf8.cpp b/platform_win32/win32_utf8.cpp index 39db54a6..5b841ffc 100644 --- a/platform_win32/win32_utf8.cpp +++ b/platform_win32/win32_utf8.cpp @@ -13,30 +13,35 @@ #define FRED_WIN32_UTF8_CPP internal Win32_UTF16 -input_8_to_16(Partition *scratch, u8 *in){ +input_8_to_16(Partition *scratch, u8 *in, u32 in_length){ Win32_UTF16 r = {}; - - u32 utf8_len = 0; - for (;in[utf8_len];++utf8_len); - u32 utf16_max = (utf8_len + 1)*2; + u32 utf16_max = (in_length + 1)*2; u16 *utf16 = push_array(scratch, u16, utf16_max); - b32 error = false; - u32 utf16_len = (u32)utf8_to_utf16_minimal_checking(utf16, utf16_max - 1, in, utf8_len, &error); - + u32 utf16_len = (u32)utf8_to_utf16_minimal_checking(utf16, utf16_max - 1, in, in_length, &error); if (!error && utf16_len < utf16_max){ utf16[utf16_len] = 0; - r.success = true; - r.utf8_len = utf8_len; + r.utf8_len = in_length; r.utf16_max = utf16_max; r.utf16_len = utf16_len; r.utf16 = utf16; } - return(r); } +internal Win32_UTF16 +input_8_to_16(Partition *scratch, u8 *in){ + u32 length = 0; + for (;in[length];++length); + return(input_8_to_16(scratch, in, length)); +} + +internal Win32_UTF16 +input_8_to_16(Partition *scratch, String in){ + return(input_8_to_16(scratch, (u8*)in.str, in.size)); +} + internal HANDLE CreateFile_utf8(Partition *scratch, u8 *name, DWORD access, DWORD share, LPSECURITY_ATTRIBUTES security, DWORD creation, DWORD flags, HANDLE template_file){ HANDLE result = INVALID_HANDLE_VALUE; @@ -191,9 +196,7 @@ GetCurrentDirectory_utf8(Partition *scratch, DWORD max, u8 *buffer){ internal int MessageBox_utf8(Partition *scratch, HWND owner, u8 *text, u8 *caption, UINT type){ int result = 0; - Temp_Memory temp = begin_temp_memory(scratch); - Win32_UTF16 text_16 = input_8_to_16(scratch, text); if (text_16.success){ Win32_UTF16 caption_16 = input_8_to_16(scratch, caption); @@ -201,25 +204,31 @@ MessageBox_utf8(Partition *scratch, HWND owner, u8 *text, u8 *caption, UINT type result = MessageBoxW(owner, (LPWSTR)text_16.utf16, (LPWSTR)caption_16.utf16, type); } } - end_temp_memory(temp); - return(result); } internal BOOL SetWindowText_utf8(Partition *scratch, HWND window, u8 *string){ BOOL result = FALSE; - Temp_Memory temp = begin_temp_memory(scratch); - Win32_UTF16 string_16 = input_8_to_16(scratch, string); if (string_16.success){ result = SetWindowTextW(window, (LPWSTR)string_16.utf16); } - end_temp_memory(temp); - + return(result); +} + +internal BOOL +GetFileAttributesEx_utf8String(Partition *scratch, String file_name, GET_FILEEX_INFO_LEVELS info_level_id, LPVOID file_info){ + BOOL result = FALSE; + Temp_Memory temp = begin_temp_memory(scratch); + Win32_UTF16 string_16 = input_8_to_16(scratch, file_name); + if (string_16.success){ + result = GetFileAttributesExW((LPWSTR)string_16.utf16, info_level_id, file_info); + } + end_temp_memory(temp); return(result); } diff --git a/platform_win32/win32_utf8.h b/platform_win32/win32_utf8.h index 33d11cba..98d862f5 100644 --- a/platform_win32/win32_utf8.h +++ b/platform_win32/win32_utf8.h @@ -39,6 +39,9 @@ MessageBox_utf8(Partition *scratch, HWND owner, u8 *text, u8 *caption, UINT type internal BOOL SetWindowText_utf8(Partition *scratch, HWND window, u8 *string); +internal BOOL +GetFileAttributesEx_utf8String(Partition *scratch, String file_name, GET_FILEEX_INFO_LEVELS info_level_id, LPVOID file_info); + // For implementation struct Win32_UTF16{