чување 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:
| M | sled.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)