28 size_t len, uint32_t *ucs4,
size_t *clen)
30 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
32 if (s == NULL || ucs4 == NULL || clen == NULL)
38 if (*ss < 0xD800 || *ss > 0xDFFF) {
41 }
else if (0xD800 <= *ss && *ss <= 0xDBFF) {
46 if (0xDC00 <= ss[1] && ss[1] <= 0xDFFF) {
48 *ucs4 = (((ss[0] & 0x3FF) << 10) | (ss[1] & 0x3FF))
73 uint16_t *ss = (uint16_t *) (
void *) s;
76 if (s == NULL ||
len == NULL)
78 else if (ucs4 < 0x10000) {
79 *ss = (uint16_t) ucs4;
81 }
else if (ucs4 < 0x110000) {
82 ss[0] = 0xD800 | (((ucs4 >> 16) & 0x1f) - 1) | (ucs4 >> 10);
83 ss[1] = 0xDC00 | (ucs4 & 0x3ff);
105 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
106 const uint16_t *end = (
const uint16_t *) (
const void *) (s +
max);
109 if (s == NULL ||
len == NULL)
113 if (*ss < 0xD800 || 0xDFFF < *ss)
136 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
138 if (s == NULL ||
len == NULL)
141 if (*ss < 0xD800 || 0xDFFF < *ss)
161 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
163 if (s == NULL || prevoff == NULL)
168 else if (ss[-1] < 0xDC00 || ss[-1] > 0xDFFF)
171 *prevoff = (off < 4) ? 0 : off - 4;
187 uint32_t off, uint32_t *nextoff)
189 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
191 if (s == NULL || off >=
len || nextoff == NULL)
196 else if (ss[1] < 0xD800 || ss[1] > 0xDBFF)
199 *nextoff = (
len - off < 6) ?
len : off + 4;
215 uint32_t
len, uint32_t off, uint32_t *nextoff)
217 const uint16_t *ss = (
const uint16_t *) (
const void *) s;
219 if (s == NULL || off >=
len || nextoff == NULL)
225 }
else if (ss[1] < 0xD800 || ss[1] > 0xDFFF) {
228 }
else if (ss[1] >= 0xD800 && ss[1] <= 0xDBFF) {
232 if (ss[2] >= 0xDC00 && ss[2] <= 0xDFFF) {
parserutils_error parserutils_charset_utf16_char_byte_length(const uint8_t *s, size_t *len)
Calculate the length (in bytes) of a UTF-16 character.
parserutils_error parserutils_charset_utf16_prev(const uint8_t *s, uint32_t off, uint32_t *prevoff)
Find previous legal UTF-16 char in string.
parserutils_error parserutils_charset_utf16_next(const uint8_t *s, uint32_t len, uint32_t off, uint32_t *nextoff)
Find next legal UTF-16 char in string.
parserutils_error parserutils_charset_utf16_next_paranoid(const uint8_t *s, uint32_t len, uint32_t off, uint32_t *nextoff)
Find next legal UTF-16 char in string.
UTF-16 manipulation functions (interface).
parserutils_error parserutils_charset_utf16_from_ucs4(uint32_t ucs4, uint8_t *s, size_t *len)
Convert a single UCS-4 character into a UTF-16 sequence.
parserutils_error parserutils_charset_utf16_to_ucs4(const uint8_t *s, size_t len, uint32_t *ucs4, size_t *clen)
Convert a UTF-16 sequence into a single UCS-4 character.
parserutils_error parserutils_charset_utf16_length(const uint8_t *s, size_t max, size_t *len)
Calculate the length (in characters) of a bounded UTF-16 string.