aboutsummaryrefslogtreecommitdiffstats
path: root/build/4coder_byp/custom/4coder_insertion.cpp
blob: 45a7870e2c19a4cb8c36bd33ffeef238bb63f95e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Serial inserts helpers
 */

// TOP

function Buffer_Insertion
begin_buffer_insertion_at(Application_Links *app, Buffer_ID buffer_id, i64 at){
 Buffer_Insertion result = {};
 result.app = app;
 result.buffer = buffer_id;
 result.at = at;
 return(result);
 }

 function Buffer_Insertion
 begin_buffer_insertion_at_buffered(Application_Links *app, Buffer_ID buffer_id, i64 at, Cursor *cursor){
 Buffer_Insertion result = begin_buffer_insertion_at(app, buffer_id, at);
 result.buffering = true;
 result.cursor = cursor;
 result.temp = begin_temp(cursor);
 return(result);
 }

 function Buffer_Insertion
 begin_buffer_insertion_at_buffered(Application_Links *app, Buffer_ID buffer_id, i64 at, Arena *buffer_memory, u64 buffer_memory_size){
 Cursor *cursor = push_array(buffer_memory, Cursor, 1);
 *cursor = make_cursor(push_array(buffer_memory, u8, buffer_memory_size), buffer_memory_size);
 return(begin_buffer_insertion_at_buffered(app, buffer_id, at, cursor));
 }

 function Buffer_Insertion
 begin_buffer_insertion(Application_Links *app){
 View_ID view = get_active_view(app, Access_Always);
 Buffer_ID buffer = view_get_buffer(app, view, Access_Always);
 i64 cursor_pos = view_get_cursor_pos(app, view);
 Buffer_Insertion result = begin_buffer_insertion_at(app, buffer, cursor_pos);
 return(result);
 }

 function void
 insert_string__no_buffering(Buffer_Insertion *insertion, String_Const_u8 string){
 buffer_replace_range(insertion->app, insertion->buffer, Ii64(insertion->at), string);
 insertion->at += string.size;
 }

 function void
 insert__flush(Buffer_Insertion *insertion){
 Cursor *cursor = insertion->cursor;
 u64 pos = insertion->temp.temp_memory_cursor.pos;
 String_Const_u8 string = SCu8(cursor->base + pos, cursor->pos - pos);
 insert_string__no_buffering(insertion, string);
 end_temp(insertion->temp);
 }

 function char*
 insert__reserve(Buffer_Insertion *insertion, u64 size){
 char *space = push_array(insertion->cursor, char, size);
 if (space == 0){
 insert__flush(insertion);
 space = push_array(insertion->cursor, char, size);
 }
 return(space);
 }

 function void
 end_buffer_insertion(Buffer_Insertion *insertion){
 if (insertion->buffering){
 insert__flush(insertion);
 }
 }

 function void
 insert_string(Buffer_Insertion *insertion, String_Const_u8 string){
 if (!insertion->buffering){
 insert_string__no_buffering(insertion, string);
 }
 else{
 char *space = insert__reserve(insertion, string.size);
 if (space != 0){
 block_copy(space, string.str, string.size);
 }
 else{
 insert_string__no_buffering(insertion, string);
 }
 }
 }

 function u64
 insertf(Buffer_Insertion *insertion, char *format, ...){
 Scratch_Block scratch(insertion->app);
 va_list args;
 va_start(args, format);
 String_Const_u8 string = push_u8_stringfv(scratch, format, args);
 va_end(args);
 insert_string(insertion, string);
 return(string.size);
 }

 function void
 insertc(Buffer_Insertion *insertion, char C){
 insert_string(insertion, SCu8(&C, 1));
 }

 function b32
 insert_line_from_buffer(Buffer_Insertion *insertion, Buffer_ID buffer_id, i32 line, i32 truncate_at){
 b32 success = is_valid_line(insertion->app, buffer_id, line);
 if (success){
 Scratch_Block scratch(insertion->app);
 insert_string(insertion, push_buffer_line(insertion->app, scratch, buffer_id, line));
 }
 return(success);
 }

 function 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