1 // Copyright (C) 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************* 5 * 6 * Copyright (C) 2004-2014, International Business Machines 7 * Corporation and others. All Rights Reserved. 8 * 9 ******************************************************************************* 10 * file name: ubidi_props.h 11 * encoding: US-ASCII 12 * tab size: 8 (not used) 13 * indentation:4 14 * 15 * created on: 2004dec30 16 * created by: Markus W. Scherer 17 * 18 * Low-level Unicode bidi/shaping properties access. 19 */ 20 21 #ifndef __UBIDI_PROPS_H__ 22 #define __UBIDI_PROPS_H__ 23 24 #include "unicode/utypes.h" 25 #include "unicode/uset.h" 26 #include "putilimp.h" 27 #include "uset_imp.h" 28 #include "udataswp.h" 29 30 U_CDECL_BEGIN 31 32 /* library API -------------------------------------------------------------- */ 33 34 struct UBiDiProps; 35 typedef struct UBiDiProps UBiDiProps; 36 37 U_CFUNC const UBiDiProps * 38 ubidi_getSingleton(void); 39 40 U_CFUNC void 41 ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode); 42 43 /* property access functions */ 44 45 U_CFUNC int32_t 46 ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which); 47 48 U_CAPI UCharDirection 49 ubidi_getClass(const UBiDiProps *bdp, UChar32 c); 50 51 U_CFUNC UBool 52 ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c); 53 54 U_CFUNC UChar32 55 ubidi_getMirror(const UBiDiProps *bdp, UChar32 c); 56 57 U_CFUNC UBool 58 ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c); 59 60 U_CFUNC UBool 61 ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c); 62 63 U_CFUNC UJoiningType 64 ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c); 65 66 U_CFUNC UJoiningGroup 67 ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c); 68 69 U_CFUNC UBidiPairedBracketType 70 ubidi_getPairedBracketType(const UBiDiProps *bdp, UChar32 c); 71 72 U_CFUNC UChar32 73 ubidi_getPairedBracket(const UBiDiProps *bdp, UChar32 c); 74 75 /* file definitions --------------------------------------------------------- */ 76 77 #define UBIDI_DATA_NAME "ubidi" 78 #define UBIDI_DATA_TYPE "icu" 79 80 /* format "BiDi" */ 81 #define UBIDI_FMT_0 0x42 82 #define UBIDI_FMT_1 0x69 83 #define UBIDI_FMT_2 0x44 84 #define UBIDI_FMT_3 0x69 85 86 /* indexes into indexes[] */ 87 enum { 88 UBIDI_IX_INDEX_TOP, 89 UBIDI_IX_LENGTH, 90 UBIDI_IX_TRIE_SIZE, 91 UBIDI_IX_MIRROR_LENGTH, 92 93 UBIDI_IX_JG_START, 94 UBIDI_IX_JG_LIMIT, 95 UBIDI_IX_JG_START2, /* new in format version 2.2, ICU 54 */ 96 UBIDI_IX_JG_LIMIT2, 97 98 UBIDI_MAX_VALUES_INDEX=15, 99 UBIDI_IX_TOP=16 100 }; 101 102 /* definitions for 16-bit bidi/shaping properties word ---------------------- */ 103 104 enum { 105 /* UBIDI_CLASS_SHIFT=0, */ /* bidi class: 5 bits (4..0) */ 106 UBIDI_JT_SHIFT=5, /* joining type: 3 bits (7..5) */ 107 108 UBIDI_BPT_SHIFT=8, /* Bidi_Paired_Bracket_Type(bpt): 2 bits (9..8) */ 109 110 UBIDI_JOIN_CONTROL_SHIFT=10, 111 UBIDI_BIDI_CONTROL_SHIFT=11, 112 113 UBIDI_IS_MIRRORED_SHIFT=12, /* 'is mirrored' */ 114 UBIDI_MIRROR_DELTA_SHIFT=13, /* bidi mirroring delta: 3 bits (15..13) */ 115 116 UBIDI_MAX_JG_SHIFT=16 /* max JG value in indexes[UBIDI_MAX_VALUES_INDEX] bits 23..16 */ 117 }; 118 119 #define UBIDI_CLASS_MASK 0x0000001f 120 #define UBIDI_JT_MASK 0x000000e0 121 #define UBIDI_BPT_MASK 0x00000300 122 123 #define UBIDI_MAX_JG_MASK 0x00ff0000 124 125 #define UBIDI_GET_CLASS(props) ((props)&UBIDI_CLASS_MASK) 126 #define UBIDI_GET_FLAG(props, shift) (((props)>>(shift))&1) 127 128 #if U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC 129 # define UBIDI_GET_MIRROR_DELTA(props) ((int16_t)(props)>>UBIDI_MIRROR_DELTA_SHIFT) 130 #else 131 # define UBIDI_GET_MIRROR_DELTA(props) (int16_t)(((props)&0x8000) ? (((props)>>UBIDI_MIRROR_DELTA_SHIFT)|0xe000) : ((props)>>UBIDI_MIRROR_DELTA_SHIFT)) 132 #endif 133 134 enum { 135 UBIDI_ESC_MIRROR_DELTA=-4, 136 UBIDI_MIN_MIRROR_DELTA=-3, 137 UBIDI_MAX_MIRROR_DELTA=3 138 }; 139 140 /* definitions for 32-bit mirror table entry -------------------------------- */ 141 142 enum { 143 /* the source Unicode code point takes 21 bits (20..0) */ 144 UBIDI_MIRROR_INDEX_SHIFT=21, 145 UBIDI_MAX_MIRROR_INDEX=0x7ff 146 }; 147 148 #define UBIDI_GET_MIRROR_CODE_POINT(m) (UChar32)((m)&0x1fffff) 149 150 #define UBIDI_GET_MIRROR_INDEX(m) ((m)>>UBIDI_MIRROR_INDEX_SHIFT) 151 152 U_CDECL_END 153 154 #endif 155