чување 6aad24c2c8cff107d4d5651e948dd9e79d3fd434
родитељ 3b4e20e51d9111bd01aeea91c0e9230114b0cf1d
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Sat, 8 Jun 2024 22:11:04 +0200
strlc{at,py} -> memccpy
Diffstat:
| M | config.mk | | | 4 | ++-- |
| M | sled.c | | | 121 | +++++++++++++++++++++++++++++++++++++++++++++++++------------------------------ |
| D | strlcat.c | | | 54 | ------------------------------------------------------ |
| D | strlcpy.c | | | 49 | ------------------------------------------------- |
| M | util.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; \