18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*******************************************************************************
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   Copyright (C) 1999-2004, International Business Machines
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   Corporation and others.  All Rights Reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*******************************************************************************
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   file name:  utf16.h
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   encoding:   US-ASCII
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   tab size:   8 (not used)
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   indentation:4
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   created on: 1999sep09
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*   created by: Markus W. Scherer
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * \file
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * \brief C API: 16-bit Unicode handling macros
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file defines macros to deal with 16-bit Unicode (UTF-16) code units and strings.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * utf16.h is included by utf.h after unicode/umachine.h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and some common definitions.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * For more information see utf.h and the ICU User Guide Strings chapter
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (http://oss.software.ibm.com/icu/userguide/).
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * <em>Usage:</em>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ICU coding guidelines for if() statements should be followed when using these macros.
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Compound statements (curly braces {}) must be used  for if-else-while...
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * bodies and all macro statements should be terminated with semicolon.
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __UTF16_H__
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define __UTF16_H__
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* utf.h must be included first. */
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __UTF_H__
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#   include "unicode/utf.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* single-code point definitions -------------------------------------------- */
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Does this code unit alone encode a code point (BMP, not a surrogate)?
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 16-bit code unit
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return TRUE or FALSE
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_IS_SINGLE(c) !U_IS_SURROGATE(c)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Is this code unit a lead surrogate (U+d800..U+dbff)?
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 16-bit code unit
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return TRUE or FALSE
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_IS_LEAD(c) (((c)&0xfffffc00)==0xd800)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Is this code unit a trail surrogate (U+dc00..U+dfff)?
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 16-bit code unit
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return TRUE or FALSE
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Is this code unit a surrogate (U+d800..U+dfff)?
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 16-bit code unit
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return TRUE or FALSE
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Assuming c is a surrogate code point (U16_IS_SURROGATE(c)),
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is it a lead surrogate?
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 16-bit code unit
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return TRUE or FALSE
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_IS_SURROGATE_LEAD(c) (((c)&0x400)==0)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Helper constant for U16_GET_SUPPLEMENTARY.
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @internal
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get a supplementary code point value (U+10000..U+10ffff)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from its lead and trail surrogates.
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The result is undefined if the input values are not
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * lead and trail surrogates.
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param lead lead surrogate (U+d800..U+dbff)
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param trail trail surrogate (U+dc00..U+dfff)
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return supplementary code point (U+10000..U+10ffff)
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_GET_SUPPLEMENTARY(lead, trail) \
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (((UChar32)(lead)<<10UL)+(UChar32)(trail)-U16_SURROGATE_OFFSET)
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get the lead surrogate (0xd800..0xdbff) for a
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * supplementary code point (0x10000..0x10ffff).
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param supplementary 32-bit code point (U+10000..U+10ffff)
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return lead surrogate (U+d800..U+dbff) for supplementary
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_LEAD(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get the trail surrogate (0xdc00..0xdfff) for a
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * supplementary code point (0x10000..0x10ffff).
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param supplementary 32-bit code point (U+10000..U+10ffff)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return trail surrogate (U+dc00..U+dfff) for supplementary
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_TRAIL(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * How many 16-bit code units are used to encode this Unicode code point? (1 or 2)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The result is not defined if c is not a Unicode code point (U+0000..U+10ffff).
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c 32-bit code point
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return 1 or 2
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The maximum number of 16-bit code units per Unicode code point (U+0000..U+10ffff).
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @return 2
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_MAX_LENGTH 2
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get a code point from a string at a random-access offset,
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * without changing the offset.
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset may point to either the lead or trail surrogate unit
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, in which case the macro will read
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the adjacent matching surrogate as well.
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The result is undefined if the offset points to a single, unpaired surrogate.
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT.
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_GET
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_GET_UNSAFE(s, i, c) { \
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[i]; \
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_SURROGATE(c)) { \
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if(U16_IS_SURROGATE_LEAD(c)) { \
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)+1]); \
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else { \
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (c)=U16_GET_SUPPLEMENTARY((s)[(i)-1], (c)); \
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get a code point from a string at a random-access offset,
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * without changing the offset.
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset may point to either the lead or trail surrogate unit
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, in which case the macro will read
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the adjacent matching surrogate as well.
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset points to a single, unpaired surrogate, then that itself
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will be returned as the code point.
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT.
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start starting string offset (usually 0)
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, start<=i<length
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param length string length
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_GET_UNSAFE
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_GET(s, start, i, length, c) { \
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[i]; \
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_SURROGATE(c)) { \
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint16_t __c2; \
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if(U16_IS_SURROGATE_LEAD(c)) { \
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if((i)+1<(length) && U16_IS_TRAIL(__c2=(s)[(i)+1])) { \
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } \
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else { \
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if((i)-1>=(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } \
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* definitions with forward iteration --------------------------------------- */
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get a code point from a string at a code point boundary offset,
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and advance the offset to the next code point boundary.
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing forward iteration.)
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset may point to the lead surrogate unit
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, in which case the macro will read
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the following trail surrogate as well.
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset points to a trail surrogate, then that itself
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will be returned as the code point.
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The result is undefined if the offset points to a single, unpaired lead surrogate.
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_NEXT
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_NEXT_UNSAFE(s, i, c) { \
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[(i)++]; \
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_LEAD(c)) { \
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (c)=U16_GET_SUPPLEMENTARY((c), (s)[(i)++]); \
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Get a code point from a string at a code point boundary offset,
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and advance the offset to the next code point boundary.
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing forward iteration.)
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset may point to the lead surrogate unit
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, in which case the macro will read
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the following trail surrogate as well.
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset points to a trail surrogate or
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * to a single, unpaired lead surrogate, then that itself
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will be returned as the code point.
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, i<length
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param length string length
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_NEXT_UNSAFE
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_NEXT(s, i, length, c) { \
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[(i)++]; \
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_LEAD(c)) { \
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint16_t __c2; \
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if((i)<(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++(i); \
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (c)=U16_GET_SUPPLEMENTARY((c), __c2); \
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Append a code point to a string, overwriting 1 or 2 code units.
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset points to the current end of the string contents
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and is advanced (post-increment).
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes a valid code point and sufficient space in the string.
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Otherwise, the result is undefined.
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string buffer
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c code point to append
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_APPEND
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_APPEND_UNSAFE(s, i, c) { \
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if((uint32_t)(c)<=0xffff) { \
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(c); \
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else { \
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Append a code point to a string, overwriting 1 or 2 code units.
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The offset points to the current end of the string contents
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and is advanced (post-increment).
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, checks for a valid code point.
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If a surrogate pair is written, checks for sufficient space in the string.
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the code point is not valid or a trail surrogate does not fit,
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then isError is set to TRUE.
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string buffer
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, i<length
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param capacity size of the string buffer
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c code point to append
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param isError output UBool set to TRUE if an error occurs, otherwise not modified
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_APPEND_UNSAFE
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_APPEND(s, i, capacity, c, isError) { \
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if((uint32_t)(c)<=0xffff) { \
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(c); \
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if((uint32_t)(c)<=0x10ffff && (i)+1<(capacity)) { \
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else /* c>0x10ffff or not enough space */ { \
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (isError)=TRUE; \
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Advance the string offset from one code point boundary to the next.
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing iteration.)
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_FWD_1
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_FWD_1_UNSAFE(s, i) { \
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_LEAD((s)[(i)++])) { \
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++(i); \
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Advance the string offset from one code point boundary to the next.
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing iteration.)
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, i<length
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param length string length
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_FWD_1_UNSAFE
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_FWD_1(s, i, length) { \
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_LEAD((s)[(i)++]) && (i)<(length) && U16_IS_TRAIL((s)[i])) { \
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++(i); \
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Advance the string offset from one code point boundary to the n-th next one,
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * i.e., move forward by n code points.
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing iteration.)
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param n number of code points to skip
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_FWD_N
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_FWD_N_UNSAFE(s, i, n) { \
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int32_t __N=(n); \
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while(__N>0) { \
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        U16_FWD_1_UNSAFE(s, i); \
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --__N; \
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Advance the string offset from one code point boundary to the n-th next one,
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * i.e., move forward by n code points.
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Post-incrementing iteration.)
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, i<length
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param length string length
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param n number of code points to skip
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_FWD_N_UNSAFE
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_FWD_N(s, i, length, n) { \
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int32_t __N=(n); \
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while(__N>0 && (i)<(length)) { \
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        U16_FWD_1(s, i, length); \
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --__N; \
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Adjust a random-access offset to a code point boundary
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * at the start of a code point.
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset points to the trail surrogate of a surrogate pair,
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then the offset is decremented.
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Otherwise, it is not modified.
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_SET_CP_START
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_SET_CP_START_UNSAFE(s, i) { \
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL((s)[i])) { \
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --(i); \
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Adjust a random-access offset to a code point boundary
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * at the start of a code point.
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset points to the trail surrogate of a surrogate pair,
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then the offset is decremented.
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Otherwise, it is not modified.
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start starting string offset (usually 0)
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, start<=i
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_SET_CP_START_UNSAFE
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_SET_CP_START(s, start, i) { \
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL((s)[i]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --(i); \
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* definitions with backward iteration -------------------------------------- */
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the previous one
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and get the code point between them.
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind a trail surrogate unit
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, then the macro will read
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the preceding lead surrogate as well.
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind a lead surrogate, then that itself
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will be returned as the code point.
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The result is undefined if the offset is behind a single, unpaired trail surrogate.
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_PREV
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_PREV_UNSAFE(s, i, c) { \
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[--(i)]; \
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL(c)) { \
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (c)=U16_GET_SUPPLEMENTARY((s)[--(i)], (c)); \
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the previous one
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and get the code point between them.
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind a trail surrogate unit
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a supplementary code point, then the macro will read
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the preceding lead surrogate as well.
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind a lead surrogate or behind a single, unpaired
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * trail surrogate, then that itself
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will be returned as the code point.
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start starting string offset (usually 0)
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, start<=i
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param c output UChar32 variable
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_PREV_UNSAFE
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_PREV(s, start, i, c) { \
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (c)=(s)[--(i)]; \
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL(c)) { \
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint16_t __c2; \
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if((i)>(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            --(i); \
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the previous one.
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_BACK_1
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_BACK_1_UNSAFE(s, i) { \
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL((s)[--(i)])) { \
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --(i); \
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the previous one.
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start starting string offset (usually 0)
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, start<=i
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_BACK_1_UNSAFE
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_BACK_1(s, start, i) { \
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_TRAIL((s)[--(i)]) && (i)>(start) && U16_IS_LEAD((s)[(i)-1])) { \
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --(i); \
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the n-th one before it,
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * i.e., move backward by n code points.
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param n number of code points to skip
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_BACK_N
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_BACK_N_UNSAFE(s, i, n) { \
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int32_t __N=(n); \
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while(__N>0) { \
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        U16_BACK_1_UNSAFE(s, i); \
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --__N; \
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Move the string offset from one code point boundary to the n-th one before it,
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * i.e., move backward by n code points.
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (Pre-decrementing backward iteration.)
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start start of string
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, i<length
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param n number of code points to skip
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_BACK_N_UNSAFE
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_BACK_N(s, start, i, n) { \
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int32_t __N=(n); \
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while(__N>0 && (i)>(start)) { \
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        U16_BACK_1(s, start, i); \
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        --__N; \
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Adjust a random-access offset to a code point boundary after a code point.
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind the lead surrogate of a surrogate pair,
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then the offset is incremented.
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Otherwise, it is not modified.
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Unsafe" macro, assumes well-formed UTF-16.
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_SET_CP_LIMIT
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_SET_CP_LIMIT_UNSAFE(s, i) { \
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(U16_IS_LEAD((s)[(i)-1])) { \
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++(i); \
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Adjust a random-access offset to a code point boundary after a code point.
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If the offset is behind the lead surrogate of a surrogate pair,
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then the offset is incremented.
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Otherwise, it is not modified.
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The input offset may be the same as the string length.
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * "Safe" macro, handles unpaired surrogates and checks for string boundaries.
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param s const UChar * string
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param start starting string offset (usually 0)
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param i string offset, start<=i<=length
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @param length string length
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @see U16_SET_CP_LIMIT_UNSAFE
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @stable ICU 2.4
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define U16_SET_CP_LIMIT(s, start, i, length) { \
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if((start)<(i) && (i)<(length) && U16_IS_LEAD((s)[(i)-1]) && U16_IS_TRAIL((s)[i])) { \
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++(i); \
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
606