(root)/
fribidi-1.0.13/
lib/
fribidi-joining-types.h
       1  /* FriBidi
       2   * fribidi-joining-types.h - character joining 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_JOINING_TYPES_H
      28  #define _FRIBIDI_JOINING_TYPES_H
      29  
      30  #include "fribidi-common.h"
      31  
      32  #include "fribidi-types.h"
      33  
      34  #include "fribidi-begindecls.h"
      35  
      36  /* 
      37   * Define bit masks that joining types are based on, each mask has
      38   * only one bit set.
      39   */
      40  
      41  #define FRIBIDI_MASK_JOINS_RIGHT	0x01	/* May join to right */
      42  #define FRIBIDI_MASK_JOINS_LEFT		0x02	/* May join to right */
      43  #define FRIBIDI_MASK_ARAB_SHAPES	0x04	/* May Arabic shape */
      44  #define FRIBIDI_MASK_TRANSPARENT	0x08	/* Is transparent */
      45  #define FRIBIDI_MASK_IGNORED		0x10	/* Is ignored */
      46  #define FRIBIDI_MASK_LIGATURED		0x20	/* Is ligatured */
      47  
      48  /*
      49   * Define values for FriBidiJoiningType
      50   */
      51  
      52  /* nUn-joining */
      53  #define FRIBIDI_JOINING_TYPE_U_VAL	( 0 )
      54  
      55  /* Right-joining */
      56  #define FRIBIDI_JOINING_TYPE_R_VAL	\
      57  	( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_ARAB_SHAPES )
      58  
      59  /* Dual-joining */
      60  #define FRIBIDI_JOINING_TYPE_D_VAL	\
      61  	( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT \
      62  	| FRIBIDI_MASK_ARAB_SHAPES )
      63  
      64  /* join-Causing */
      65  #define FRIBIDI_JOINING_TYPE_C_VAL	\
      66  	( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT )
      67  
      68  /* Left-joining */
      69  #define FRIBIDI_JOINING_TYPE_L_VAL	\
      70  	( FRIBIDI_MASK_JOINS_LEFT | FRIBIDI_MASK_ARAB_SHAPES )
      71  
      72  /* Transparent */
      73  #define FRIBIDI_JOINING_TYPE_T_VAL	\
      74  	( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_ARAB_SHAPES )
      75  
      76  /* iGnored */
      77  #define FRIBIDI_JOINING_TYPE_G_VAL	( FRIBIDI_MASK_IGNORED )
      78  
      79  
      80  enum _FriBidiJoiningTypeEnum
      81  {
      82  # define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
      83  	FRIBIDI_JOINING_TYPE_##TYPE = FRIBIDI_JOINING_TYPE_##TYPE##_VAL,
      84  # include "fribidi-joining-types-list.h"
      85  # undef _FRIBIDI_ADD_TYPE
      86    _FRIBIDI_JOINING_TYPE_JUNK	/* Don't use this */
      87  };
      88  
      89  #ifdef __FRIBIDI_DOC
      90  typedef enum _FriBidiJoiningTypeEnum FriBidiJoiningType;
      91  #else /* !__FRIBIDI_DOC */
      92  typedef uint8_t FriBidiJoiningType;
      93  #endif /* !__FRIBIDI_DOC */
      94  
      95  /* FriBidiArabicProp is essentially the same type as FriBidiJoiningType, but
      96   * not limited to the few values returned by fribidi_get_joining_type. */
      97  typedef uint8_t FriBidiArabicProp;
      98  
      99  /*
     100   * The equivalent of JoiningType values for ArabicProp
     101   */
     102  
     103  /* Primary Arabic Joining Classes (Table 8-2) */
     104  
     105  /* nUn-joining */
     106  #define FRIBIDI_IS_JOINING_TYPE_U(p)	\
     107  	( 0 == ( (p) &	\
     108  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     109  		| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
     110  
     111  /* Right-joining */
     112  #define FRIBIDI_IS_JOINING_TYPE_R(p)	\
     113  	( FRIBIDI_MASK_JOINS_RIGHT == ( (p) &	\
     114  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     115  		| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
     116  
     117  /* Dual-joining */
     118  #define FRIBIDI_IS_JOINING_TYPE_D(p)	\
     119  	( ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT	\
     120  	  | FRIBIDI_MASK_ARAB_SHAPES ) == ( (p) &	\
     121  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     122  		| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT	\
     123  		| FRIBIDI_MASK_ARAB_SHAPES ) ) )
     124  
     125  /* join-Causing */
     126  #define FRIBIDI_IS_JOINING_TYPE_C(p)	\
     127  	( ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) == ( (p) & \
     128  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     129  		| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT	\
     130  		| FRIBIDI_MASK_ARAB_SHAPES ) ) )
     131  
     132  /* Left-joining */
     133  #define FRIBIDI_IS_JOINING_TYPE_L(p)	\
     134  	( FRIBIDI_MASK_JOINS_LEFT == ( (p) &	\
     135  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     136  		| FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ) ) )
     137  
     138  /* Transparent */
     139  #define FRIBIDI_IS_JOINING_TYPE_T(p)	\
     140  	( FRIBIDI_MASK_TRANSPARENT == ( (p) &	\
     141  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED ) ) )
     142  
     143  /* iGnored */
     144  #define FRIBIDI_IS_JOINING_TYPE_G(p)	\
     145  	( FRIBIDI_MASK_IGNORED == ( (p) &	\
     146  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED ) ) )
     147  
     148  /* and for Derived Arabic Joining Classes (Table 8-3) */
     149  
     150  /* Right join-Causing */
     151  #define FRIBIDI_IS_JOINING_TYPE_RC(p)	\
     152  	( FRIBIDI_MASK_JOINS_RIGHT == ( (p) &	\
     153  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     154  		| FRIBIDI_MASK_JOINS_RIGHT ) ) )
     155  
     156  /* Left join-Causing */
     157  #define FRIBIDI_IS_JOINING_TYPE_LC(p)	\
     158  	( FRIBIDI_MASK_JOINS_LEFT == ( (p) &	\
     159  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     160  		| FRIBIDI_MASK_JOINS_LEFT ) ) )
     161  
     162  
     163  /*
     164   * Defining macros for needed queries, It is fully dependent on the 
     165   * implementation of FriBidiJoiningType.
     166   */
     167  
     168  /* Joins to right: R, D, C? */
     169  #define FRIBIDI_JOINS_RIGHT(p)	((p) & FRIBIDI_MASK_JOINS_RIGHT)
     170  
     171  /* Joins to left: L, D, C? */
     172  #define FRIBIDI_JOINS_LEFT(p)	((p) & FRIBIDI_MASK_JOINS_LEFT)
     173  
     174  /* May shape: R, D, L, T? */
     175  #define FRIBIDI_ARAB_SHAPES(p)	((p) & FRIBIDI_MASK_ARAB_SHAPES)
     176  
     177  /* Is skipped in joining: T, G? */
     178  #define FRIBIDI_IS_JOIN_SKIPPED(p)	\
     179  	((p) & (FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED))
     180  
     181  /* Is base that will be shaped: R, D, L? */
     182  #define FRIBIDI_IS_JOIN_BASE_SHAPES(p)	\
     183  	( FRIBIDI_MASK_ARAB_SHAPES == ( (p) &	\
     184  		( FRIBIDI_MASK_TRANSPARENT | FRIBIDI_MASK_IGNORED	\
     185  		| FRIBIDI_MASK_ARAB_SHAPES ) ) )
     186  
     187  #define FRIBIDI_JOINS_PRECEDING_MASK(level)	\
     188  	(FRIBIDI_LEVEL_IS_RTL (level) ? FRIBIDI_MASK_JOINS_RIGHT	\
     189  				      : FRIBIDI_MASK_JOINS_LEFT)
     190  
     191  #define FRIBIDI_JOINS_FOLLOWING_MASK(level)	\
     192  	(FRIBIDI_LEVEL_IS_RTL (level) ? FRIBIDI_MASK_JOINS_LEFT	\
     193  				      : FRIBIDI_MASK_JOINS_RIGHT)
     194  
     195  #define FRIBIDI_JOIN_SHAPE(p)	\
     196  	((p) & ( FRIBIDI_MASK_JOINS_RIGHT | FRIBIDI_MASK_JOINS_LEFT ))
     197  
     198  /* Functions finally */
     199  
     200  
     201  /* fribidi_get_joining_type - get character joining type
     202   *
     203   * This function returns the joining type of a character as defined in Table
     204   * 8-2 Primary Arabic Joining Classes of the Unicode standard available at
     205   * http://www.unicode.org/versions/Unicode4.0.0/ch08.pdf#G7462, using data
     206   * provided in file ArabicShaping.txt and UnicodeData.txt of the Unicode
     207   * Character Database available at
     208   * http://www.unicode.org/Public/UNIDATA/ArabicShaping.txt and
     209   * http://www.unicode.org/Public/UNIDATA/UnicodeData.txt. 
     210   *
     211   * There are a few macros defined in fribidi-joining-types.h for querying a
     212   * joining type.
     213   */
     214  FRIBIDI_ENTRY FriBidiJoiningType
     215  fribidi_get_joining_type (
     216    FriBidiChar ch		/* input character */
     217  ) FRIBIDI_GNUC_CONST;
     218  
     219  /* fribidi_get_joining_types - get joining types for an string of characters
     220   *
     221   * This function finds the joining types of an string of characters.  See
     222   * fribidi_get_joining_type for more information about the joining types
     223   * returned by this function.
     224   */
     225  FRIBIDI_ENTRY void fribidi_get_joining_types (
     226    const FriBidiChar *str,	/* input string */
     227    const FriBidiStrIndex len,	/* input string length */
     228    FriBidiJoiningType *jtypes	/* output joining types */
     229  );
     230  
     231  /* fribidi_get_joining_type_name - get joining type name
     232   *
     233   * This function returns the joining type name of a joining type.  The
     234   * returned string is a static string and should not be freed.
     235   *
     236   * The type names are the same as ones defined in Table 8-2  Primary Arabic
     237   * Joining Classes of the Unicode standard available at
     238   * http://www.unicode.org/versions/Unicode4.0.0/ch08.pdf#G7462.
     239   */
     240  FRIBIDI_ENTRY const char *fribidi_get_joining_type_name (
     241    FriBidiJoiningType j		/* input joining type */
     242  ) FRIBIDI_GNUC_CONST;
     243  
     244  #include "fribidi-enddecls.h"
     245  
     246  #endif /* !_FRIBIDI_JOINING_TYPES_H */
     247  /* Editor directions:
     248   * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
     249   */