#pragma once namespace stingray_plugin_foundation { template class Array; class Allocator; // Functions for string encoding. namespace encoding { // Encodes the unicode character `c` in UTF-8 at the position pointed // to by `buffer`. `buffer` must have room for at least 5 bytes. // Returns a pointer to the first character in buffer after the end of // the encoding. char *utf8_encode(int codepoint, char *utf8); // Decodes the UTF-8 character at the start of `buffer` into a unicode // code point and returns it in `res`. Returns a pointer to the first // character in the buffer after the UTF-8 character that was just // consumed. const char *utf8_decode(const char *utf8, int &codepoint); // Returns the number of bytes used by the UTF-8 codepoint pointed to by // buffer. Advance by this amount to get to the next code point. unsigned utf8_codepoint_bytes(const char *utf8); // Decodes an UTF-8 string to a vector of codepoints. void utf8_decode(const char *utf8, Array &codepoints); // Encode a vector of codepoints to an array of UTF-8 characters. void utf8_encode(const Array &codepoints, Array &utf8); // Encode an array of codepoints to an array of UTF-8 characters. void utf8_encode(const unsigned *codepoints, unsigned size, Array &utf8); // Determines the begin and end position of the utf8 codepoint at // `utf8`[index]. `end` is an index pointing to the byte after the // utf-8 codepoint. void utf8_location(const char *utf8, unsigned index, unsigned &begin, unsigned &end); // Returns a pointer to the next character if the character at utf8 is valid, otherwise // returns nullptr. const char *utf8_valid_first(const char *utf8); // Returns true if the string utf8 contains only valid UTF-8 code points and // false otherwise. bool utf8_valid_all(const char *utf8); // Returns the number of of bytes needed to store the UCS-2 encoded wchar_t * // as an UTF-8 value, including the zero byte at the end of the UTF-8 string. unsigned wstr_to_utf8_bytes(const wchar_t *ucs2); // Converts an UCS-2 encoded w_char * to an UTF-8 encoded char *. // `size` specifies the size of the buffer. If the conversion requires // more than `size` bytes, an assert is thrown. void wstr_to_utf8(const wchar_t *ucs2, char *utf8, unsigned size); // Converts an UCS-2 encoded w_char * to an UTF-8 encoded char *, // allocating memory as necessary. void wstr_to_utf8(const wchar_t *ucs2, Array &utf8); // Returns the number of of tokens needed to store the UTF-8 encoded char * // as an UCS-2 value, including the zero token at the end of the UCS-2 string. unsigned utf8_to_wstr_tokens(const char *utf8); // Converts an UTF-8 encoded char * to an UCS-2 encoded wchar_t *. // `tokens` specifies the number of tokens in the buffer. If the // converted string contains more tokens, an assert is thrown. void utf8_to_wstr(const char *utf8, wchar_t *ucs2, unsigned tokens); // Converts an UTF-8 encoded char * to an UCS-2 encoded wchar_t *, // allocating memory as necessary. void utf8_to_wstr(const char *utf8, Array &ucs2); // Converts an UTF-8 encoded char * to an UCS-2 encoded wchar_t *, // allocated using the specified allocator. wchar_t *utf8_to_wstr(const char *utf8, Allocator &a); } // namespace encoding } // namespace stingray_plugin_foundation #include "encoding.inl"