sled

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

чување a5d7604bcb37c64832ef8d6d877758b58eee82b1
родитељ b77e0ed4ba44ffa9171e8d1d8375d7026278f038
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun,  9 Jun 2024 02:19:44 +0200

Bugfix: properly set new_file; bugfix: set dirname of local files to .; 
a few more strncpy -> memccpy

Diffstat:
Mdraw.c | 6+++---
Msled.c | 20++++++++++++--------
Mutil.h | 21+++++++++++++--------
измењених датотека: 3, додавања: 28(+), брисања: 19(-)

diff --git a/draw.c b/draw.c @@ -128,7 +128,7 @@ init_drawstate(struct DrawState* state, char* error, char* action, state->input_update_callback = NULL; state->running = 1; state->dirty = 0; - state->new_file = 1; + state->new_file = 0; state->recalculate_size = 1; CLEAR(state->mode, M_HELP | M_INPUT | M_INPUT_NUM | M_PROMPT | M_SELECTION); @@ -782,8 +782,8 @@ draw_status(const struct DrawState* state) pseg->callback(buf, limits[L_LINE_MAX], pseg->format, seg_size, state); else - strncpy(buf, pseg->format, limits[L_LINE_MAX]); - buf[limits[L_LINE_MAX] - 1] = 0; + memccpy(buf, pseg->format, 0, + limits[L_LINE_MAX]); if (pseg == status_segments + LEN(status_segments) - 1) seg_size = state->maxx - 1 - current_start; if (!draw_string(current_start, state->maxy - 1, diff --git a/sled.c b/sled.c @@ -221,7 +221,7 @@ dirname(char* dir, char* path, const size_t dir_size) *p = 0; return dir; } - else if (p == dir) + else if (p == dir && *p == '/') return dir; } dir[0] = '.'; @@ -451,7 +451,7 @@ void handle_key_event(struct tb_event* ev, struct DrawState* state) { const struct Key* current = NULL; - const char* temp = NULL; + char* temp = NULL; if (!state) return; @@ -1982,8 +1982,7 @@ paste_from_paste(struct DrawState* state) newpos.col = state->paste[state->paste_count - 1].length; newpos.row += state->paste_count - 1; state->saved_column = display_length(state, - state->paste[state->paste_count - 1].text, - newpos.col); + state->paste[state->paste_count - 1].text, newpos.col); } position_to(state, newpos.row, newpos.col); @@ -2573,8 +2572,7 @@ main(int argc, char** argv) } *filename = 0; - strncpy(filename, argv[1], limits[L_PATH_MAX]); - filename[limits[L_PATH_MAX] - 1] = 0; + MEMCCPY(filename, argv[1], limits[L_PATH_MAX], temp); if (!*filename) { free(filename); @@ -2657,7 +2655,12 @@ main(int argc, char** argv) : (state.rfn_len > 0 ? state.real_filename : state.filename), limits[L_PATH_MAX], temp); - MEMCCPY(temp - 1, backup_suffix, limits[L_PATH_MAX], temp); + if (!temp) /* filename is full, turning off backups */ + state.backup_possible = 0; + else + MEMCCPY_EXT((temp - 1), state.backup_filename, backup_suffix, + limits[L_PATH_MAX] + temp - state.backup_filename, + temp); #ifdef __OpenBSD__ if (unveil(state.backup_filename, "rwc") < 0) { @@ -2694,7 +2697,8 @@ main(int argc, char** argv) dir_access = access(dir, W_OK | X_OK); dir_access_errno = errno; #ifdef BACKUP_FAIL_OK - state.backup_possible = dir_access != -1; + if (state.backup_possible) + state.backup_possible = dir_access != -1; #endif /* BACKUP_FAIL_OK */ if (stat(state.filename, &st) == -1) { diff --git a/util.h b/util.h @@ -10,14 +10,19 @@ #define LEN(x) (sizeof(x) / sizeof(x[0])) #define MAX(a, b) ((a > b) ? (a) : (b)) #define MIN(a, b) ((a < b) ? (a) : (b)) -#define MEMCCPY(to, from, tolen, temp) \ - do \ - { \ - if (!(temp = memccpy(to, from, 0, tolen))) \ - { \ - print_error(1, "memccpy:%d: Overflow", __LINE__); \ - exit(1); \ - } \ +#define MEMCCPY(to, from, tolen, temp) \ + do \ + { \ + temp = memccpy(to, from, 0, tolen); \ + if (!temp) \ + to[tolen - 1] = 0; \ + } while (0) +#define MEMCCPY_EXT(to, fallbackto, from, tolen, temp) \ + do \ + { \ + temp = memccpy(to, from, 0, tolen); \ + if (!temp) \ + fallbackto[tolen - 1] = 0; \ } while (0) #define ENSURE_SIZE(to, temp, tosize, testsize, fromsize, label, type) \