Exemplo n.º 1
0
/*
 * Do Arabic shaping on character "c".  Returns the shaped character.
 * out:    "ccp" points to the first byte of the character to be shaped.
 * in/out: "c1p" points to the first composing char for "c".
 * in:     "prev_c"  is the previous character (not shaped)
 * in:     "prev_c1" is the first composing char for the previous char
 *		     (not shaped)
 * in:     "next_c"  is the next character (not shaped).
 */
int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1, int next_c)
{
  int curr_c;
  int shape_c;
  int curr_laa;
  int prev_laa;

  /* Deal only with Arabic character, pass back all others */
  if (!A_is_ok(c))
    return c;

  /* half-shape current and previous character */
  shape_c = half_shape(prev_c);

  /* Save away current character */
  curr_c = c;

  curr_laa = A_firstc_laa(c, *c1p);
  prev_laa = A_firstc_laa(prev_c, prev_c1);

  if (curr_laa) {
    if (A_is_valid(prev_c) && !A_is_f(shape_c)
        && !A_is_s(shape_c) && !prev_laa)
      curr_c = chg_c_laa2f(curr_laa);
    else
      curr_c = chg_c_laa2i(curr_laa);

    /* Remove the composing character */
    *c1p = 0;
  } else if (!A_is_valid(prev_c) && A_is_valid(next_c))
    curr_c = chg_c_a2i(c);
  else if (!shape_c || A_is_f(shape_c) || A_is_s(shape_c) || prev_laa)
    curr_c = A_is_valid(next_c) ? chg_c_a2i(c) : chg_c_a2s(c);
  else if (A_is_valid(next_c))
    curr_c = A_is_iso(c) ? chg_c_a2m(c) : chg_c_i2m(c);
  else if (A_is_valid(prev_c))
    curr_c = chg_c_a2f(c);
  else
    curr_c = chg_c_a2s(c);

  /* Sanity check -- curr_c should, in the future, never be 0.
   * We should, in the future, insert a fatal error here. */
  if (curr_c == NUL)
    curr_c = c;

  if (curr_c != c && ccp != NULL) {
    char_u buf[MB_MAXBYTES + 1];

    /* Update the first byte of the character. */
    (*mb_char2bytes)(curr_c, buf);
    *ccp = buf[0];
  }

  /* Return the shaped character */
  return curr_c;
}
Exemplo n.º 2
0
/*
 * A_is_ok returns TRUE if 'c' is an Arabic 10646 (8859-6 or Form-B)
 */
static bool A_is_ok(int c)
{
  return A_is_iso(c) || A_is_formb(c);
}