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_HAS_FILE_SIG(name) int name(String dir, char *filename)
|
||||||
#define DIRECTORY_CD_SIG(name) int name(String *dir, char *rel_path)
|
#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_MAX_INDEX_SIG(name) int name(void *cmd_context)
|
||||||
#define GET_BUFFER_SIG(name) Buffer_Summary name(void *cmd_context, int index)
|
#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)
|
#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_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_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"{
|
extern "C"{
|
||||||
// Command exectuion
|
// Command exectuion
|
||||||
typedef EXECUTE_COMMAND_SIG(Exec_Command_Function);
|
typedef EXECUTE_COMMAND_SIG(Exec_Command_Function);
|
||||||
|
@ -297,6 +299,8 @@ extern "C"{
|
||||||
|
|
||||||
typedef BUFFER_SEEK_DELIMITER_SIG(Buffer_Seek_Delimiter_Function);
|
typedef BUFFER_SEEK_DELIMITER_SIG(Buffer_Seek_Delimiter_Function);
|
||||||
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
||||||
|
|
||||||
|
typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Application_Links{
|
struct Application_Links{
|
||||||
|
@ -319,6 +323,8 @@ struct Application_Links{
|
||||||
|
|
||||||
Buffer_Seek_Delimiter_Function *buffer_seek_delimiter;
|
Buffer_Seek_Delimiter_Function *buffer_seek_delimiter;
|
||||||
Buffer_Read_Range_Function *buffer_read_range;
|
Buffer_Read_Range_Function *buffer_read_range;
|
||||||
|
|
||||||
|
Buffer_Replace_Range_Function *buffer_replace_range;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Custom_API{
|
struct Custom_API{
|
||||||
|
|
87
4ed.cpp
87
4ed.cpp
|
@ -178,12 +178,12 @@ struct Command_Data{
|
||||||
Delay *delay;
|
Delay *delay;
|
||||||
App_Vars *vars;
|
App_Vars *vars;
|
||||||
Exchange *exchange;
|
Exchange *exchange;
|
||||||
|
System_Functions *system;
|
||||||
|
|
||||||
i32 screen_width, screen_height;
|
i32 screen_width, screen_height;
|
||||||
Key_Event_Data key;
|
Key_Event_Data key;
|
||||||
|
|
||||||
Partition part;
|
Partition part;
|
||||||
System_Functions *system;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Command_Parameter{
|
struct Command_Parameter{
|
||||||
|
@ -2065,6 +2065,18 @@ extern "C"{
|
||||||
cmd->part.pos = 0;
|
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){
|
GET_BUFFER_MAX_INDEX_SIG(external_get_buffer_max_index){
|
||||||
Command_Data *cmd = (Command_Data*)cmd_context;
|
Command_Data *cmd = (Command_Data*)cmd_context;
|
||||||
Working_Set *working_set;
|
Working_Set *working_set;
|
||||||
|
@ -2144,14 +2156,14 @@ extern "C"{
|
||||||
Working_Set *working_set;
|
Working_Set *working_set;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
if (buffer->exists){
|
if (buffer->exists){
|
||||||
working_set = cmd->working_set;
|
working_set = cmd->working_set;
|
||||||
file = working_set->files + buffer->file_id;
|
file = working_set->files + buffer->file_id;
|
||||||
if (!file->state.is_dummy && file_is_ready(file)){
|
if (!file->state.is_dummy && file_is_ready(file)){
|
||||||
size = buffer_size(&file->state.buffer);
|
size = buffer_size(&file->state.buffer);
|
||||||
result = 1;
|
|
||||||
if (start < size){
|
if (start < size){
|
||||||
|
result = 1;
|
||||||
*out = buffer_seek_delimiter(&file->state.buffer, start, delim);
|
*out = buffer_seek_delimiter(&file->state.buffer, start, delim);
|
||||||
if (*out < 0) *out = 0;
|
if (*out < 0) *out = 0;
|
||||||
if (*out > size) *out = size;
|
if (*out > size) *out = size;
|
||||||
|
@ -2163,16 +2175,67 @@ extern "C"{
|
||||||
return(result);
|
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;
|
Command_Data *cmd = (Command_Data*)cmd_context;
|
||||||
Hot_Directory *hot = &cmd->vars->hot_directory;
|
Editing_File *file;
|
||||||
i32 copy_max = max - 1;
|
Working_Set *working_set;
|
||||||
hot_directory_clean_end(hot);
|
int result = 0;
|
||||||
if (copy_max > hot->string.size)
|
int size;
|
||||||
copy_max = hot->string.size;
|
|
||||||
memcpy(buffer, hot->string.str, copy_max);
|
if (buffer->exists){
|
||||||
buffer[copy_max] = 0;
|
working_set = cmd->working_set;
|
||||||
return(copy_max);
|
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
|
#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
|
inline void
|
||||||
view_replace_range(System_Functions *system,
|
view_replace_range(System_Functions *system,
|
||||||
Mem_Options *mem, File_View *view, Editing_Layout *layout,
|
Mem_Options *mem, File_View *view, Editing_Layout *layout,
|
||||||
|
|
Loading…
Reference in New Issue