16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1996-2012, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File UCHAR.C
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   04/02/97    aliu        Creation.
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   4/15/99     Madhu       Updated all the function definitions for C Implementation
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   5/20/99     Madhu       Added the function u_getVersion()
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   8/19/1999   srl         Upgraded scripts to Unicode3.0
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   11/11/1999  weiv        added u_isalnum(), cleaned comments
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   01/11/2000  helena      Renamed u_getVersion to u_getUnicodeVersion.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   06/20/2000  helena      OS/400 port changes; mostly typecast.
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_cmn.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "utrie2.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udataswp.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uprops.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustr_imp.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* uchar_props_data.h is machine-generated by genprops --csource */
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define INCLUDED_FROM_UCHAR_C
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uchar_props_data.h"
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* constants and macros for access to the data ------------------------------ */
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* getting a uint32_t properties word from the data */
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c));
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguprv_haveProperties(UErrorCode *pErrorCode) {
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* API functions ------------------------------------------------------------ */
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Gets the Unicode character's general category.*/
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int8_t U_EXPORT2
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_charType(UChar32 c) {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (int8_t)GET_CATEGORY(props);
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Enumerate all code points with their general categories. */
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct _EnumTypeCallback {
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCharEnumTypeRange *enumRange;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const void *context;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t U_CALLCONV
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_enumTypeValue(const void *context, uint32_t value) {
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return GET_CATEGORY(value);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_enumTypeRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* just cast the value to UCharCategory */
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((struct _EnumTypeCallback *)context)->
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        enumRange(((struct _EnumTypeCallback *)context)->context,
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  start, end+1, (UCharCategory)value);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_enumCharTypes(UCharEnumTypeRange *enumRange, const void *context) {
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct _EnumTypeCallback callback;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(enumRange==NULL) {
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    callback.enumRange=enumRange;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    callback.context=context;
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrie2_enum(&propsTrie, _enumTypeValue, _enumTypeRange, &callback);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if ch is a lower case letter.*/
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_islower(UChar32 c) {
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)==U_LOWERCASE_LETTER);
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if ch is an upper case letter.*/
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isupper(UChar32 c) {
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)==U_UPPERCASE_LETTER);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if ch is a title case letter; usually upper case letters.*/
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_istitle(UChar32 c) {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)==U_TITLECASE_LETTER);
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if ch is a decimal digit. */
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isdigit(UChar32 c) {
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER);
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isxdigit(UChar32 c) {
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check ASCII and Fullwidth ASCII a-fA-F */
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (c<=0x66 && c>=0x41 && (c<=0x46 || c>=0x61)) ||
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (c>=0xff21 && c<=0xff46 && (c<=0xff26 || c>=0xff41))
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER);
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is a letter.*/
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isalpha(UChar32 c) {
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0);
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isUAlphabetic(UChar32 c) {
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_ALPHABETIC))!=0;
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if c is a letter or a decimal digit */
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isalnum(UChar32 c) {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Checks if c is alphabetic, or a decimal digit; implements UCHAR_POSIX_ALNUM.
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isalnumPOSIX(UChar32 c) {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(u_isUAlphabetic(c) || u_isdigit(c));
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if ch is a unicode character with assigned character type.*/
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isdefined(UChar32 c) {
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(GET_CATEGORY(props)!=0);
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is a base form character that can take a diacritic.*/
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isbase(UChar32 c) {
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0);
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is a control character.*/
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_iscntrl(UChar32 c) {
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0);
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isISOControl(UChar32 c) {
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (uint32_t)c<=0x9f && (c<=0x1f || c>=0x7f);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Some control characters that are used as space. */
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IS_THAT_CONTROL_SPACE(c) \
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL))
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Java has decided that U+0085 New Line is not whitespace any more. */
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IS_THAT_ASCII_CONTROL_SPACE(c) \
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    (c<=0x1f && c>=TAB && (c<=CR || c>=0x1c))
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is a space character.*/
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isspace(UChar32 c) {
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c));
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isJavaSpaceChar(UChar32 c) {
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0);
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is a whitespace character.*/
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isWhitespace(UChar32 c) {
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ((CAT_MASK(props)&U_GC_Z_MASK)!=0 &&
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                IS_THAT_ASCII_CONTROL_SPACE(c)
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           );
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isblank(UChar32 c) {
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint32_t)c<=0x9f) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c==9 || c==0x20; /* TAB or SPACE */
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Zs */
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint32_t props;
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        GET_PROPS(c, props);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isUWhiteSpace(UChar32 c) {
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (u_getUnicodeProperties(c, 1)&U_MASK(UPROPS_WHITE_SPACE))!=0;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character is printable.*/
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isprint(UChar32 c) {
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* comparing ==0 returns FALSE for the categories mentioned */
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Checks if c is in \p{graph}\p{blank} - \p{cntrl}.
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Implements UCHAR_POSIX_PRINT.
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isprintPOSIX(UChar32 c) {
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The only cntrl character in graph+blank is TAB (in blank).
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Here we implement (blank-TAB)=Zs instead of calling u_isblank().
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c));
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isgraph(UChar32 c) {
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* comparing ==0 returns FALSE for the categories mentioned */
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK))
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   ==0);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Checks if c is in
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * [^\p{space}\p{gc=Control}\p{gc=Surrogate}\p{gc=Unassigned}]
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with space=\p{Whitespace} and Control=Cc.
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Implements UCHAR_POSIX_GRAPH.
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isgraphPOSIX(UChar32 c) {
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* comparing ==0 returns FALSE for the categories mentioned */
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK))
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   ==0);
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_ispunct(UChar32 c) {
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&U_GC_P_MASK)!=0);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character can start a Unicode identifier.*/
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isIDStart(UChar32 c) {
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* same as u_isalpha() */
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_NL_MASK))!=0);
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Checks if the Unicode character can be a Unicode identifier part other than starting the
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org identifier.*/
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isIDPart(UChar32 c) {
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           (CAT_MASK(props)&
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (U_GC_ND_MASK|U_GC_NL_MASK|
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             U_GC_L_MASK|
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             U_GC_PC_MASK|U_GC_MC_MASK|U_GC_MN_MASK)
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           )!=0 ||
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           u_isIDIgnorable(c));
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Checks if the Unicode character can be ignorable in a Java or Unicode identifier.*/
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isIDIgnorable(UChar32 c) {
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(c<=0x9f) {
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return u_isISOControl(c) && !IS_THAT_ASCII_CONTROL_SPACE(c);
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint32_t props;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        GET_PROPS(c, props);
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UBool)(GET_CATEGORY(props)==U_FORMAT_CHAR);
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Checks if the Unicode character can start a Java identifier.*/
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isJavaIDStart(UChar32 c) {
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0);
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Checks if the Unicode character can be a Java identifier part other than starting the
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * identifier.
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_isJavaIDPart(UChar32 c) {
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           (CAT_MASK(props)&
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (U_GC_ND_MASK|U_GC_NL_MASK|
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             U_GC_L_MASK|
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             U_GC_SC_MASK|U_GC_PC_MASK|
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             U_GC_MC_MASK|U_GC_MN_MASK)
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           )!=0 ||
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           u_isIDIgnorable(c));
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_charDigitValue(UChar32 c) {
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t value;
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    value=(int32_t)GET_NUMERIC_TYPE_VALUE(props)-UPROPS_NTV_DECIMAL_START;
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(value<=9) {
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return value;
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI double U_EXPORT2
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_getNumericValue(UChar32 c) {
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t ntv;
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ntv=(int32_t)GET_NUMERIC_TYPE_VALUE(props);
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ntv==UPROPS_NTV_NONE) {
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return U_NO_NUMERIC_VALUE;
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_DIGIT_START) {
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* decimal digit */
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ntv-UPROPS_NTV_DECIMAL_START;
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_NUMERIC_START) {
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* other digit */
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ntv-UPROPS_NTV_DIGIT_START;
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_FRACTION_START) {
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* small integer */
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ntv-UPROPS_NTV_NUMERIC_START;
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_LARGE_START) {
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* fraction */
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t numerator=(ntv>>4)-12;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t denominator=(ntv&0xf)+1;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (double)numerator/denominator;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_BASE60_START) {
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* large, single-significant-digit integer */
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double numValue;
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t mant=(ntv>>5)-14;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t exp=(ntv&0x1f)+2;
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numValue=mant;
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* multiply by 10^exp without math.h */
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while(exp>=4) {
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=10000.;
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            exp-=4;
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch(exp) {
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 3:
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=1000.;
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 2:
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=100.;
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1:
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=10.;
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0:
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return numValue;
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(ntv<UPROPS_NTV_RESERVED_START) {
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* sexagesimal (base 60) integer */
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t numValue=(ntv>>2)-0xbf;
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t exp=(ntv&3)+1;
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch(exp) {
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 4:
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=60*60*60*60;
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 3:
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=60*60*60;
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 2:
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=60*60;
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1:
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numValue*=60;
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0:
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return numValue;
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* reserved */
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return U_NO_NUMERIC_VALUE;
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_digit(UChar32 ch, int8_t radix) {
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t value;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint8_t)(radix-2)<=(36-2)) {
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value=(int8_t)u_charDigitValue(ch);
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(value<0) {
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* ch is not a decimal digit, try latin letters */
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(ch>=0x61 && ch<=0x7A) {
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                value=(int8_t)(ch-0x57);  /* ch - 'a' + 10 */
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if(ch>=0x41 && ch<=0x5A) {
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                value=(int8_t)(ch-0x37);  /* ch - 'A' + 10 */
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if(ch>=0xFF41 && ch<=0xFF5A) {
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                value=(int8_t)(ch-0xFF37);  /* fullwidth ASCII a-z */
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if(ch>=0xFF21 && ch<=0xFF3A) {
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                value=(int8_t)(ch-0xFF17);  /* fullwidth ASCII A-Z */
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value=-1;   /* invalid radix */
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (int8_t)((value<radix) ? value : -1);
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar32 U_EXPORT2
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_forDigit(int32_t digit, int8_t radix) {
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint8_t)(radix-2)>(36-2) || (uint32_t)digit>=(uint32_t)radix) {
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(digit<10) {
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UChar32)(0x30+digit);
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UChar32)((0x61-10)+digit);
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* miscellaneous, and support for uprops.cpp -------------------------------- */
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_getUnicodeVersion(UVersionInfo versionArray) {
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(versionArray!=NULL) {
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_memcpy(versionArray, dataVersion, U_MAX_VERSION_LENGTH);
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC uint32_t
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_getMainProperties(UChar32 c) {
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t props;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_PROPS(c, props);
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return props;
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC uint32_t
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_getUnicodeProperties(UChar32 c, int32_t column) {
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_ASSERT(column>=0);
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(column>=propsVectorsColumns) {
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return propsVectors[vecIndex+column];
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC int32_t
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguprv_getMaxValues(int32_t column) {
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(column) {
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 0:
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return indexes[UPROPS_MAX_VALUES_INDEX];
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 2:
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return indexes[UPROPS_MAX_VALUES_2_INDEX];
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_charAge(UChar32 c, UVersionInfo versionArray) {
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(versionArray!=NULL) {
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT;
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        versionArray[0]=(uint8_t)(version>>4);
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        versionArray[1]=(uint8_t)(version&0xf);
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        versionArray[2]=versionArray[3]=0;
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UScriptCode U_EXPORT2
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t scriptX;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return USCRIPT_INVALID_CODE;
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((uint32_t)c>0x10ffff) {
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return USCRIPT_INVALID_CODE;
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UScriptCode)scriptX;
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(scriptX<UPROPS_SCRIPT_X_WITH_INHERITED) {
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return USCRIPT_COMMON;
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(scriptX<UPROPS_SCRIPT_X_WITH_OTHER) {
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return USCRIPT_INHERITED;
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UScriptCode)scriptExtensions[scriptX&UPROPS_SCRIPT_MASK];
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguscript_hasScript(UChar32 c, UScriptCode sc) {
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const uint16_t *scx;
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return sc==(UScriptCode)scriptX;
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scx=scriptExtensions+scx[1];
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(sc>=USCRIPT_CODE_LIMIT) {
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Guard against bogus input that would make us go past the Script_Extensions terminator. */
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while(sc>*scx) {
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++scx;
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return sc==(*scx&0x7fff);
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguscript_getScriptExtensions(UChar32 c,
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UScriptCode *scripts, int32_t capacity,
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UErrorCode *pErrorCode) {
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t scriptX;
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const uint16_t *scx;
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint16_t sx;
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(capacity<0 || (capacity>0 && scripts==NULL)) {
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(capacity==0) {
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            scripts[0]=(UScriptCode)scriptX;
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 1;
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        scx=scriptExtensions+scx[1];
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=0;
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sx=*scx++;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length<capacity) {
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            scripts[length]=(UScriptCode)(sx&0x7fff);
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++length;
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } while(sx<0x8000);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length>capacity) {
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return length;
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBlockCode U_EXPORT2
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgublock_getCode(UChar32 c) {
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT);
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* property starts for UnicodeSet ------------------------------------------- */
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add the start code point to the USet */
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const USetAdder *sa=(const USetAdder *)context;
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, start);
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define USET_ADD_CP_AND_NEXT(sa, cp) sa->add(sa->set, cp); sa->add(sa->set, cp+1)
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void U_EXPORT2
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add the start code point of each same-value range of the main trie */
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrie2_enum(&propsTrie, NULL, _enumPropertyStartsRange, sa);
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add code points with hardcoded properties, plus the ones following them */
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for u_isblank() */
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, TAB);
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for IS_THAT_CONTROL_SPACE() */
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, CR+1); /* range TAB..CR */
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0x1c);
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0x1f+1);
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, NL);
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for u_isIDIgnorable() what was not added above */
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, HAIRSP);
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, RLM+1);
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, INHSWAP);
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, NOMDIG+1);
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, ZWNBSP);
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add no-break spaces for u_isWhitespace() what was not added above */
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, NBSP);
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, FIGURESP);
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, NNBSP);
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for u_digit() */
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_a);
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_z+1);
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_A);
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_Z+1);
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_a);
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_z+1);
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_A);
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_Z+1);
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for u_isxdigit() */
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_f+1);
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_F+1);
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_f+1);
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, U_FW_F+1);
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, WJ); /* range WJ..NOMDIG */
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0xfff0);
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0xfffb+1);
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0xe0000);
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sa->add(sa->set, 0xe0fff+1);
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add for UCHAR_GRAPHEME_BASE and others */
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USET_ADD_CP_AND_NEXT(sa, CGJ);
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void U_EXPORT2
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgupropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add the start code point of each same-value range of the properties vectors trie */
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(propsVectorsColumns>0) {
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa);
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
728