d243c5da0fccb7050b1baa5231f52cb68cd3618a
[platform/upstream/fribidi.git] / lib / fribidi-bidi-types.h
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  */