/* SPDX-License-Identifier: GPL-2.0+ */
/*
 *  charset conversion utils
 *
 *  Copyright (c) 2017 Rob Clark
 */

#ifndef __CHARSET_H_
#define __CHARSET_H_

#include <linux/types.h>

#define MAX_UTF8_PER_UTF16 3

/**
 * utf16_strlen() - Get the length of an utf16 string
 *
 * Returns the number of 16 bit characters in an utf16 string, not
 * including the terminating NULL character.
 *
 * @in     the string to measure
 * @return the string length
 */
size_t utf16_strlen(const uint16_t *in);

/**
 * utf16_strnlen() - Get the length of a fixed-size utf16 string.
 *
 * Returns the number of 16 bit characters in an utf16 string,
 * not including the terminating NULL character, but at most
 * 'count' number of characters.  In doing this, utf16_strnlen()
 * looks at only the first 'count' characters.
 *
 * @in     the string to measure
 * @count  the maximum number of characters to count
 * @return the string length, up to a maximum of 'count'
 */
size_t utf16_strnlen(const uint16_t *in, size_t count);

/**
 * utf16_strcpy() - UTF16 equivalent of strcpy()
 */
uint16_t *utf16_strcpy(uint16_t *dest, const uint16_t *src);

/**
 * utf16_strdup() - UTF16 equivalent of strdup()
 */
uint16_t *utf16_strdup(const uint16_t *s);

/**
 * utf16_to_utf8() - Convert an utf16 string to utf8
 *
 * Converts 'size' characters of the utf16 string 'src' to utf8
 * written to the 'dest' buffer.
 *
 * NOTE that a single utf16 character can generate up to 3 utf8
 * characters.  See MAX_UTF8_PER_UTF16.
 *
 * @dest   the destination buffer to write the utf8 characters
 * @src    the source utf16 string
 * @size   the number of utf16 characters to convert
 * @return the pointer to the first unwritten byte in 'dest'
 */
uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size);

/**
 * utf8_to_utf16() - Convert an utf8 string to utf16
 *
 * Converts up to 'size' characters of the utf16 string 'src' to utf8
 * written to the 'dest' buffer. Stops at 0x00.
 *
 * @dest   the destination buffer to write the utf8 characters
 * @src    the source utf16 string
 * @size   maximum number of utf16 characters to convert
 * @return the pointer to the first unwritten byte in 'dest'
 */
uint16_t *utf8_to_utf16(uint16_t *dest, const uint8_t *src, size_t size);

#endif /* __CHARSET_H_ */
