00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef UBIDIIMP_H
00018 #define UBIDIIMP_H
00019
00020
00021 #ifdef U_COMMON_IMPLEMENTATION
00022
00023 #include "unicode/utypes.h"
00024 #include "unicode/uchar.h"
00025
00026
00027
00028 typedef uint8_t DirProp;
00029 typedef uint32_t Flags;
00030
00031
00032
00033
00034
00035 enum {
00036 L= U_LEFT_TO_RIGHT,
00037 R= U_RIGHT_TO_LEFT,
00038 EN= U_EUROPEAN_NUMBER,
00039 ES= U_EUROPEAN_NUMBER_SEPARATOR,
00040 ET= U_EUROPEAN_NUMBER_TERMINATOR,
00041 AN= U_ARABIC_NUMBER,
00042 CS= U_COMMON_NUMBER_SEPARATOR,
00043 B= U_BLOCK_SEPARATOR,
00044 S= U_SEGMENT_SEPARATOR,
00045 WS= U_WHITE_SPACE_NEUTRAL,
00046 ON= U_OTHER_NEUTRAL,
00047 LRE=U_LEFT_TO_RIGHT_EMBEDDING,
00048 LRO=U_LEFT_TO_RIGHT_OVERRIDE,
00049 AL= U_RIGHT_TO_LEFT_ARABIC,
00050 RLE=U_RIGHT_TO_LEFT_EMBEDDING,
00051 RLO=U_RIGHT_TO_LEFT_OVERRIDE,
00052 PDF=U_POP_DIRECTIONAL_FORMAT,
00053 NSM=U_DIR_NON_SPACING_MARK,
00054 BN= U_BOUNDARY_NEUTRAL,
00055 dirPropCount
00056 };
00057
00058
00059
00060
00061
00062
00063
00064 #define DIRPROP_FLAG(dir) (1UL<<(dir))
00065
00066
00067 #define DIRPROP_FLAG_MULTI_RUNS (1UL<<31)
00068
00069
00070 #define MASK_LTR (DIRPROP_FLAG(L)|DIRPROP_FLAG(EN)|DIRPROP_FLAG(AN)|DIRPROP_FLAG(LRE)|DIRPROP_FLAG(LRO))
00071 #define MASK_RTL (DIRPROP_FLAG(R)|DIRPROP_FLAG(AL)|DIRPROP_FLAG(RLE)|DIRPROP_FLAG(RLO))
00072
00073
00074 #define MASK_LRX (DIRPROP_FLAG(LRE)|DIRPROP_FLAG(LRO))
00075 #define MASK_RLX (DIRPROP_FLAG(RLE)|DIRPROP_FLAG(RLO))
00076 #define MASK_OVERRIDE (DIRPROP_FLAG(LRO)|DIRPROP_FLAG(RLO))
00077
00078 #define MASK_EXPLICIT (MASK_LRX|MASK_RLX|DIRPROP_FLAG(PDF))
00079 #define MASK_BN_EXPLICIT (DIRPROP_FLAG(BN)|MASK_EXPLICIT)
00080
00081
00082 #define MASK_B_S (DIRPROP_FLAG(B)|DIRPROP_FLAG(S))
00083
00084
00085 #define MASK_WS (MASK_B_S|DIRPROP_FLAG(WS)|MASK_BN_EXPLICIT)
00086 #define MASK_N (DIRPROP_FLAG(ON)|MASK_WS)
00087
00088
00089 #define MASK_ET_NSM_BN (DIRPROP_FLAG(ET)|DIRPROP_FLAG(NSM)|MASK_BN_EXPLICIT)
00090
00091
00092 #define MASK_POSSIBLE_N (DIRPROP_FLAG(CS)|DIRPROP_FLAG(ES)|DIRPROP_FLAG(ET)|MASK_N)
00093
00094
00095
00096
00097
00098
00099 #define MASK_EMBEDDING (DIRPROP_FLAG(NSM)|MASK_POSSIBLE_N)
00100
00101
00102 #define GET_LR_FROM_LEVEL(level) ((DirProp)((level)&1))
00103
00104 #define IS_DEFAULT_LEVEL(level) (((level)&0xfe)==0xfe)
00105
00106
00107
00108 typedef struct Run {
00109 UTextOffset logicalStart,
00110 visualLimit;
00111 } Run;
00112
00113
00114 #define INDEX_ODD_BIT (1UL<<31)
00115
00116 #define MAKE_INDEX_ODD_PAIR(index, level) (index|((int32_t)level<<31))
00117 #define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)level<<31))
00118 #define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT)
00119
00120 #define GET_INDEX(x) (x&~INDEX_ODD_BIT)
00121 #define GET_ODD_BIT(x) ((uint32_t)x>>31)
00122 #define IS_ODD_RUN(x) ((x&INDEX_ODD_BIT)!=0)
00123 #define IS_EVEN_RUN(x) ((x&INDEX_ODD_BIT)==0)
00124
00125 U_CFUNC UBool
00126 ubidi_getRuns(UBiDi *pBiDi);
00127
00128
00129
00130 struct UBiDi {
00131
00132 const UChar *text;
00133
00134
00135 UTextOffset length;
00136
00137
00138 UTextOffset dirPropsSize, levelsSize, runsSize;
00139
00140
00141 DirProp *dirPropsMemory;
00142 UBiDiLevel *levelsMemory;
00143 Run *runsMemory;
00144
00145
00146 UBool mayAllocateText, mayAllocateRuns;
00147
00148
00149 const DirProp *dirProps;
00150 UBiDiLevel *levels;
00151
00152
00153 UBool isInverse;
00154
00155
00156 UBiDiLevel paraLevel;
00157
00158
00159 UBiDiDirection direction;
00160
00161
00162 Flags flags;
00163
00164
00165
00166 UTextOffset trailingWSStart;
00167
00168
00169 UTextOffset runCount;
00170 Run *runs;
00171
00172
00173 Run simpleRuns[1];
00174 };
00175
00176
00177 extern UBool
00178 getMemory(void **pMemory, UTextOffset *pSize, UBool mayAllocate, UTextOffset sizeNeeded);
00179
00180
00181 #define getDirPropsMemory(pBiDi, length) \
00182 getMemory((void **)&(pBiDi)->dirPropsMemory, &(pBiDi)->dirPropsSize, \
00183 (pBiDi)->mayAllocateText, (length))
00184
00185 #define getLevelsMemory(pBiDi, length) \
00186 getMemory((void **)&(pBiDi)->levelsMemory, &(pBiDi)->levelsSize, \
00187 (pBiDi)->mayAllocateText, (length))
00188
00189 #define getRunsMemory(pBiDi, length) \
00190 getMemory((void **)&(pBiDi)->runsMemory, &(pBiDi)->runsSize, \
00191 (pBiDi)->mayAllocateRuns, (length)*sizeof(Run))
00192
00193
00194 #define getInitialDirPropsMemory(pBiDi, length) \
00195 getMemory((void **)&(pBiDi)->dirPropsMemory, &(pBiDi)->dirPropsSize, \
00196 TRUE, (length))
00197
00198 #define getInitialLevelsMemory(pBiDi, length) \
00199 getMemory((void **)&(pBiDi)->levelsMemory, &(pBiDi)->levelsSize, \
00200 TRUE, (length))
00201
00202 #define getInitialRunsMemory(pBiDi, length) \
00203 getMemory((void **)&(pBiDi)->runsMemory, &(pBiDi)->runsSize, \
00204 TRUE, (length)*sizeof(Run))
00205
00206 #endif
00207
00208 #endif