From: Jaroslav Kysela Date: Mon, 14 Apr 2025 16:34:45 +0000 (+0200) Subject: add snd_strlcat() function X-Git-Tag: v1.2.14~2 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=8291d2c6014e460d9b85a75bebc9a78ffb446a41;p=alsa-lib.git add snd_strlcat() function Signed-off-by: Jaroslav Kysela --- diff --git a/include/local.h b/include/local.h index 55f252df..2498cd26 100644 --- a/include/local.h +++ b/include/local.h @@ -267,6 +267,7 @@ int _snd_safe_strtod(const char *str, double *val); int snd_send_fd(int sock, void *data, size_t len, int fd); int snd_receive_fd(int sock, void *data, size_t len, int *fd); size_t snd_strlcpy(char *dst, const char *src, size_t size); +size_t snd_strlcat(char *dst, const char *src, size_t size); /* * error messages diff --git a/src/error.c b/src/error.c index c06af7c7..8db7556b 100644 --- a/src/error.c +++ b/src/error.c @@ -191,11 +191,38 @@ snd_lib_error_handler_t snd_err_msg = snd_err_msg_default; */ size_t snd_strlcpy(char *dst, const char *src, size_t size) { - size_t ret = strlen(src); - if (size) { - size_t len = ret >= size ? size - 1 : ret; - memcpy(dst, src, len); - dst[len] = '\0'; - } - return ret; + size_t ret = strlen(src); + if (size) { + size_t len = ret >= size ? size - 1 : ret; + memcpy(dst, src, len); + dst[len] = '\0'; + } + return ret; +} + +/** + * \brief Append a C-string into a sized buffer + * \param dst Where to append the string to + * \param src Where to copy the string from + * \param size Size of destination buffer + * \retval The total string length (no trimming) + * + * The result is always a valid NUL-terminated string that fits + * in the buffer (unless, of course, the buffer size is zero). + * It does not pad out the result. + */ +size_t snd_strlcat(char *dst, const char *src, size_t size) +{ + size_t dst_len = strlen(dst); + size_t len = strlen(src); + size_t ret = dst_len + len; + if (dst_len < size) { + dst += dst_len; + size -= dst_len; + if (len >= size) + len = size - 1; + memcpy(dst, src, len); + dst[len] = '\0'; + } + return ret; }