1407d40f4SRob Clark /* 2407d40f4SRob Clark * charset conversion utils 3407d40f4SRob Clark * 4407d40f4SRob Clark * Copyright (c) 2017 Rob Clark 5407d40f4SRob Clark * 6407d40f4SRob Clark * SPDX-License-Identifier: GPL-2.0+ 7407d40f4SRob Clark */ 8407d40f4SRob Clark 9407d40f4SRob Clark #ifndef __CHARSET_H_ 10407d40f4SRob Clark #define __CHARSET_H_ 11407d40f4SRob Clark 12*8f7de514SShawn Lin #include <linux/kernel.h> 13*8f7de514SShawn Lin #include <linux/types.h> 14*8f7de514SShawn Lin 15407d40f4SRob Clark #define MAX_UTF8_PER_UTF16 4 16407d40f4SRob Clark 17407d40f4SRob Clark /** 18407d40f4SRob Clark * utf16_strlen() - Get the length of an utf16 string 19407d40f4SRob Clark * 20407d40f4SRob Clark * Returns the number of 16 bit characters in an utf16 string, not 21407d40f4SRob Clark * including the terminating NULL character. 22407d40f4SRob Clark * 23407d40f4SRob Clark * @in the string to measure 24407d40f4SRob Clark * @return the string length 25407d40f4SRob Clark */ 26407d40f4SRob Clark size_t utf16_strlen(const uint16_t *in); 27407d40f4SRob Clark 28407d40f4SRob Clark /** 29407d40f4SRob Clark * utf16_strnlen() - Get the length of a fixed-size utf16 string. 30407d40f4SRob Clark * 31407d40f4SRob Clark * Returns the number of 16 bit characters in an utf16 string, 32407d40f4SRob Clark * not including the terminating NULL character, but at most 33407d40f4SRob Clark * 'count' number of characters. In doing this, utf16_strnlen() 34407d40f4SRob Clark * looks at only the first 'count' characters. 35407d40f4SRob Clark * 36407d40f4SRob Clark * @in the string to measure 37407d40f4SRob Clark * @count the maximum number of characters to count 38407d40f4SRob Clark * @return the string length, up to a maximum of 'count' 39407d40f4SRob Clark */ 40407d40f4SRob Clark size_t utf16_strnlen(const uint16_t *in, size_t count); 41407d40f4SRob Clark 42407d40f4SRob Clark /** 43407d40f4SRob Clark * utf16_strcpy() - UTF16 equivalent of strcpy() 44407d40f4SRob Clark */ 45407d40f4SRob Clark uint16_t *utf16_strcpy(uint16_t *dest, const uint16_t *src); 46407d40f4SRob Clark 47407d40f4SRob Clark /** 48407d40f4SRob Clark * utf16_strdup() - UTF16 equivalent of strdup() 49407d40f4SRob Clark */ 50407d40f4SRob Clark uint16_t *utf16_strdup(const uint16_t *s); 51407d40f4SRob Clark 52407d40f4SRob Clark /** 53407d40f4SRob Clark * utf16_to_utf8() - Convert an utf16 string to utf8 54407d40f4SRob Clark * 55407d40f4SRob Clark * Converts 'size' characters of the utf16 string 'src' to utf8 56407d40f4SRob Clark * written to the 'dest' buffer. 57407d40f4SRob Clark * 58407d40f4SRob Clark * NOTE that a single utf16 character can generate up to 4 utf8 59407d40f4SRob Clark * characters. See MAX_UTF8_PER_UTF16. 60407d40f4SRob Clark * 61407d40f4SRob Clark * @dest the destination buffer to write the utf8 characters 62407d40f4SRob Clark * @src the source utf16 string 63407d40f4SRob Clark * @size the number of utf16 characters to convert 64407d40f4SRob Clark * @return the pointer to the first unwritten byte in 'dest' 65407d40f4SRob Clark */ 66407d40f4SRob Clark uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size); 67407d40f4SRob Clark 68407d40f4SRob Clark #endif /* __CHARSET_H_ */ 69