diff --git a/4coder_custom.h b/4coder_custom.h index 683c4839..9250dd4b 100644 --- a/4coder_custom.h +++ b/4coder_custom.h @@ -268,7 +268,7 @@ extern "C"{ #define DIRECTORY_HAS_FILE_SIG(name) int name(String dir, char *filename) #define DIRECTORY_CD_SIG(name) int name(String *dir, char *rel_path) -// Buffer manipulation +// Direct buffer manipulation #define GET_BUFFER_MAX_INDEX_SIG(name) int name(void *cmd_context) #define GET_BUFFER_SIG(name) Buffer_Summary name(void *cmd_context, int index) #define GET_ACTIVE_BUFFER_SIG(name) Buffer_Summary name(void *cmd_context) @@ -277,6 +277,8 @@ extern "C"{ #define BUFFER_SEEK_DELIMITER_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, char delim, int *out) #define BUFFER_READ_RANGE_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, int end, char *out) +#define BUFFER_REPLACE_RANGE_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, int end, char *str, int len) + extern "C"{ // Command exectuion typedef EXECUTE_COMMAND_SIG(Exec_Command_Function); @@ -297,6 +299,8 @@ extern "C"{ typedef BUFFER_SEEK_DELIMITER_SIG(Buffer_Seek_Delimiter_Function); typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); + + typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function); } struct Application_Links{ @@ -319,6 +323,8 @@ struct Application_Links{ Buffer_Seek_Delimiter_Function *buffer_seek_delimiter; Buffer_Read_Range_Function *buffer_read_range; + + Buffer_Replace_Range_Function *buffer_replace_range; }; struct Custom_API{ diff --git a/4ed.cpp b/4ed.cpp index 4e1a0a32..e6f38eb4 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -178,12 +178,12 @@ struct Command_Data{ Delay *delay; App_Vars *vars; Exchange *exchange; + System_Functions *system; i32 screen_width, screen_height; Key_Event_Data key; Partition part; - System_Functions *system; }; struct Command_Parameter{ @@ -2065,6 +2065,18 @@ extern "C"{ cmd->part.pos = 0; } + DIRECTORY_GET_HOT_SIG(external_directory_get_hot){ + Command_Data *cmd = (Command_Data*)cmd_context; + Hot_Directory *hot = &cmd->vars->hot_directory; + i32 copy_max = max - 1; + hot_directory_clean_end(hot); + if (copy_max > hot->string.size) + copy_max = hot->string.size; + memcpy(buffer, hot->string.str, copy_max); + buffer[copy_max] = 0; + return(copy_max); + } + GET_BUFFER_MAX_INDEX_SIG(external_get_buffer_max_index){ Command_Data *cmd = (Command_Data*)cmd_context; Working_Set *working_set; @@ -2144,14 +2156,14 @@ extern "C"{ Working_Set *working_set; int result = 0; int size; - + if (buffer->exists){ working_set = cmd->working_set; file = working_set->files + buffer->file_id; if (!file->state.is_dummy && file_is_ready(file)){ size = buffer_size(&file->state.buffer); - result = 1; if (start < size){ + result = 1; *out = buffer_seek_delimiter(&file->state.buffer, start, delim); if (*out < 0) *out = 0; if (*out > size) *out = size; @@ -2163,16 +2175,67 @@ extern "C"{ return(result); } - DIRECTORY_GET_HOT_SIG(external_directory_get_hot){ + BUFFER_READ_RANGE_SIG(external_buffer_read_range){ Command_Data *cmd = (Command_Data*)cmd_context; - Hot_Directory *hot = &cmd->vars->hot_directory; - i32 copy_max = max - 1; - hot_directory_clean_end(hot); - if (copy_max > hot->string.size) - copy_max = hot->string.size; - memcpy(buffer, hot->string.str, copy_max); - buffer[copy_max] = 0; - return(copy_max); + Editing_File *file; + Working_Set *working_set; + int result = 0; + int size; + + if (buffer->exists){ + working_set = cmd->working_set; + file = working_set->files + buffer->file_id; + if (!file->state.is_dummy && file_is_ready(file)){ + size = buffer_size(&file->state.buffer); + if (0 <= start && start <= end && end <= size){ + result = 1; + buffer_stringify(&file->state.buffer, start, end, out); + } + fill_buffer_summary(buffer, file, working_set); + } + } + + return(result); + } + + BUFFER_REPLACE_RANGE_SIG(external_buffer_replace_range){ + Command_Data *cmd = (Command_Data*)cmd_context; + Editing_File *file; + Working_Set *working_set; + + System_Functions *system; + Mem_Options *mem; + Editing_Layout *layout; + + int result = 0; + int size; + int next_cursor, pos; + + if (buffer->exists){ + working_set = cmd->working_set; + file = working_set->files + buffer->file_id; + if (!file->state.is_dummy && file_is_ready(file)){ + size = buffer_size(&file->state.buffer); + if (0 <= start && start <= end && end <= size){ + result = 1; + + system = cmd->system; + mem = cmd->mem; + layout = cmd->layout; + + pos = file->state.cursor_pos; + if (pos < start) next_cursor = pos; + else if (pos < end) next_cursor = start + len; + else next_cursor = pos + end - start + len; + + file_replace_range(system, mem, file, layout, + start, end, str, len, next_cursor); + } + fill_buffer_summary(buffer, file, working_set); + } + } + + return(result); } } diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index fe819f3b..10111d34 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -1978,6 +1978,21 @@ view_do_white_batch_edit(System_Functions *system, Mem_Options *mem, File_View * #endif } +inline void +file_replace_range(System_Functions *system, + Mem_Options *mem, Editing_File *file, Editing_Layout *layout, + i32 start, i32 end, char *str, i32 len, i32 next_cursor){ + Edit_Spec spec = {}; + spec.step.type = ED_NORMAL; + spec.step.edit.start = start; + spec.step.edit.end = end; + spec.step.edit.len = len; + spec.step.pre_pos = file->state.cursor_pos; + spec.step.post_pos = next_cursor; + spec.str = (u8*)str; + file_do_single_edit(system, mem, file, layout, spec, hist_normal); +} + inline void view_replace_range(System_Functions *system, Mem_Options *mem, File_View *view, Editing_Layout *layout, diff --git a/vc120.pdb b/vc120.pdb deleted file mode 100644 index d124b484..00000000 Binary files a/vc120.pdb and /dev/null differ