new replace range api
This commit is contained in:
parent
a883787f55
commit
e16ab8c1c4
|
@ -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{
|
||||
|
|
87
4ed.cpp
87
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue