(root)/
fribidi-1.0.13/
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   */