diff options
author | Masahisa Kojima <masahisa.kojima@linaro.org> | 2022-04-28 17:09:34 +0900 |
---|---|---|
committer | Heinrich Schuchardt <heinrich.schuchardt@canonical.com> | 2022-05-03 21:39:22 +0200 |
commit | eca08ce94ceb72358c5fb00e82506c0f74e65e3f (patch) | |
tree | 29ee5dde90ded64112e7b336ca09eb8c74ed5043 | |
parent | d30924f16bdceb4c34bfa1f230b04e91e28d5666 (diff) |
lib/charset: add u16_strlcat() function
Provide u16 string version of strlcat().
Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
-rw-r--r-- | include/charset.h | 14 | ||||
-rw-r--r-- | lib/charset.c | 16 |
2 files changed, 30 insertions, 0 deletions
diff --git a/include/charset.h b/include/charset.h index 38908e08f0d..20abfbe7524 100644 --- a/include/charset.h +++ b/include/charset.h @@ -262,6 +262,20 @@ u16 *u16_strcpy(u16 *dest, const u16 *src); u16 *u16_strdup(const void *src); /** + * u16_strlcat() - Append a length-limited, %NUL-terminated string to another + * + * Append the source string @src to the destination string @dest, overwriting + * null word at the end of @dest adding a terminating null word. + * + * @dest: zero terminated u16 destination string + * @src: zero terminated u16 source string + * @count: size of buffer in u16 words including taling 0x0000 + * Return: required size including trailing 0x0000 in u16 words + * If return value >= count, truncation occurred. + */ +size_t u16_strlcat(u16 *dest, const u16 *src, size_t size); + +/** * utf16_to_utf8() - Convert an utf16 string to utf8 * * Converts 'size' characters of the utf16 string 'src' to utf8 diff --git a/lib/charset.c b/lib/charset.c index de201cf3b9b..bece4985bfc 100644 --- a/lib/charset.c +++ b/lib/charset.c @@ -416,6 +416,22 @@ u16 *u16_strdup(const void *src) return new; } +size_t u16_strlcat(u16 *dest, const u16 *src, size_t count) +{ + size_t destlen = u16_strlen(dest); + size_t srclen = u16_strlen(src); + size_t ret = destlen + srclen + 1; + + if (destlen >= count) + return ret; + if (ret > count) + srclen -= ret - count; + memcpy(&dest[destlen], src, 2 * srclen); + dest[destlen + srclen] = 0x0000; + + return ret; +} + /* Convert UTF-16 to UTF-8. */ uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size) { |