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