/* * Serial inserts helpers */ // TOP static Buffer_Insertion begin_buffer_insertion_at(Application_Links *app, Buffer_ID buffer_id, i32 at){ Buffer_Insertion result = {}; result.app = app; result.buffer = buffer_id; result.at = at; return(result); } static Buffer_Insertion begin_buffer_insertion_at_buffered(Application_Links *app, Buffer_ID buffer_id, i32 at, Partition *part){ Buffer_Insertion result = begin_buffer_insertion_at(app, buffer_id, at); result.buffering = true; result.part = part; result.temp = begin_temp_memory(part); return(result); } #if 0 static Buffer_Summary get_active_buffer(Application_Links *app, Access_Flag access){ View_Summary view = get_active_view(app, access); Buffer_Summary result = get_buffer(app, view.buffer_id, access); return(result); } #endif static Buffer_Insertion begin_buffer_insertion(Application_Links *app){ View_ID view = 0; get_active_view(app, AccessAll, &view); Buffer_ID buffer = 0; view_get_buffer(app, view, AccessAll, &buffer); i32 cursor_pos = 0; view_get_cursor_pos(app, view, &cursor_pos); Buffer_Insertion result = begin_buffer_insertion_at(app, buffer, cursor_pos); return(result); } static void insert_string__no_buffering(Buffer_Insertion *insertion, String string){ buffer_replace_range(insertion->app, insertion->buffer, insertion->at, insertion->at, string); insertion->at += string.size; } static void insert__flush(Buffer_Insertion *insertion){ Partition *part = insertion->part; i32 pos = insertion->temp.pos; String string = make_string(part->base + pos, part->pos - pos); insert_string__no_buffering(insertion, string); end_temp_memory(insertion->temp); } static char* insert__reserve(Buffer_Insertion *insertion, i32 size){ char *space = push_array(insertion->part, char, size); if (space == 0){ insert__flush(insertion); space = push_array(insertion->part, char, size); } return(space); } static void insert_string(Buffer_Insertion *insertion, String string){ if (!insertion->buffering){ insert_string__no_buffering(insertion, string); } else{ char *space = insert__reserve(insertion, string.size); if (space != 0){ memcpy(space, string.str, string.size); } else{ insert_string__no_buffering(insertion, string); } } } static i32 insertf(Buffer_Insertion *insertion, char *format, ...){ Arena *arena = context_get_arena(insertion->app); Temp_Memory_Arena temp = begin_temp_memory(arena); va_list args; va_start(args, format); String string = string_push_fv(arena, format, args); va_end(args); insert_string(insertion, string); end_temp_memory(temp); return(string.size); } static void insertc(Buffer_Insertion *insertion, char C){ insert_string(insertion, make_string(&C, 1)); } static b32 insert_line_from_buffer(Buffer_Insertion *insertion, Buffer_ID buffer_id, i32 line, i32 truncate_at){ Partition *part = &global_part; Temp_Memory temp = begin_temp_memory(part); Partial_Cursor begin = {}; Partial_Cursor end = {}; Buffer_Summary buffer = get_buffer(insertion->app, buffer_id, AccessAll); b32 success = false; if (buffer_compute_cursor(insertion->app, &buffer, seek_line_char(line, 1), &begin)){ if (buffer_compute_cursor(insertion->app, &buffer, seek_line_char(line, -1), &end)){ if (begin.line == line){ if (0 <= begin.pos && begin.pos <= end.pos && end.pos <= buffer.size){ i32 size = (end.pos - begin.pos); if(truncate_at && (size > truncate_at)) { size = truncate_at; } char *memory = push_array(part, char, size); if (memory != 0){ String str = make_string(memory, 0, size); success = true; buffer_read_range(insertion->app, &buffer, begin.pos, end.pos, str.str); str.size = size; insert_string(insertion, str); } } } } } end_temp_memory(temp); return(success); } static b32 insert_line_from_buffer(Buffer_Insertion *insertion, Buffer_ID buffer_id, i32 line){ return(insert_line_from_buffer(insertion, buffer_id, line, 0)); } // BOTTOM