buffer api up and running

master
Allen Webster 2016-02-23 18:03:22 -05:00
parent e16ab8c1c4
commit c7a6225fe2
3 changed files with 27 additions and 7 deletions

View File

@ -57,8 +57,8 @@ bool str_match(const char *a, int len_a, const char *b, int len_b){
HOOK_SIG(my_file_settings){
Buffer_Summary buffer = app->get_active_buffer(cmd_context);
// NOTE(allen|a3.4.2): Whenever you ask for a buffer, you should check that the
// exists flag is set to true before using it. Reasons why the buffer might not exist:
// NOTE(allen|a3.4.2): Whenever you ask for a buffer, you should first check that
// the exists field is set to true. Reasons why the buffer might not exist:
// -The active panel does not contain a buffer and get_active_buffer was used
// -The index provided to get_buffer was out of range [0,max) or that index is associated to a dummy buffer
// -The name provided to get_buffer_by_name did not match any of the existing buffers
@ -81,6 +81,19 @@ HOOK_SIG(my_file_settings){
}
}
CUSTOM_COMMAND_SIG(write_increment){
Buffer_Summary buffer = app->get_active_buffer(cmd_context);
// NOTE(allen|a3.4.2): In addition to checking whether the buffer exists after a query,
// if you're going to read from or write to the buffer, you should check ready. A buffer
// is usually ready, but when a buffer has just been opened it is possible that the contents
// haven't been filled yet. If the buffer is not ready trying to read or write it is invalid.
// (See my_file_settings for comments on the exists field).
if (buffer.exists && buffer.ready){
app->buffer_replace_range(cmd_context, &buffer, buffer.file_cursor_pos, buffer.file_cursor_pos, "++", 2);
}
}
CUSTOM_COMMAND_SIG(open_in_other){
exec_command(cmd_context, cmdid_change_active_panel);
exec_command(cmd_context, cmdid_interactive_open);
@ -264,6 +277,8 @@ extern "C" GET_BINDING_DATA(get_bindings){
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, ' ', MDFR_SHIFT, cmdid_write_character);
bind(context, '=', MDFR_CTRL, write_increment);
end_map(context);

View File

@ -276,7 +276,6 @@ 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"{
@ -299,7 +298,6 @@ 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);
}
@ -323,7 +321,6 @@ struct Application_Links{
Buffer_Seek_Delimiter_Function *buffer_seek_delimiter;
Buffer_Read_Range_Function *buffer_read_range;
Buffer_Replace_Range_Function *buffer_replace_range;
};

12
4ed.cpp
View File

@ -2012,7 +2012,8 @@ globalvar Command_Function command_table[cmdid_count];
internal void
fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *working_set){
buffer->exists = 1;
buffer->exists = file_is_ready(file);
buffer->ready = file_is_ready(file);
buffer->is_lexed = file->settings.tokens_exist;
buffer->file_id = (int)(file - working_set->files);
buffer->size = file->state.buffer.size;
buffer->file_cursor_pos = file->state.cursor_pos;
@ -2022,7 +2023,6 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *wor
buffer->file_name = file->name.source_path.str;
buffer->buffer_name = file->name.live_name.str;
buffer->is_lexed = file->settings.tokens_exist;
buffer->map_id = file->settings.base_map_id;
}
@ -2250,10 +2250,18 @@ app_links_init(System_Functions *system){
app_links.directory_has_file = system->directory_has_file;
app_links.directory_cd = system->directory_cd;
app_links.get_buffer_max_index = external_get_buffer_max_index;
app_links.get_buffer = external_get_buffer;
app_links.get_buffer_by_name = external_get_buffer_by_name;
app_links.get_buffer_max_index = external_get_buffer_max_index;
app_links.get_buffer = external_get_buffer;
app_links.get_active_buffer = external_get_active_buffer;
app_links.get_buffer_by_name = external_get_buffer_by_name;
app_links.buffer_seek_delimiter = external_buffer_seek_delimiter;
app_links.buffer_read_range = external_buffer_read_range;
app_links.buffer_replace_range = external_buffer_replace_range;
}
#if FRED_INTERNAL