sled

Једноставни уређивач текста
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 18fbe969e8becdcb3ef9fced33154420f25d06f3
родитељ 1bc19f86ebd14ba5d144b2a32e87b87cbf609b82
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu, 24 Feb 2022 22:13:21 +0100

sled.c: Quit on failed allocation; add check for moving file to backup

Signed-off-by: Страхиња Радић <contact@strahinja.org>

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

diff --git a/sled.c b/sled.c @@ -101,9 +101,11 @@ reread_file(struct DrawState* state) { case LOAD_ERR_CANT_ALLOC: strcpy(state->error, errors[ERR_CANT_ALLOC]); + state->running = 0; break; case LOAD_ERR_CANT_OPEN_FILE: strcpy(state->error, errors[ERR_CANT_OPEN]); + state->running = 0; break; default:; } @@ -126,6 +128,7 @@ go_to_line_callback(struct DrawState* state) if (!u8_input) { strcpy(state->error, errors[ERR_CANT_ALLOC]); + state->running = 0; return; } unicode_string_to_u8(u8_input, state->input, len + 1); @@ -206,13 +209,19 @@ create_file(struct DrawState* state) newchunk = calloc(ALLOC_DELTA, sizeof(struct BufferLine)); if (!newchunk) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } for (size_t row = 0; row < ALLOC_DELTA; row++) { init_bufferline(newchunk + row); newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } newchunk[row].text = newtext; } state->buffer = newchunk; @@ -235,13 +244,19 @@ load_file(struct DrawState* state, long* lineno, long* col) newchunk = calloc(ALLOC_DELTA, sizeof(struct BufferLine)); if (!newchunk) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } for (size_t row = 0; row < ALLOC_DELTA; row++) { init_bufferline(newchunk + row); newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } newchunk[row].text = newtext; } @@ -272,7 +287,10 @@ load_file(struct DrawState* state, long* lineno, long* col) newchunk = realloc(state->buffer, state->buffer_size * sizeof(struct BufferLine)); if (!newchunk) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } state->buffer = newchunk; for (size_t row = state->buffer_size - ALLOC_DELTA; row < state->buffer_size; row++) @@ -280,7 +298,10 @@ load_file(struct DrawState* state, long* lineno, long* col) init_bufferline(state->buffer + row); newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) + { + state->running = 0; return LOAD_ERR_CANT_ALLOC; + } state->buffer[row].text = newtext; } line = state->buffer + state->buffer_size - ALLOC_DELTA; @@ -309,10 +330,16 @@ save_file(struct DrawState* state) struct stat st; if (!(buf = calloc(MAXBUFLINE, 1))) + { + state->running = 0; return SAVE_ERR_CANT_ALLOC; + } #ifdef CREATE_BACKUPS if (!(backup_filename = calloc(MAXPATH, 1))) + { + state->running = 0; return SAVE_ERR_CANT_ALLOC; + } #endif strcpy(state->action, actions[ACT_WRITING]); @@ -323,7 +350,11 @@ save_file(struct DrawState* state) { strcpy(backup_filename, state->filename); strcat(backup_filename, backup_suffix); - rename(state->filename, backup_filename); + if (rename(state->filename, backup_filename) == -1) + { + strcpy(state->error, errors[SAVE_ERR_CANT_MOVE_FILE]); + return SAVE_ERR_CANT_MOVE_FILE; + } } #endif @@ -403,7 +434,10 @@ yank_to_paste(struct DrawState* state) init_bufferline(newbuf + row); newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) + { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); + } newbuf[row].text = newtext; newbuf[row].length = 0; } @@ -472,6 +506,7 @@ paste_from_paste(struct DrawState* state) newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); goto paste_from_paste_cleanup; } @@ -490,6 +525,7 @@ paste_from_paste(struct DrawState* state) rest = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!rest) { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); goto paste_from_paste_cleanup; } @@ -1231,6 +1267,7 @@ insert_line(struct DrawState* state) state->buffer_size * sizeof(struct BufferLine)); if (!newchunk) { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); return 0; } @@ -1243,6 +1280,7 @@ insert_line(struct DrawState* state) newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); return 0; } @@ -1298,12 +1336,18 @@ write_file(struct DrawState* state) { case SAVE_ERR_CANT_ALLOC: strcpy(state->error, errors[ERR_CANT_ALLOC]); + state->running = 0; break; case SAVE_ERR_CANT_OPEN_FILE: strcpy(state->error, errors[ERR_CANT_SAVE]); + state->running = 0; + break; + case SAVE_ERR_CANT_MOVE_FILE: + strcpy(state->error, strerror(errno)); + state->running = 0; break; default: - state->error[0] = 0; + *state->error = 0; state->dirty = 0; } @@ -1620,6 +1664,7 @@ show_go_to_line(struct DrawState* state) { if (!(state->input = calloc(MAXINPUT, sizeof(uint32_t)))) { + state->running = 0; strcpy(state->error, errors[ERR_CANT_ALLOC]); return 0; } @@ -1804,7 +1849,7 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) { for (int key = 0; key < LEN(input_dialog_keys); key++) { - current = &input_dialog_keys[key]; + current = input_dialog_keys + key; if (((current->ev.key == ev->key) && !ev->ch) || (current->ev.ch && (current->ev.ch == ev->ch))) @@ -2007,9 +2052,13 @@ init_termbox: state.input_dialog_width = calculate_input_dialog_width(&state); state.maxy = tb_height(); + recalculate_size = 0; } if (!draw(&state)) + { + state->running = 0; strcpy(state.error, errors[ERR_CANT_ALLOC]); + } tb_present(); result = tb_poll_event(&ev); if (result == TB_OK && ev.type == TB_EVENT_RESIZE)