1 | /* FriBidi |
2 | * fribidi-bidi-types.h - character bidi types |
3 | * |
4 | * Author: |
5 | * Behdad Esfahbod, 2001, 2002, 2004 |
6 | * |
7 | * Copyright (C) 2004 Sharif FarsiWeb, Inc. |
8 | * Copyright (C) 2001,2002 Behdad Esfahbod |
9 | * |
10 | * This library is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU Lesser General Public |
12 | * License as published by the Free Software Foundation; either |
13 | * version 2.1 of the License, or (at your option) any later version. |
14 | * |
15 | * This library is distributed in the hope that it will be useful, |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | * Lesser General Public License for more details. |
19 | * |
20 | * You should have received a copy of the GNU Lesser General Public License |
21 | * along with this library, in a file named COPYING; if not, write to the |
22 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
23 | * Boston, MA 02110-1301, USA |
24 | * |
25 | * For licensing issues, contact <fribidi.license@gmail.com>. |
26 | */ |
27 | #ifndef _FRIBIDI_BIDI_TYPES_H |
28 | #define _FRIBIDI_BIDI_TYPES_H |
29 | |
30 | #include "fribidi-common.h" |
31 | |
32 | #include "fribidi-types.h" |
33 | |
34 | #include "fribidi-begindecls.h" |
35 | |
36 | typedef signed char FriBidiLevel; |
37 | |
38 | /* |
39 | * Define bit masks that bidi types are based on, each mask has |
40 | * only one bit set. |
41 | */ |
42 | |
43 | /* RTL mask better be the least significant bit. */ |
44 | #define FRIBIDI_MASK_RTL 0x00000001L /* Is right to left */ |
45 | #define FRIBIDI_MASK_ARABIC 0x00000002L /* Is arabic */ |
46 | |
47 | /* Each char can be only one of the three following. */ |
48 | #define FRIBIDI_MASK_STRONG 0x00000010L /* Is strong */ |
49 | #define FRIBIDI_MASK_WEAK 0x00000020L /* Is weak */ |
50 | #define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */ |
51 | #define FRIBIDI_MASK_SENTINEL 0x00000080L /* Is sentinel */ |
52 | /* Sentinels are not valid chars, just identify the start/end of strings. */ |
53 | |
54 | /* Each char can be only one of the six following. */ |
55 | #define FRIBIDI_MASK_LETTER 0x00000100L /* Is letter: L, R, AL */ |
56 | #define FRIBIDI_MASK_NUMBER 0x00000200L /* Is number: EN, AN */ |
57 | #define FRIBIDI_MASK_NUMSEPTER 0x00000400L /* Is separator or terminator: ES, ET, CS */ |
58 | #define FRIBIDI_MASK_SPACE 0x00000800L /* Is space: BN, BS, SS, WS */ |
59 | #define FRIBIDI_MASK_EXPLICIT 0x00001000L /* Is explicit mark: LRE, RLE, LRO, RLO, PDF */ |
60 | #define FRIBIDI_MASK_ISOLATE 0x00008000L /* Is isolate mark: LRI, RLI, FSI, PDI */ |
61 | |
62 | /* Can be set only if FRIBIDI_MASK_SPACE is also set. */ |
63 | #define FRIBIDI_MASK_SEPARATOR 0x00002000L /* Is text separator: BS, SS */ |
64 | /* Can be set only if FRIBIDI_MASK_EXPLICIT is also set. */ |
65 | #define FRIBIDI_MASK_OVERRIDE 0x00004000L /* Is explicit override: LRO, RLO */ |
66 | #define FRIBIDI_MASK_FIRST 0x02000000L /* Whether direction is determined by first strong */ |
67 | |
68 | |
69 | /* The following exist to make types pairwise different, some of them can |
70 | * be removed but are here because of efficiency (make queries faster). */ |
71 | |
72 | #define FRIBIDI_MASK_ES 0x00010000L |
73 | #define FRIBIDI_MASK_ET 0x00020000L |
74 | #define FRIBIDI_MASK_CS 0x00040000L |
75 | |
76 | #define FRIBIDI_MASK_NSM 0x00080000L |
77 | #define FRIBIDI_MASK_BN 0x00100000L |
78 | |
79 | #define FRIBIDI_MASK_BS 0x00200000L |
80 | #define FRIBIDI_MASK_SS 0x00400000L |
81 | #define FRIBIDI_MASK_WS 0x00800000L |
82 | |
83 | /* We reserve a single bit for user's private use: we will never use it. */ |
84 | #define FRIBIDI_MASK_PRIVATE 0x01000000L |
85 | |
86 | |
87 | /* |
88 | * Define values for FriBidiCharType |
89 | */ |
90 | |
91 | /* Strong types */ |
92 | |
93 | /* Left-To-Right letter */ |
94 | #define FRIBIDI_TYPE_LTR_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER ) |
95 | /* Right-To-Left letter */ |
96 | #define FRIBIDI_TYPE_RTL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \ |
97 | | FRIBIDI_MASK_RTL) |
98 | /* Arabic Letter */ |
99 | #define FRIBIDI_TYPE_AL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \ |
100 | | FRIBIDI_MASK_RTL | FRIBIDI_MASK_ARABIC ) |
101 | /* Left-to-Right Embedding */ |
102 | #define FRIBIDI_TYPE_LRE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT) |
103 | /* Right-to-Left Embedding */ |
104 | #define FRIBIDI_TYPE_RLE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \ |
105 | | FRIBIDI_MASK_RTL ) |
106 | /* Left-to-Right Override */ |
107 | #define FRIBIDI_TYPE_LRO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \ |
108 | | FRIBIDI_MASK_OVERRIDE ) |
109 | /* Right-to-Left Override */ |
110 | #define FRIBIDI_TYPE_RLO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \ |
111 | | FRIBIDI_MASK_RTL | FRIBIDI_MASK_OVERRIDE ) |
112 | |
113 | /* Weak types */ |
114 | |
115 | /* Pop Directional Flag*/ |
116 | #define FRIBIDI_TYPE_PDF_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_EXPLICIT ) |
117 | /* European Numeral */ |
118 | #define FRIBIDI_TYPE_EN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER ) |
119 | /* Arabic Numeral */ |
120 | #define FRIBIDI_TYPE_AN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER \ |
121 | | FRIBIDI_MASK_ARABIC ) |
122 | /* European number Separator */ |
123 | #define FRIBIDI_TYPE_ES_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \ |
124 | | FRIBIDI_MASK_ES ) |
125 | /* European number Terminator */ |
126 | #define FRIBIDI_TYPE_ET_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \ |
127 | | FRIBIDI_MASK_ET ) |
128 | /* Common Separator */ |
129 | #define FRIBIDI_TYPE_CS_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \ |
130 | | FRIBIDI_MASK_CS ) |
131 | /* Non Spacing Mark */ |
132 | #define FRIBIDI_TYPE_NSM_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NSM ) |
133 | /* Boundary Neutral */ |
134 | #define FRIBIDI_TYPE_BN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_SPACE \ |
135 | | FRIBIDI_MASK_BN ) |
136 | |
137 | /* Neutral types */ |
138 | |
139 | /* Block Separator */ |
140 | #define FRIBIDI_TYPE_BS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \ |
141 | | FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_BS ) |
142 | /* Segment Separator */ |
143 | #define FRIBIDI_TYPE_SS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \ |
144 | | FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_SS ) |
145 | /* WhiteSpace */ |
146 | #define FRIBIDI_TYPE_WS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \ |
147 | | FRIBIDI_MASK_WS ) |
148 | /* Other Neutral */ |
149 | #define FRIBIDI_TYPE_ON_VAL ( FRIBIDI_MASK_NEUTRAL ) |
150 | |
151 | |
152 | /* The following are used in specifying paragraph direction only. */ |
153 | |
154 | /* Weak Left-To-Right */ |
155 | #define FRIBIDI_TYPE_WLTR_VAL ( FRIBIDI_MASK_WEAK ) |
156 | /* Weak Right-To-Left */ |
157 | #define FRIBIDI_TYPE_WRTL_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_RTL ) |
158 | |
159 | /* start or end of text (run list) SENTINEL. Only used internally */ |
160 | #define FRIBIDI_TYPE_SENTINEL ( FRIBIDI_MASK_SENTINEL ) |
161 | |
162 | /* Private types for applications. More private types can be obtained by |
163 | * summing up from this one. */ |
164 | #define FRIBIDI_TYPE_PRIVATE ( FRIBIDI_MASK_PRIVATE ) |
165 | |
166 | |
167 | /* New types in Unicode 6.3 */ |
168 | |
169 | /* Left-to-Right Isolate */ |
170 | #define FRIBIDI_TYPE_LRI_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_ISOLATE ) |
171 | /* Right-to-Left Isolate */ |
172 | #define FRIBIDI_TYPE_RLI_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_ISOLATE | FRIBIDI_MASK_RTL ) |
173 | /* First strong isolate */ |
174 | #define FRIBIDI_TYPE_FSI_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_ISOLATE | FRIBIDI_MASK_FIRST ) |
175 | |
176 | /* Pop Directional Isolate*/ |
177 | #define FRIBIDI_TYPE_PDI_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_WEAK | FRIBIDI_MASK_ISOLATE ) |
178 | |
179 | /* Define Enums only if sizeof(int) == 4 (UTF-32), and not compiling C++. |
180 | * The problem with C++ is that then casts between int32 and enum will fail! |
181 | */ |
182 | #if defined(__FRIBIDI_DOC) || (FRIBIDI_SIZEOF_INT+0 == 4 && !defined(__cplusplus)) |
183 | |
184 | typedef enum |
185 | { |
186 | # define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \ |
187 | FRIBIDI_TYPE_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL, |
188 | # include "fribidi-bidi-types-list.h" |
189 | # undef _FRIBIDI_ADD_TYPE |
190 | _FRIBIDI_TYPE_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */ |
191 | } FriBidiCharType; |
192 | |
193 | typedef enum |
194 | { |
195 | # define _FRIBIDI_PAR_TYPES |
196 | # define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \ |
197 | FRIBIDI_PAR_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL, |
198 | # include "fribidi-bidi-types-list.h" |
199 | # undef _FRIBIDI_ADD_TYPE |
200 | # undef _FRIBIDI_PAR_TYPES |
201 | _FRIBIDI_PAR_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */ |
202 | } FriBidiParType; |
203 | |
204 | #else |
205 | |
206 | typedef uint32_t FriBidiCharType; |
207 | # define FRIBIDI_TYPE_LTR FRIBIDI_TYPE_LTR_VAL |
208 | # define FRIBIDI_TYPE_RTL FRIBIDI_TYPE_RTL_VAL |
209 | # define FRIBIDI_TYPE_AL FRIBIDI_TYPE_AL_VAL |
210 | # define FRIBIDI_TYPE_EN FRIBIDI_TYPE_EN_VAL |
211 | # define FRIBIDI_TYPE_AN FRIBIDI_TYPE_AN_VAL |
212 | # define FRIBIDI_TYPE_ES FRIBIDI_TYPE_ES_VAL |
213 | # define FRIBIDI_TYPE_ET FRIBIDI_TYPE_ET_VAL |
214 | # define FRIBIDI_TYPE_CS FRIBIDI_TYPE_CS_VAL |
215 | # define FRIBIDI_TYPE_NSM FRIBIDI_TYPE_NSM_VAL |
216 | # define FRIBIDI_TYPE_BN FRIBIDI_TYPE_BN_VAL |
217 | # define FRIBIDI_TYPE_BS FRIBIDI_TYPE_BS_VAL |
218 | # define FRIBIDI_TYPE_SS FRIBIDI_TYPE_SS_VAL |
219 | # define FRIBIDI_TYPE_WS FRIBIDI_TYPE_WS_VAL |
220 | # define FRIBIDI_TYPE_ON FRIBIDI_TYPE_ON_VAL |
221 | # define FRIBIDI_TYPE_LRE FRIBIDI_TYPE_LRE_VAL |
222 | # define FRIBIDI_TYPE_RLE FRIBIDI_TYPE_RLE_VAL |
223 | # define FRIBIDI_TYPE_LRO FRIBIDI_TYPE_LRO_VAL |
224 | # define FRIBIDI_TYPE_RLO FRIBIDI_TYPE_RLO_VAL |
225 | # define FRIBIDI_TYPE_PDF FRIBIDI_TYPE_PDF_VAL |
226 | # define FRIBIDI_TYPE_LRI FRIBIDI_TYPE_LRI_VAL |
227 | # define FRIBIDI_TYPE_RLI FRIBIDI_TYPE_RLI_VAL |
228 | # define FRIBIDI_TYPE_FSI FRIBIDI_TYPE_FSI_VAL |
229 | # define FRIBIDI_TYPE_PDI FRIBIDI_TYPE_PDI_VAL |
230 | |
231 | typedef uint32_t FriBidiParType; |
232 | # define FRIBIDI_PAR_LTR FRIBIDI_TYPE_LTR_VAL |
233 | # define FRIBIDI_PAR_RTL FRIBIDI_TYPE_RTL_VAL |
234 | # define FRIBIDI_PAR_ON FRIBIDI_TYPE_ON_VAL |
235 | # define FRIBIDI_PAR_WLTR FRIBIDI_TYPE_WLTR_VAL |
236 | # define FRIBIDI_PAR_WRTL FRIBIDI_TYPE_WRTL_VAL |
237 | |
238 | #endif |
239 | |
240 | /* Please don't use these two type names, use FRIBIDI_PAR_* form instead. */ |
241 | #define FRIBIDI_TYPE_WLTR FRIBIDI_PAR_WLTR |
242 | #define FRIBIDI_TYPE_WRTL FRIBIDI_PAR_WRTL |
243 | |
244 | |
245 | /* |
246 | * Defining macros for needed queries, It is fully dependent on the |
247 | * implementation of FriBidiCharType. |
248 | */ |
249 | |
250 | |
251 | /* Is right-to-left level? */ |
252 | #define FRIBIDI_LEVEL_IS_RTL(lev) ((lev) & 1) |
253 | |
254 | /* Return the bidi type corresponding to the direction of the level number, |
255 | FRIBIDI_TYPE_LTR for evens and FRIBIDI_TYPE_RTL for odds. */ |
256 | #define FRIBIDI_LEVEL_TO_DIR(lev) \ |
257 | (FRIBIDI_LEVEL_IS_RTL (lev) ? FRIBIDI_TYPE_RTL : FRIBIDI_TYPE_LTR) |
258 | |
259 | /* Return the minimum level of the direction, 0 for FRIBIDI_TYPE_LTR and |
260 | 1 for FRIBIDI_TYPE_RTL and FRIBIDI_TYPE_AL. */ |
261 | #define FRIBIDI_DIR_TO_LEVEL(dir) \ |
262 | ((FriBidiLevel) (FRIBIDI_IS_RTL (dir) ? 1 : 0)) |
263 | |
264 | /* Is right to left: RTL, AL, RLE, RLO? */ |
265 | #define FRIBIDI_IS_RTL(p) ((p) & FRIBIDI_MASK_RTL) |
266 | /* Is arabic: AL, AN? */ |
267 | #define FRIBIDI_IS_ARABIC(p) ((p) & FRIBIDI_MASK_ARABIC) |
268 | |
269 | /* Is strong? */ |
270 | #define FRIBIDI_IS_STRONG(p) ((p) & FRIBIDI_MASK_STRONG) |
271 | /* Is weak? */ |
272 | #define FRIBIDI_IS_WEAK(p) ((p) & FRIBIDI_MASK_WEAK) |
273 | /* Is neutral? */ |
274 | #define FRIBIDI_IS_NEUTRAL(p) ((p) & FRIBIDI_MASK_NEUTRAL) |
275 | /* Is sentinel? */ |
276 | #define FRIBIDI_IS_SENTINEL(p) ((p) & FRIBIDI_MASK_SENTINEL) |
277 | |
278 | /* Is letter: L, R, AL? */ |
279 | #define FRIBIDI_IS_LETTER(p) ((p) & FRIBIDI_MASK_LETTER) |
280 | /* Is number: EN, AN? */ |
281 | #define FRIBIDI_IS_NUMBER(p) ((p) & FRIBIDI_MASK_NUMBER) |
282 | /* Is number separator or terminator: ES, ET, CS? */ |
283 | #define FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR(p) \ |
284 | ((p) & FRIBIDI_MASK_NUMSEPTER) |
285 | /* Is space: BN, BS, SS, WS? */ |
286 | #define FRIBIDI_IS_SPACE(p) ((p) & FRIBIDI_MASK_SPACE) |
287 | /* Is explicit mark: LRE, RLE, LRO, RLO, PDF? */ |
288 | #define FRIBIDI_IS_EXPLICIT(p) ((p) & FRIBIDI_MASK_EXPLICIT) |
289 | /* Is isolator */ |
290 | #define FRIBIDI_IS_ISOLATE(p) ((p) & FRIBIDI_MASK_ISOLATE) |
291 | |
292 | /* Is text separator: BS, SS? */ |
293 | #define FRIBIDI_IS_SEPARATOR(p) ((p) & FRIBIDI_MASK_SEPARATOR) |
294 | |
295 | /* Is explicit override: LRO, RLO? */ |
296 | #define FRIBIDI_IS_OVERRIDE(p) ((p) & FRIBIDI_MASK_OVERRIDE) |
297 | |
298 | /* Some more: */ |
299 | |
300 | /* Is left to right letter: LTR? */ |
301 | #define FRIBIDI_IS_LTR_LETTER(p) \ |
302 | ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) == FRIBIDI_MASK_LETTER) |
303 | |
304 | /* Is right to left letter: RTL, AL? */ |
305 | #define FRIBIDI_IS_RTL_LETTER(p) \ |
306 | ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) \ |
307 | == (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL)) |
308 | |
309 | /* Is ES or CS: ES, CS? */ |
310 | #define FRIBIDI_IS_ES_OR_CS(p) \ |
311 | ((p) & (FRIBIDI_MASK_ES | FRIBIDI_MASK_CS)) |
312 | |
313 | /* Is explicit or BN: LRE, RLE, LRO, RLO, PDF, BN? */ |
314 | #define FRIBIDI_IS_EXPLICIT_OR_BN(p) \ |
315 | ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN)) |
316 | |
317 | /* Is explicit or BN or NSM: LRE, RLE, LRO, RLO, PDF, BN, NSM? */ |
318 | #define FRIBIDI_IS_EXPLICIT_OR_BN_OR_NSM(p) \ |
319 | ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM)) |
320 | |
321 | /* Is explicit or BN or NSM: LRE, RLE, LRO, RLO, PDF, BN, NSM? */ |
322 | #define FRIBIDI_IS_EXPLICIT_OR_ISOLATE_OR_BN_OR_NSM(p) \ |
323 | ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_ISOLATE | FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM)) |
324 | |
325 | /* Is explicit or BN or WS: LRE, RLE, LRO, RLO, PDF, BN, WS? */ |
326 | #define FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS(p) \ |
327 | ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS)) |
328 | |
329 | /* Is explicit or separator or BN or WS: LRE, RLE, LRO, RLO, PDF, BS, SS, BN, WS? */ |
330 | #define FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS(p) \ |
331 | ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_SEPARATOR \ |
332 | | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS)) |
333 | |
334 | /* Is private-use type for application? */ |
335 | #define FRIBIDI_IS_PRIVATE(p) ((p) & FRIBIDI_MASK_PRIVATE) |
336 | |
337 | /* Define some conversions. */ |
338 | |
339 | /* Change numbers to RTL: EN,AN -> RTL. */ |
340 | #define FRIBIDI_CHANGE_NUMBER_TO_RTL(p) \ |
341 | (FRIBIDI_IS_NUMBER(p) ? FRIBIDI_TYPE_RTL : (p)) |
342 | |
343 | /* Override status of an explicit mark: |
344 | * LRO,LRE->LTR, RLO,RLE->RTL, otherwise->ON. */ |
345 | #define FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR(p) \ |
346 | (FRIBIDI_IS_OVERRIDE(p) ? FRIBIDI_LEVEL_TO_DIR(FRIBIDI_DIR_TO_LEVEL(p)) \ |
347 | : FRIBIDI_TYPE_ON) |
348 | |
349 | /* Weaken type for paragraph fallback purposes: |
350 | * LTR->WLTR, RTL->WRTL. */ |
351 | #define FRIBIDI_WEAK_PARAGRAPH(p) (FRIBIDI_PAR_WLTR | ((p) & FRIBIDI_MASK_RTL)) |
352 | |
353 | |
354 | /* Functions finally */ |
355 | |
356 | |
357 | /* fribidi_get_bidi_type - get character bidi type |
358 | * |
359 | * This function returns the bidi type of a character as defined in Table 3.7 |
360 | * Bidirectional Character Types of the Unicode Bidirectional Algorithm |
361 | * available at |
362 | * http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, using |
363 | * data provided in file UnicodeData.txt of the Unicode Character Database |
364 | * available at http://www.unicode.org/Public/UNIDATA/UnicodeData.txt. |
365 | * |
366 | * There are a few macros defined in fribidi-bidi-types.h for querying a bidi |
367 | * type. |
368 | */ |
369 | FRIBIDI_ENTRY FriBidiCharType |
370 | fribidi_get_bidi_type ( |
371 | FriBidiChar ch /* input character */ |
372 | ) FRIBIDI_GNUC_CONST; |
373 | |
374 | /* fribidi_get_bidi_types - get bidi types for an string of characters |
375 | * |
376 | * This function finds the bidi types of an string of characters. See |
377 | * fribidi_get_bidi_type() for more information about the bidi types returned |
378 | * by this function. |
379 | */ |
380 | FRIBIDI_ENTRY void fribidi_get_bidi_types ( |
381 | const FriBidiChar *str, /* input string */ |
382 | const FriBidiStrIndex len, /* input string length */ |
383 | FriBidiCharType *btypes /* output bidi types */ |
384 | ); |
385 | |
386 | /* fribidi_get_bidi_type_name - get bidi type name |
387 | * |
388 | * This function returns the bidi type name of a character type. The |
389 | * returned string is a static string and should not be freed. |
390 | * |
391 | * The type names are the same as ones defined in Table 3.7 Bidirectional |
392 | * Character Types of the Unicode Bidirectional Algorithm available at |
393 | * http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, with a |
394 | * few modifications: L->LTR, R->RTL, B->BS, S->SS. |
395 | */ |
396 | FRIBIDI_ENTRY const char *fribidi_get_bidi_type_name ( |
397 | FriBidiCharType t /* input bidi type */ |
398 | ) FRIBIDI_GNUC_CONST; |
399 | |
400 | #include "fribidi-enddecls.h" |
401 | |
402 | #endif /* !_FRIBIDI_BIDI_TYPES_H */ |
403 | /* Editor directions: |
404 | * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent |
405 | */ |
406 | |