(root)/
fribidi-1.0.13/
lib/
fribidi-mirroring.c
       1  /* fribidi-mirroring.c - get mirrored character
       2   *
       3   * Copyright (C) 2004  Sharif FarsiWeb, Inc
       4   * Copyright (C) 2001, 2002, 2004  Behdad Esfahbod
       5   * Copyright (C) 1999, 2000, 2017  Dov Grobgeld
       6   *
       7   * This file is part of GNU FriBidi.
       8   * 
       9   * GNU FriBidi is free software; you can redistribute it and/or
      10   * modify it under the terms of the GNU Lesser General Public License
      11   * as published by the Free Software Foundation; either version 2.1
      12   * of the License, or (at your option) any later version.
      13   * 
      14   * GNU FriBidi is distributed in the hope that it will be useful,
      15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17   * GNU Lesser General Public License for more details.
      18   * 
      19   * You should have received a copy of the GNU Lesser General Public License
      20   * along with GNU FriBidi; if not, write to the Free Software
      21   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
      22   * 
      23   * For licensing issues, contact <fribidi.license@gmail.com> or write to
      24   * Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
      25   *
      26   * Author(s):
      27   *   Behdad Esfahbod, 2001, 2002, 2004
      28   *   Dov Grobgeld, 1999, 2000
      29   */
      30  
      31  #include "common.h"
      32  
      33  #include <fribidi-mirroring.h>
      34  
      35  #include "mirroring.tab.i"
      36  
      37  FRIBIDI_ENTRY fribidi_boolean
      38  fribidi_get_mirror_char (
      39    /* input */
      40    FriBidiChar ch,
      41    /* output */
      42    FriBidiChar *mirrored_ch
      43  )
      44  {
      45    register FriBidiChar result;
      46    result = FRIBIDI_GET_MIRRORING (ch);
      47    if (mirrored_ch)
      48      *mirrored_ch = result;
      49    return ch != result ? true : false;
      50  }
      51  
      52  
      53  FRIBIDI_ENTRY void
      54  fribidi_shape_mirroring (
      55    /* input */
      56    const FriBidiLevel *embedding_levels,
      57    const FriBidiStrIndex len,
      58    /* input and output */
      59    FriBidiChar *str
      60  )
      61  {
      62    register FriBidiStrIndex i;
      63  
      64    DBG ("in fribidi_shape_mirroring");
      65  
      66    if UNLIKELY
      67      (len == 0 || !str) return;
      68  
      69    fribidi_assert (embedding_levels);
      70  
      71    /* L4. Mirror all characters that are in odd levels and have mirrors. */
      72    for (i = len - 1; i >= 0; i--)
      73      if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i]))
      74        {
      75  	FriBidiChar mirrored_ch;
      76  
      77  	if (fribidi_get_mirror_char (str[i], &mirrored_ch))
      78  	  str[i] = mirrored_ch;
      79        }
      80  }
      81  
      82  /* Editor directions:
      83   * Local Variables:
      84   *   mode: c
      85   *   c-basic-offset: 2
      86   *   indent-tabs-mode: t
      87   *   tab-width: 8
      88   * End:
      89   * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
      90   */