sled

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

чување 6aad24c2c8cff107d4d5651e948dd9e79d3fd434
родитељ 3b4e20e51d9111bd01aeea91c0e9230114b0cf1d
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sat,  8 Jun 2024 22:11:04 +0200

strlc{at,py} -> memccpy

Diffstat:
Mconfig.mk | 4++--
Msled.c | 121+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Dstrlcat.c | 54------------------------------------------------------
Dstrlcpy.c | 49-------------------------------------------------
Mutil.h | 23+++--------------------
измењених датотека: 5, додавања: 80(+), брисања: 171(-)

diff --git a/config.mk b/config.mk @@ -7,9 +7,9 @@ CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \ # -D_XOPEN_SOURCE=700 -D_BSD_SOURCE INSTALL = install LIBS = -SRC = draw.c limit.c sled.c strlcat.c strlcpy.c util.c +SRC = draw.c limit.c sled.c util.c HEADERS = config.h draw.h limit.h termbox.h util.h version.h -OBJS = draw.o limit.o sled.o strlcat.o strlcpy.o util.o +OBJS = draw.o limit.o sled.o util.o PREFIX = /usr/local PROG = sled diff --git a/sled.c b/sled.c @@ -410,6 +410,7 @@ go_to_line_callback(struct DrawState* state) size_t lineno = 0; size_t len = 0; char* u8_input = NULL; + char* temp = NULL; if (!state) return; @@ -420,8 +421,8 @@ go_to_line_callback(struct DrawState* state) u8_input = calloc(len + 1, UTF8REPMAX); if (!u8_input) { - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); state->running = 0; return; } @@ -429,8 +430,8 @@ go_to_line_callback(struct DrawState* state) errno = 0; lineno = strtoul(u8_input, NULL, 10); if (errno) - STRLCPY(errors[ERR_INVALID_NUM], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_INVALID_NUM], + LINE_DEFAULT, temp); if (!*state->error) { if (lineno > state->rows_count - 1) @@ -450,6 +451,8 @@ void handle_key_event(struct tb_event* ev, struct DrawState* state) { const struct Key* current = NULL; + const char* temp = NULL; + if (!state) return; @@ -497,8 +500,8 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) || !IN(state->mode, M_INPUT_NUM)) input_insert_char(state, ev->ch); else - STRLCPY(errors[ERR_INPUT_NONNUM], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_INPUT_NONNUM], + LINE_DEFAULT, temp); return; } } @@ -515,7 +518,7 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) if (IN(state->mode, M_HELP)) { - STRLCPY(errors[ERR_DLG_OPEN], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_DLG_OPEN], LINE_DEFAULT, temp); return; } @@ -563,7 +566,7 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) } } - STRLCPY(errors[ERR_UNKNOWN_KEY], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_UNKNOWN_KEY], LINE_DEFAULT, temp); } int @@ -758,6 +761,7 @@ load_file(struct DrawState* state, long* lineno, long* col) size_t input_len = 0; uint32_t* newtext = NULL; uint32_t* ptext = NULL; + char* temp = NULL; input_line = calloc(input_size, 1); if (!input_line) @@ -784,7 +788,7 @@ load_file(struct DrawState* state, long* lineno, long* col) newchunk[row].text = newtext; } - STRLCPY(actions[ACT_READING], state->action, LINE_DEFAULT); + MEMCCPY(state->action, actions[ACT_READING], LINE_DEFAULT, temp); redraw_status(state); @@ -983,6 +987,7 @@ reread_file(struct DrawState* state) long lineno = 1; long col = 1; int result; + char* temp = NULL; free_drawstate(state, 1); init_drawstate(state, state->error, state->action, state->filename, @@ -992,11 +997,12 @@ reread_file(struct DrawState* state) switch (result) { case LOAD_ERR_CANT_ALLOC: - STRLCPY(errors[ERR_CANT_ALLOC], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, + temp); state->running = 0; break; case LOAD_ERR_CANT_OPEN_FILE: - STRLCPY(errors[ERR_CANT_OPEN], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_OPEN], LINE_DEFAULT, temp); state->running = 0; break; default:; @@ -1026,11 +1032,12 @@ save_file(struct DrawState* state) struct stat st; #endif int result = SAVE_ERR_NONE; + char* temp = NULL; if (!(buf = calloc(bufsize, 1))) return SAVE_ERR_CANT_ALLOC; - STRLCPY(actions[ACT_WRITING], state->action, LINE_DEFAULT); + MEMCCPY(state->action, actions[ACT_WRITING], LINE_DEFAULT, temp); redraw_status(state); errno = 0; @@ -1192,14 +1199,16 @@ search_update_callback(struct DrawState* state) int cancel_close(struct DrawState* state) { + char* temp = NULL; + if (!*state->error && !IN(state->mode, M_PROMPT) && !IN(state->mode, M_HELP)) { if (SEL_NOT_EMPTY(state)) clear_selection(state); else - STRLCPY(errors[ERR_EXIT_KEY], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_EXIT_KEY], + LINE_DEFAULT, temp); } else { @@ -1418,10 +1427,12 @@ erase_to_start(struct DrawState* state) int exit_program(struct DrawState* state) { + char* temp = NULL; + if (state->dirty) { SET(state->mode, M_PROMPT); - STRLCPY(prompt_dirty, state->prompt, LINE_DEFAULT); + MEMCCPY(state->prompt, prompt_dirty, LINE_DEFAULT, temp); state->prompt_callback = quit_callback; } else @@ -1860,6 +1871,7 @@ paste_from_paste(struct DrawState* state) uint32_t* rest = NULL; size_t rest_size = 0; struct Coord newpos; + char* temp = NULL; if (!state->paste_count) return 0; @@ -1899,7 +1911,8 @@ paste_from_paste(struct DrawState* state) if (!newtext) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, + temp); goto paste_from_paste_cleanup; } u32_strncpy(newtext, line->text, state->coord.col); @@ -1922,8 +1935,8 @@ paste_from_paste(struct DrawState* state) if (!rest) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); goto paste_from_paste_cleanup; } u32_strncpy(rest, line->text + state->coord.col, rest_size); @@ -1992,7 +2005,7 @@ prev_match(struct DrawState* state) return 0; *state->error = 0; - + row = state->coord.row; while (row >= 0) { @@ -2035,12 +2048,14 @@ prev_match(struct DrawState* state) int reread_or_callback(struct DrawState* state) { + char* temp = NULL; + if (!state) return 1; if (state->dirty) { SET(state->mode, M_PROMPT); - STRLCPY(prompt_reread_dirty, state->prompt, LINE_DEFAULT); + MEMCCPY(state->prompt, prompt_reread_dirty, LINE_DEFAULT, temp); state->prompt_callback = reread_callback; } else @@ -2051,6 +2066,8 @@ reread_or_callback(struct DrawState* state) int show_go_to_line(struct DrawState* state) { + char* temp = NULL; + state->input_title = (char*)go_to_dialog_title; state->input_callback = go_to_line_callback; if (!state->input) @@ -2058,8 +2075,8 @@ show_go_to_line(struct DrawState* state) if (!(state->input = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2073,6 +2090,8 @@ show_go_to_line(struct DrawState* state) int show_replace(struct DrawState* state) { + char* temp = NULL; + state->input_title = (char*)replace_dialog_title; state->input_callback = search_replace_replace_dialog_callback; state->input_update_callback = NULL; @@ -2081,8 +2100,8 @@ show_replace(struct DrawState* state) if (!(state->input = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2097,13 +2116,15 @@ show_replace(struct DrawState* state) int show_search(struct DrawState* state) { + char* temp = NULL; + if (!state->search) { if (!(state->search = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2116,8 +2137,8 @@ show_search(struct DrawState* state) if (!(state->input = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2132,13 +2153,15 @@ show_search(struct DrawState* state) int show_search_replace(struct DrawState* state) { + char* temp = NULL; + if (!state->search) { if (!(state->search = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2151,8 +2174,8 @@ show_search_replace(struct DrawState* state) if (!(state->input = calloc(MAXINPUT, sizeof(uint32_t)))) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return 0; } } @@ -2179,6 +2202,7 @@ simple_insert_line(struct DrawState* state) struct BufferLine* newchunk = NULL; struct BufferLine* line = NULL; uint32_t* ptext = NULL; + char* temp = NULL; if (state->rows_count == state->buffer_size) { @@ -2188,8 +2212,8 @@ simple_insert_line(struct DrawState* state) if (!newchunk) { state->running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state->error, - LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); return; } state->buffer = newchunk; @@ -2402,29 +2426,33 @@ toggle_selection(struct DrawState* state) int write_file(struct DrawState* state) { + int result; + char* temp = NULL; + if (!state) return 1; - int result = save_file(state); + result = save_file(state); switch (result) { case SAVE_ERR_CANT_ALLOC: - STRLCPY(errors[ERR_CANT_ALLOC], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, + temp); state->running = 0; break; case SAVE_ERR_CANT_OPEN_FILE: - STRLCPY(errors[ERR_CANT_SAVE], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_SAVE], LINE_DEFAULT, temp); state->running = 0; break; case SAVE_ERR_CANT_COPY_FILE: - STRLCPY(errors[ERR_CANT_COPY], state->error, LINE_DEFAULT); + MEMCCPY(state->error, errors[ERR_CANT_COPY], LINE_DEFAULT, temp); state->running = 0; break; case SAVE_ERR_CANT_READLINK: case SAVE_ERR_CANT_STAT_FILE: case SAVE_ERR_CANT_SYMLINK: case SAVE_ERR_CANT_UNLINK: - STRLCPY(strerror(errno), state->error, LINE_DEFAULT); + MEMCCPY(state->error, strerror(errno), LINE_DEFAULT, temp); state->running = 0; break; case SAVE_ERR_NONE: @@ -2463,6 +2491,7 @@ main(int argc, char** argv) int dir_access_errno; char* dir = NULL; char* pdir = NULL; + char* temp = NULL; *error = 0; *action = 0; @@ -2621,11 +2650,12 @@ main(int argc, char** argv) /* Backup filename is the target file + suffix if the file to * write is not a new file and is a symlink, otherwise file + * suffix */ - STRLCPY(state.new_file ? state.filename + MEMCCPY(state.backup_filename, + state.new_file ? state.filename : (state.rfn_len > 0 ? state.real_filename : state.filename), - state.backup_filename, limits[L_PATH_MAX]); - STRLCAT(backup_suffix, state.backup_filename, limits[L_PATH_MAX]); + limits[L_PATH_MAX], temp); + MEMCCPY(temp - 1, backup_suffix, limits[L_PATH_MAX], temp); #ifdef __OpenBSD__ if (unveil(state.backup_filename, "rwc") < 0) { @@ -2642,8 +2672,7 @@ main(int argc, char** argv) if (!(pdir = realloc(dir, limits[L_PATH_MAX]))) { result = 1; - print_error(1, - "Allocation failed (out of memory?)"); + print_error(1, "Allocation failed (out of memory?)"); goto general_error; } dir = pdir; @@ -2748,8 +2777,8 @@ init_termbox: if (!draw(&state)) { state.running = 0; - STRLCPY(errors[ERR_CANT_ALLOC], state.error, - LINE_DEFAULT); + MEMCCPY(state.error, errors[ERR_CANT_ALLOC], + LINE_DEFAULT, temp); } tb_present(); result = tb_poll_event(&ev); diff --git a/strlcat.c b/strlcat.c @@ -1,54 +0,0 @@ -/* $OpenBSD: strlcat.c,v 1.9 2019/01/25 00:19:26 millert Exp $ */ - -/* - * Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <string.h> - -/* - * Appends src to string dst of size dsize (unlike strncat, dsize is the - * full size of dst, not space left). At most dsize-1 characters - * will be copied. Always NUL terminates (unless dsize <= strlen(dst)). - * Returns strlen(src) + MIN(dsize, strlen(initial dst)). - * If retval >= siz, truncation occurred. - */ -size_t -strlcat(char *dst, const char *src, size_t dsize) -{ - const char *odst = dst; - const char *osrc = src; - size_t n = dsize; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end. */ - while (n-- != 0 && *dst != '\0') - dst++; - dlen = dst - odst; - n = dsize - dlen; - - if (n-- == 0) - return(dlen + strlen(src)); - while (*src != '\0') { - if (n != 0) { - *dst++ = *src; - n--; - } - src++; - } - *dst = '\0'; - - return(dlen + (src - osrc)); /* count does not include NUL */ -} diff --git a/strlcpy.c b/strlcpy.c @@ -1,49 +0,0 @@ -/* $OpenBSD: strlcpy.c,v 1.9 2019/01/25 00:19:26 millert Exp $ */ - -/* - * Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <string.h> - -/* - * Copy string src to buffer dst of size dsize. At most dsize-1 - * chars will be copied. Always NUL terminates (unless dsize == 0). - * Returns strlen(src); if retval >= dsize, truncation occurred. - */ -size_t -strlcpy(char *dst, const char *src, size_t dsize) -{ - const char *osrc = src; - size_t nleft = dsize; - - /* Copy as many bytes as will fit. */ - if (nleft != 0) { - while (--nleft != 0) { - if ((*dst++ = *src++) == '\0') - break; - } - } - - /* Not enough room in dst, add NUL and traverse rest of src. */ - if (nleft == 0) { - if (dsize != 0) - *dst = '\0'; /* NUL-terminate dst */ - while (*src++) - ; - } - - return(src - osrc - 1); /* count does not include NUL */ -} diff --git a/util.h b/util.h @@ -19,24 +19,6 @@ exit(1); \ } \ } while (0) -#define STRLCAT(tail, head, totallen) \ - do \ - { \ - if (strlcat(head, tail, totallen) >= totallen) \ - { \ - print_error(1, "strlcat:%d: Overflow", __LINE__); \ - exit(1); \ - } \ - } while (0) -#define STRLCPY(from, to, tolen) \ - do \ - { \ - if (strlcpy(to, from, tolen) >= tolen) \ - { \ - print_error(1, "strlcpy:%d: Overflow", __LINE__); \ - exit(1); \ - } \ - } while (0) #define ENSURE_SIZE(to, temp, tosize, testsize, fromsize, label, type) \ do \ @@ -47,9 +29,10 @@ temp = realloc(to, tosize * sizeof(type)); \ if (!temp) \ { \ + char* ctemp = NULL; \ state->running = 0; \ - STRLCPY(errors[ERR_CANT_ALLOC], state->error, \ - LINE_DEFAULT); \ + MEMCCPY(state->error, errors[ERR_CANT_ALLOC], \ + LINE_DEFAULT, ctemp); \ goto label; \ } \ to = temp; \