@@ -259,6 +259,21 @@ 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 src string to the dest string, overwriting the terminating
+ * null word at the end of dest, and then adds a terminating null word.
+ * It will append at most size - u16_strlen(dst) - 1 bytes, NUL-terminating the result.
+ *
+ * @dest: destination buffer (null terminated)
+ * @src: source buffer (null terminated)
+ * @size: destination buffer size in bytes
+ * Return: total size of the created string in bytes.
+ * If return value >= size, truncation occurred.
+ */
+size_t u16_strlcat(u16 *dest, const u16 *src, size_t size);
+
/**
* utf16_to_utf8() - Convert an utf16 string to utf8
*
@@ -428,6 +428,26 @@ u16 *u16_strdup(const void *src)
return new;
}
+size_t u16_strlcat(u16 *dest, const u16 *src, size_t size)
+{
+ size_t dstrlen = u16_strnlen(dest, size >> 1);
+ size_t dlen = dstrlen * sizeof(u16);
+ size_t len = u16_strlen(src) * sizeof(u16);
+ size_t ret = dlen + len;
+
+ if (dlen >= size)
+ return ret;
+
+ dest += dstrlen;
+ size -= dlen;
+ if (len >= size)
+ len = size - sizeof(u16);
+
+ memcpy(dest, src, len);
+ dest[len >> 1] = u'\0';
+ return ret;
+}
+
/* Convert UTF-16 to UTF-8. */
uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size)
{
Provide u16 string version of strlcat(). Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org> --- include/charset.h | 15 +++++++++++++++ lib/charset.c | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+)