From e16ab8c1c4c9ce69306b8d2d9bac5529e815437e Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 23 Feb 2016 15:41:11 -0500 Subject: [PATCH] new replace range api --- 4coder_custom.h | 8 ++++- 4ed.cpp | 87 +++++++++++++++++++++++++++++++++++++++------- 4ed_file_view.cpp | 15 ++++++++ vc120.pdb | Bin 102400 -> 0 bytes 4 files changed, 97 insertions(+), 13 deletions(-) delete mode 100644 vc120.pdb 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 d124b484ce857dcb3bbc728b9c69efbb3e343f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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 z%0A_SxHe_Jd#Mj)GOOvD?ew%~iT?+D%locBdrg$KI_8uwbb$C>=v=d7RM zH?HRc4%W}$-%JDtE#U=XXiPvF4>z{rQ#52R?~&NcyB8XEJ@fLPhKB5O zjBWZ9P1)y|_vr40W{Wzv#L#R7Jw5}F_uuET$==Aa_qyzjEPI@P&cu(H__9~B?0GJG zCD$9CWUpk|dtUZRUSh)U06i|#aO1wuxMg4Ot;RjTyXfDqu_9MTtc^XN%ve3j`3uuJ@dN-jhPP_ z3fkZW@XKxVRlb7PMVuZo8a_Ya65|(X^@FtkQ6`?8v%v8LOT`b%d|NabPb8udv5S&OV2Tfqml(Ge3U`D;@5hiD2a9Beg0vU6Nn-hDERFTKhzme$*BD0ECW6RMbhnyIPI~l;<3a}^{e8ykB+Bk)s-1H zrE$)Yj~9X8SRFg?!0KoY{Xqkt2wFWcmTFByJTlejjQvb9nwVtD_C9Df;f@+Sb{O{t z<92Zt1BYW%?wagQ|a?_iw9;d>hQ?Z#bg+_xC_c;jAg z(oZ(-6O8*H7i;-?ZnR+ziUo&=%rMbW5baKuJ zuamJ`&cQf1R5l|cipOEyX$Rx`9?k{(sMEdbmaJGGZEc)2V|^?!73bX0J0_1Q$Ihsp z(%v}ZkZCpQIju%Nr`JqV?wK_+)$_2!X6f+hhiZQlf9AC5$~}wS$F8fMa^z7{s;4AV ziBxl{ddl(f>M4u-GT#Uqqv|Qk>Z_+LU-Nf5wv5~SA5FPGiRa#QKQ)dzyQIAO{J4*j zlYhi1aDVNi$M{>YPzuj{lRD|cjnny;H*p4mHqx#a|rhP9}>auG5h^rJSSkk|1lib^94oU_V)X~ z@NIGk+KrhvkXeObtZ%>n^?Z(eH{0+3?sEh7`(K~NYQO*O_rLxAx8MIfKVZNAclIRq zf2MQG?f3t`+V}q@Q>Qu2+wVN)K+Fw3bL%~`{`jYPi%#4B$3I(qK>Zc{FsE@atFL91 zDF9|xgD3u~i^cJf EAL5&U-T(jq