1*407d40f4SRob Clark /* 2*407d40f4SRob Clark * charset conversion utils 3*407d40f4SRob Clark * 4*407d40f4SRob Clark * Copyright (c) 2017 Rob Clark 5*407d40f4SRob Clark * 6*407d40f4SRob Clark * SPDX-License-Identifier: GPL-2.0+ 7*407d40f4SRob Clark */ 8*407d40f4SRob Clark 9*407d40f4SRob Clark #ifndef __CHARSET_H_ 10*407d40f4SRob Clark #define __CHARSET_H_ 11*407d40f4SRob Clark 12*407d40f4SRob Clark #define MAX_UTF8_PER_UTF16 4 13*407d40f4SRob Clark 14*407d40f4SRob Clark /** 15*407d40f4SRob Clark * utf16_strlen() - Get the length of an utf16 string 16*407d40f4SRob Clark * 17*407d40f4SRob Clark * Returns the number of 16 bit characters in an utf16 string, not 18*407d40f4SRob Clark * including the terminating NULL character. 19*407d40f4SRob Clark * 20*407d40f4SRob Clark * @in the string to measure 21*407d40f4SRob Clark * @return the string length 22*407d40f4SRob Clark */ 23*407d40f4SRob Clark size_t utf16_strlen(const uint16_t *in); 24*407d40f4SRob Clark 25*407d40f4SRob Clark /** 26*407d40f4SRob Clark * utf16_strnlen() - Get the length of a fixed-size utf16 string. 27*407d40f4SRob Clark * 28*407d40f4SRob Clark * Returns the number of 16 bit characters in an utf16 string, 29*407d40f4SRob Clark * not including the terminating NULL character, but at most 30*407d40f4SRob Clark * 'count' number of characters. In doing this, utf16_strnlen() 31*407d40f4SRob Clark * looks at only the first 'count' characters. 32*407d40f4SRob Clark * 33*407d40f4SRob Clark * @in the string to measure 34*407d40f4SRob Clark * @count the maximum number of characters to count 35*407d40f4SRob Clark * @return the string length, up to a maximum of 'count' 36*407d40f4SRob Clark */ 37*407d40f4SRob Clark size_t utf16_strnlen(const uint16_t *in, size_t count); 38*407d40f4SRob Clark 39*407d40f4SRob Clark /** 40*407d40f4SRob Clark * utf16_strcpy() - UTF16 equivalent of strcpy() 41*407d40f4SRob Clark */ 42*407d40f4SRob Clark uint16_t *utf16_strcpy(uint16_t *dest, const uint16_t *src); 43*407d40f4SRob Clark 44*407d40f4SRob Clark /** 45*407d40f4SRob Clark * utf16_strdup() - UTF16 equivalent of strdup() 46*407d40f4SRob Clark */ 47*407d40f4SRob Clark uint16_t *utf16_strdup(const uint16_t *s); 48*407d40f4SRob Clark 49*407d40f4SRob Clark /** 50*407d40f4SRob Clark * utf16_to_utf8() - Convert an utf16 string to utf8 51*407d40f4SRob Clark * 52*407d40f4SRob Clark * Converts 'size' characters of the utf16 string 'src' to utf8 53*407d40f4SRob Clark * written to the 'dest' buffer. 54*407d40f4SRob Clark * 55*407d40f4SRob Clark * NOTE that a single utf16 character can generate up to 4 utf8 56*407d40f4SRob Clark * characters. See MAX_UTF8_PER_UTF16. 57*407d40f4SRob Clark * 58*407d40f4SRob Clark * @dest the destination buffer to write the utf8 characters 59*407d40f4SRob Clark * @src the source utf16 string 60*407d40f4SRob Clark * @size the number of utf16 characters to convert 61*407d40f4SRob Clark * @return the pointer to the first unwritten byte in 'dest' 62*407d40f4SRob Clark */ 63*407d40f4SRob Clark uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size); 64*407d40f4SRob Clark 65*407d40f4SRob Clark #endif /* __CHARSET_H_ */ 66