sled

Једноставни уређивач текста
git clone https://git.sr.ht/~strahinja/sled
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 092e351ed67fa613cb1298bf3233ad89a7f14ab8
родитељ 7e1912b2d16aa548710c1c6e82cea0092110dd4c
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon,  1 Jul 2024 18:36:28 +0200

Bugfix: Fix SEGV when erasing lines (leftover logic from fixed 
buffers); add setting error message and running = 0 on allocation 
errors

Diffstat:
Msled.c | 65++++++++++++++++++++++++++++++++++++++++++++---------------------
измењених датотека: 1, додавања: 44(+), брисања: 21(-)

diff --git a/sled.c b/sled.c @@ -316,8 +316,8 @@ do_search_replace(struct DrawState* state) return 0; do_search_replace_error: - exit(print_error(ENOMEM, "Memory allocation failed")); - /* Unreachable */ + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return 1; } @@ -408,20 +408,22 @@ static int erase_line(struct DrawState* state) { struct BufferLine* current = NULL; + struct BufferLine* next = NULL; + uint32_t* ptext = NULL; + char* temp = NULL; if (state->rows_count == 1) { *state->buffer[0].text = 0; state->buffer[0].length = 0; return 0; } - free(state->buffer[state->coord.row].text); - state->buffer[state->coord.row].text = NULL; for (ssize_t row = state->coord.row; row < state->rows_count - 1; row++) { - current = state->buffer + row; - current->text = state->buffer[row + 1].text; - current->size = state->buffer[row + 1].size; - current->length = state->buffer[row + 1].length; + current = state->buffer + row; + next = state->buffer + row + 1; + U32_SAFE_COPY(current->text, ptext, current->size, next->text, + next->size, erase_line_error); + current->length = next->length; } free_bufferline(&state->buffer[state->rows_count - 1]); if ((state->coord.row + 1) == state->rows_count) @@ -430,6 +432,11 @@ erase_line(struct DrawState* state) state->rows_count--; state->dirty = 1; return 0; + +erase_line_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; + return 1; } static int @@ -1023,10 +1030,11 @@ static int insert_char(struct DrawState* state, uint32_t ch) { struct BufferLine* buffer_line = NULL; + uint32_t* ptext = NULL; + char* temp = NULL; ssize_t i; ssize_t len; ssize_t size; - uint32_t* ptext = NULL; ENSURE_SIZE(state->buffer[state->coord.row].text, ptext, state->buffer[state->coord.row].size, @@ -1089,6 +1097,8 @@ insert_skip_wrap: return 0; insert_char_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return 1; } @@ -1151,16 +1161,17 @@ insert_tab(struct DrawState* state) static int join_lines(struct DrawState* state) { + struct BufferLine* current = NULL; + struct BufferLine* next = NULL; + uint32_t* ptext = NULL; + char* temp = NULL; /* Selection start row/col */ int ssr = 0; int ssc = 0; /* Selection end row */ - int ser = 0; - int selection = 0; - int saved_row = state->coord.row; - struct BufferLine* current = NULL; - struct BufferLine* next = NULL; - uint32_t* ptext = NULL; + int ser = 0; + int selection = 0; + int saved_row = state->coord.row; if (SEL_NOT_EMPTY(state)) { @@ -1212,7 +1223,9 @@ join_lines(struct DrawState* state) return 0; join_lines_error: - return -1; + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; + return 1; } static int @@ -2253,6 +2266,8 @@ simple_insert_line(struct DrawState* state) return; simple_insert_line_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return; } @@ -2262,6 +2277,7 @@ simple_join_lines(struct DrawState* state) struct BufferLine* first_line = NULL; struct BufferLine* next_line = NULL; uint32_t* ptext = NULL; + char* temp = NULL; if ((state->coord.row + 1) == state->rows_count) return; @@ -2289,21 +2305,24 @@ simple_join_lines(struct DrawState* state) return; simple_join_lines_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return; } static void simple_yank(struct DrawState* state) { + struct BufferLine* newbuf = NULL; + uint32_t* ptext = NULL; + char* temp = NULL; + ssize_t initialize_start; /* Selection start row/col */ int ssr = 0; int ssc = 0; /* Selection end row/col */ - int ser = 0; - int sec = 0; - struct BufferLine* newbuf = NULL; - ssize_t initialize_start; - uint32_t* ptext = NULL; + int ser = 0; + int sec = 0; if (!SEL_NOT_EMPTY(state)) { @@ -2380,6 +2399,8 @@ simple_yank(struct DrawState* state) return; simple_yank_alloc_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return; } @@ -2670,6 +2691,8 @@ wrap_success: return 0; wrap_alloc_error: + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp); + state->running = 0; return 1; }