1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************************
3103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius*   Copyright (C) 1996-2012, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File UCHAR.C
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   04/02/97    aliu        Creation.
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   4/15/99     Madhu       Updated all the function definitions for C Implementation
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   5/20/99     Madhu       Added the function u_getVersion()
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   8/19/1999   srl         Upgraded scripts to Unicode3.0
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   11/11/1999  weiv        added u_isalnum(), cleaned comments
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   01/11/2000  helena      Renamed u_getVersion to u_getUnicodeVersion.
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   06/20/2000  helena      OS/400 port changes; mostly typecast.
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uscript.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h"
26103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uassert.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_cmn.h"
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "utrie2.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "udataswp.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uprops.h"
3227f654740f2a26ad62a5c155af9199af9e69b889claireho#include "ustr_imp.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* uchar_props_data.h is machine-generated by genprops --csource */
37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define INCLUDED_FROM_UCHAR_C
38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uchar_props_data.h"
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* constants and macros for access to the data ------------------------------ */
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* getting a uint32_t properties word from the data */
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c));
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_haveProperties(UErrorCode *pErrorCode) {
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* API functions ------------------------------------------------------------ */
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Gets the Unicode character's general category.*/
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int8_t U_EXPORT2
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_charType(UChar32 c) {
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (int8_t)GET_CATEGORY(props);
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Enumerate all code points with their general categories. */
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct _EnumTypeCallback {
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharEnumTypeRange *enumRange;
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *context;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t U_CALLCONV
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_enumTypeValue(const void *context, uint32_t value) {
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return GET_CATEGORY(value);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru_enumTypeRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* just cast the value to UCharCategory */
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((struct _EnumTypeCallback *)context)->
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        enumRange(((struct _EnumTypeCallback *)context)->context,
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                  start, end+1, (UCharCategory)value);
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context) {
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct _EnumTypeCallback callback;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(enumRange==NULL) {
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    callback.enumRange=enumRange;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    callback.context=context;
92b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    utrie2_enum(&propsTrie, _enumTypeValue, _enumTypeRange, &callback);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if ch is a lower case letter.*/
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_islower(UChar32 c) {
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)==U_LOWERCASE_LETTER);
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if ch is an upper case letter.*/
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isupper(UChar32 c) {
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)==U_UPPERCASE_LETTER);
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if ch is a title case letter; usually upper case letters.*/
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_istitle(UChar32 c) {
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)==U_TITLECASE_LETTER);
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if ch is a decimal digit. */
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isdigit(UChar32 c) {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER);
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isxdigit(UChar32 c) {
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check ASCII and Fullwidth ASCII a-fA-F */
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (c<=0x66 && c>=0x41 && (c<=0x46 || c>=0x61)) ||
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (c>=0xff21 && c<=0xff46 && (c<=0xff26 || c>=0xff41))
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is a letter.*/
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isalpha(UChar32 c) {
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isUAlphabetic(UChar32 c) {
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if c is a letter or a decimal digit */
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isalnum(UChar32 c) {
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0);
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM.
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isalnumPOSIX(UChar32 c) {
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(u_isUAlphabetic(c) || u_isdigit(c));
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if ch is a unicode character with assigned character type.*/
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isdefined(UChar32 c) {
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(GET_CATEGORY(props)!=0);
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is a base form character that can take a diacritic.*/
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isbase(UChar32 c) {
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0);
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is a control character.*/
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_iscntrl(UChar32 c) {
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isISOControl(UChar32 c) {
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (uint32_t)c<=0x9f && (c<=0x1f || c>=0x7f);
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Some control characters that are used as space. */
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IS_THAT_CONTROL_SPACE(c) \
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL))
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Java has decided that U+0085 New Line is not whitespace any more. */
20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define IS_THAT_ASCII_CONTROL_SPACE(c) \
20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    (c<=0x1f && c>=TAB && (c<=CR || c>=0x1c))
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is a space character.*/
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isspace(UChar32 c) {
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c));
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isJavaSpaceChar(UChar32 c) {
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is a whitespace character.*/
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isWhitespace(UChar32 c) {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ((CAT_MASK(props)&U_GC_Z_MASK)!=0 &&
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                IS_THAT_ASCII_CONTROL_SPACE(c)
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           );
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isblank(UChar32 c) {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((uint32_t)c<=0x9f) {
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return c==9 || c==0x20; /* TAB or SPACE */
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Zs */
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t props;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GET_PROPS(c, props);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR);
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isUWhiteSpace(UChar32 c) {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_WHITE_SPACE))!=0;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character is printable.*/
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isprint(UChar32 c) {
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* comparing ==0 returns FALSE for the categories mentioned */
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0);
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Checks if c is in \p{graph}\p{blank} - \p{cntrl}.
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Implements UCHAR_POSIX_PRINT.
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isprintPOSIX(UChar32 c) {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The only cntrl character in graph+blank is TAB (in blank).
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Here we implement (blank-TAB)=Zs instead of calling u_isblank().
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c));
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isgraph(UChar32 c) {
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* comparing ==0 returns FALSE for the categories mentioned */
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK))
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   ==0);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Checks if c is in
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with space=\p{Whitespace} and Control=Cc.
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Implements UCHAR_POSIX_GRAPH.
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isgraphPOSIX(UChar32 c) {
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* comparing ==0 returns FALSE for the categories mentioned */
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK))
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   ==0);
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_ispunct(UChar32 c) {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&U_GC_P_MASK)!=0);
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character can start a Unicode identifier.*/
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isIDStart(UChar32 c) {
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* same as u_isalpha() */
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_NL_MASK))!=0);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Checks if the Unicode character can be a Unicode identifier part other than starting the
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru identifier.*/
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isIDPart(UChar32 c) {
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (CAT_MASK(props)&
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (U_GC_ND_MASK|U_GC_NL_MASK|
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             U_GC_L_MASK|
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             U_GC_PC_MASK|U_GC_MC_MASK|U_GC_MN_MASK)
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           )!=0 ||
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           u_isIDIgnorable(c));
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*Checks if the Unicode character can be ignorable in a Java or Unicode identifier.*/
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isIDIgnorable(UChar32 c) {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(c<=0x9f) {
34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return u_isISOControl(c) && !IS_THAT_ASCII_CONTROL_SPACE(c);
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t props;
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GET_PROPS(c, props);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UBool)(GET_CATEGORY(props)==U_FORMAT_CHAR);
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*Checks if the Unicode character can start a Java identifier.*/
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isJavaIDStart(UChar32 c) {
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*Checks if the Unicode character can be a Java identifier part other than starting the
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * identifier.
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_isJavaIDPart(UChar32 c) {
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBool)(
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           (CAT_MASK(props)&
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (U_GC_ND_MASK|U_GC_NL_MASK|
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             U_GC_L_MASK|
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             U_GC_SC_MASK|U_GC_PC_MASK|
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             U_GC_MC_MASK|U_GC_MN_MASK)
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           )!=0 ||
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           u_isIDIgnorable(c));
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_charDigitValue(UChar32 c) {
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t props;
37850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t value;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START;
38150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(value<=9) {
38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return value;
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getNumericValue(UChar32 c) {
39050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uint32_t props;
39150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t ntv;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GET_PROPS(c, props);
39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ntv=(int32_t)GET_NUMERIC_TYPE_VALUE(props);
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(ntv==UPROPS_NTV_NONE) {
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return U_NO_NUMERIC_VALUE;
39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if(ntv<UPROPS_NTV_DIGIT_START) {
39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* decimal digit */
39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return ntv-UPROPS_NTV_DECIMAL_START;
40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if(ntv<UPROPS_NTV_NUMERIC_START) {
40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* other digit */
40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return ntv-UPROPS_NTV_DIGIT_START;
40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if(ntv<UPROPS_NTV_FRACTION_START) {
40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* small integer */
40550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return ntv-UPROPS_NTV_NUMERIC_START;
40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if(ntv<UPROPS_NTV_LARGE_START) {
40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* fraction */
40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t numerator=(ntv>>4)-12;
40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t denominator=(ntv&0xf)+1;
41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return (double)numerator/denominator;
41154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(ntv<UPROPS_NTV_BASE60_START) {
41250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* large, single-significant-digit integer */
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double numValue;
41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t mant=(ntv>>5)-14;
41550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t exp=(ntv&0x1f)+2;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numValue=mant;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* multiply by 10^exp without math.h */
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while(exp>=4) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numValue*=10000.;
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            exp-=4;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch(exp) {
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 3:
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numValue*=1000.;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 2:
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numValue*=100.;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1:
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numValue*=10.;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0:
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return numValue;
43954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(ntv<UPROPS_NTV_RESERVED_START) {
44054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* sexagesimal (base 60) integer */
44154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t numValue=(ntv>>2)-0xbf;
44254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t exp=(ntv&3)+1;
44354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
44454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        switch(exp) {
44554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        case 4:
44654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            numValue*=60*60*60*60;
44754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
44854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        case 3:
44954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            numValue*=60*60*60;
45054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
45154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        case 2:
45254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            numValue*=60*60;
45354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
45454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        case 1:
45554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            numValue*=60;
45654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
45754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        case 0:
45854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        default:
45954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
46054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
46154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
46254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return numValue;
46350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
46450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* reserved */
46550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return U_NO_NUMERIC_VALUE;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_digit(UChar32 ch, int8_t radix) {
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t value;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((uint8_t)(radix-2)<=(36-2)) {
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value=(int8_t)u_charDigitValue(ch);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(value<0) {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* ch is not a decimal digit, try latin letters */
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(ch>=0x61 && ch<=0x7A) {
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                value=(int8_t)(ch-0x57);  /* ch - 'a' + 10 */
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(ch>=0x41 && ch<=0x5A) {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                value=(int8_t)(ch-0x37);  /* ch - 'A' + 10 */
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(ch>=0xFF41 && ch<=0xFF5A) {
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                value=(int8_t)(ch-0xFF37);  /* fullwidth ASCII a-z */
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(ch>=0xFF21 && ch<=0xFF3A) {
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                value=(int8_t)(ch-0xFF17);  /* fullwidth ASCII A-Z */
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value=-1;   /* invalid radix */
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (int8_t)((value<radix) ? value : -1);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UChar32 U_EXPORT2
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_forDigit(int32_t digit, int8_t radix) {
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((uint8_t)(radix-2)>(36-2) || (uint32_t)digit>=(uint32_t)radix) {
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(digit<10) {
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UChar32)(0x30+digit);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UChar32)((0x61-10)+digit);
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
503103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* miscellaneous, and support for uprops.cpp -------------------------------- */
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getUnicodeVersion(UVersionInfo versionArray) {
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(versionArray!=NULL) {
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC uint32_t
513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusu_getMainProperties(UChar32 c) {
514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uint32_t props;
515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GET_PROPS(c, props);
516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return props;
517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_CFUNC uint32_t
520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusu_getUnicodeProperties(UChar32 c, int32_t column) {
521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    U_ASSERT(column>=0);
522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(column>=propsVectorsColumns) {
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return propsVectors[vecIndex+column];
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_getMaxValues(int32_t column) {
53227f654740f2a26ad62a5c155af9199af9e69b889claireho    switch(column) {
53327f654740f2a26ad62a5c155af9199af9e69b889claireho    case 0:
53427f654740f2a26ad62a5c155af9199af9e69b889claireho        return indexes[UPROPS_MAX_VALUES_INDEX];
53527f654740f2a26ad62a5c155af9199af9e69b889claireho    case 2:
53627f654740f2a26ad62a5c155af9199af9e69b889claireho        return indexes[UPROPS_MAX_VALUES_2_INDEX];
53727f654740f2a26ad62a5c155af9199af9e69b889claireho    default:
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_charAge(UChar32 c, UVersionInfo versionArray) {
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(versionArray!=NULL) {
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        versionArray[0]=(uint8_t)(version>>4);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        versionArray[1]=(uint8_t)(version&0xf);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        versionArray[2]=versionArray[3]=0;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UScriptCode U_EXPORT2
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
55427f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t scriptX;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USCRIPT_INVALID_CODE;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if((uint32_t)c>0x10ffff) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USCRIPT_INVALID_CODE;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
56227f654740f2a26ad62a5c155af9199af9e69b889claireho    scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
56327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
56427f654740f2a26ad62a5c155af9199af9e69b889claireho        return (UScriptCode)scriptX;
56527f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if(scriptX<UPROPS_SCRIPT_X_WITH_INHERITED) {
56627f654740f2a26ad62a5c155af9199af9e69b889claireho        return USCRIPT_COMMON;
56727f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if(scriptX<UPROPS_SCRIPT_X_WITH_OTHER) {
56827f654740f2a26ad62a5c155af9199af9e69b889claireho        return USCRIPT_INHERITED;
56927f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
57027f654740f2a26ad62a5c155af9199af9e69b889claireho        return (UScriptCode)scriptExtensions[scriptX&UPROPS_SCRIPT_MASK];
57127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
57227f654740f2a26ad62a5c155af9199af9e69b889claireho}
57327f654740f2a26ad62a5c155af9199af9e69b889claireho
57454dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2
57527f654740f2a26ad62a5c155af9199af9e69b889clairehouscript_hasScript(UChar32 c, UScriptCode sc) {
57627f654740f2a26ad62a5c155af9199af9e69b889claireho    const uint16_t *scx;
57727f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
57827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
57927f654740f2a26ad62a5c155af9199af9e69b889claireho        return sc==(UScriptCode)scriptX;
58027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58227f654740f2a26ad62a5c155af9199af9e69b889claireho    scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
58427f654740f2a26ad62a5c155af9199af9e69b889claireho        scx=scriptExtensions+scx[1];
58527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
58654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(sc>=USCRIPT_CODE_LIMIT) {
587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Guard against bogus input that would make us go past the Script_Extensions terminator. */
588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return FALSE;
58927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
59027f654740f2a26ad62a5c155af9199af9e69b889claireho    while(sc>*scx) {
59127f654740f2a26ad62a5c155af9199af9e69b889claireho        ++scx;
59227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
59327f654740f2a26ad62a5c155af9199af9e69b889claireho    return sc==(*scx&0x7fff);
59427f654740f2a26ad62a5c155af9199af9e69b889claireho}
59527f654740f2a26ad62a5c155af9199af9e69b889claireho
59654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2
59727f654740f2a26ad62a5c155af9199af9e69b889clairehouscript_getScriptExtensions(UChar32 c,
59827f654740f2a26ad62a5c155af9199af9e69b889claireho                            UScriptCode *scripts, int32_t capacity,
59927f654740f2a26ad62a5c155af9199af9e69b889claireho                            UErrorCode *pErrorCode) {
60027f654740f2a26ad62a5c155af9199af9e69b889claireho    uint32_t scriptX;
60127f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t length;
60227f654740f2a26ad62a5c155af9199af9e69b889claireho    const uint16_t *scx;
60327f654740f2a26ad62a5c155af9199af9e69b889claireho    uint16_t sx;
60427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
60527f654740f2a26ad62a5c155af9199af9e69b889claireho        return 0;
60627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
60727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(capacity<0 || (capacity>0 && scripts==NULL)) {
60827f654740f2a26ad62a5c155af9199af9e69b889claireho        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
60927f654740f2a26ad62a5c155af9199af9e69b889claireho        return 0;
61027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
61127f654740f2a26ad62a5c155af9199af9e69b889claireho    scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
61227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if(capacity==0) {
614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        } else {
616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            scripts[0]=(UScriptCode)scriptX;
617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return 1;
61927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
62027f654740f2a26ad62a5c155af9199af9e69b889claireho
62127f654740f2a26ad62a5c155af9199af9e69b889claireho    scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
62227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
62327f654740f2a26ad62a5c155af9199af9e69b889claireho        scx=scriptExtensions+scx[1];
62427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=0;
62627f654740f2a26ad62a5c155af9199af9e69b889claireho    do {
62727f654740f2a26ad62a5c155af9199af9e69b889claireho        sx=*scx++;
62827f654740f2a26ad62a5c155af9199af9e69b889claireho        if(length<capacity) {
62954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            scripts[length]=(UScriptCode)(sx&0x7fff);
63027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
63127f654740f2a26ad62a5c155af9199af9e69b889claireho        ++length;
63227f654740f2a26ad62a5c155af9199af9e69b889claireho    } while(sx<0x8000);
63327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(length>capacity) {
63427f654740f2a26ad62a5c155af9199af9e69b889claireho        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
63527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
63627f654740f2a26ad62a5c155af9199af9e69b889claireho    return length;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBlockCode U_EXPORT2
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruublock_getCode(UChar32 c) {
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* property starts for UnicodeSet ------------------------------------------- */
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV
647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add the start code point to the USet */
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const USetAdder *sa=(const USetAdder *)context;
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, start);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void U_EXPORT2
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add the start code point of each same-value range of the main trie */
663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    utrie2_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add code points with hardcoded properties, plus the ones following them */
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for u_isblank() */
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, TAB);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for IS_THAT_CONTROL_SPACE() */
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, CR+1); /* range TAB..CR */
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0x1c);
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0x1f+1);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, NL);
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for u_isIDIgnorable() what was not added above */
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, HAIRSP);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, RLM+1);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, INHSWAP);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, NOMDIG+1);
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, ZWNBSP);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add no-break spaces for u_isWhitespace() what was not added above */
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, NBSP);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, FIGURESP);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, NNBSP);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for u_digit() */
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_a);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_z+1);
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_A);
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_Z+1);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_a);
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_z+1);
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_A);
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_Z+1);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for u_isxdigit() */
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_f+1);
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_F+1);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_f+1);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, U_FW_F+1);
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, WJ); /* range WJ..NOMDIG */
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0xfff0);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0xfffb+1);
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0xe0000);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sa->add(sa->set, 0xe0fff+1);
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add for UCHAR_GRAPHEME_BASE and others */
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USET_ADD_CP_AND_NEXT(sa, CGJ);
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void U_EXPORT2
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruupropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* add the start code point of each same-value range of the properties vectors trie */
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(propsVectorsColumns>0) {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */
725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa);
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
728