int
fribidi_unicode_to_cap_rtl (FriBidiChar *us,
			    int length,
			    char *s)
{
  int i, j;

  j = 0;
  for (i = 0; i < length; i++)
    {
      FriBidiChar ch = us[i];
      if (!FRIBIDI_IS_EXPLICIT (fribidi_get_type_internal (ch)) && ch != '_'
	  && ch != UNI_LRM && ch != UNI_RLM)
	s[j++] = fribidi_unicode_to_cap_rtl_c (ch);
      else
	{
	  s[j++] = '_';
	  switch (ch)
	    {
	    case UNI_LRM:
	      s[j++] = '>';
	      break;
	    case UNI_RLM:
	      s[j++] = '<';
	      break;
	    case UNI_LRE:
	      s[j++] = 'l';
	      break;
	    case UNI_RLE:
	      s[j++] = 'r';
	      break;
	    case UNI_PDF:
	      s[j++] = 'o';
	      break;
	    case UNI_LRO:
	      s[j++] = 'L';
	      break;
	    case UNI_RLO:
	      s[j++] = 'R';
	      break;
	    case '_':
	      s[j++] = '_';
	      break;
	    default:
	      j--;
	      if (ch < 256)
		s[j++] = fribidi_unicode_to_cap_rtl_c (ch);
	      else
		s[j++] = '?';
	      break;
	    }
	}
    }
  s[j] = 0;

  return j;
}
fribidi_boolean
fribidi_char_set_enter_cap_rtl (void)
{
  if (!caprtl_to_unicode)
    {
      int request[FRIBIDI_TYPES_COUNT + 1];
      int i, count;

      caprtl_to_unicode =
	(FriBidiChar *) fribidi_malloc (NULL,
					CAPRTL_CHARS *
					sizeof caprtl_to_unicode[0]);
      for (i = 0; i < FRIBIDI_TYPES_COUNT; i++)
	request[i] = 0;
      for (i = 0; i < CAPRTL_CHARS; i++)
	if (fribidi_get_mirror_char (NULL, i, NULL))
	  caprtl_to_unicode[i] = i;
      for (count = 0, i = 0; i < CAPRTL_CHARS; i++)
	if (caprtl_to_unicode[i] == 0)
	  {
	    request[(unsigned char) CapRTLCharTypes[i]]++;
	    count++;
	  }
      for (i = 1; i < 0x10000 && count; i++)	/* Assign BMP chars to CapRTL entries */
	if (!fribidi_get_mirror_char (NULL, i, NULL))
	  {
	    int j, k;
	    for (j = 0; j < FRIBIDI_TYPES_COUNT; j++)
	      if (fribidi_prop_to_type[j] == fribidi_get_type_internal (i))
		break;
	    if (!request[j])	/* Do not need this type */
	      continue;
	    for (k = 0; k < CAPRTL_CHARS; k++)
	      if (!caprtl_to_unicode[k] && j == CapRTLCharTypes[k])
		break;
	    if (k < CAPRTL_CHARS)
	      {
		request[j]--;
		count--;
		caprtl_to_unicode[k] = i;
	      }
	  }
    }

  return FRIBIDI_TRUE;
}
Exemplo n.º 3
0
FRIBIDI_API FriBidiCharType
fribidi_get_type (FriBidiChar uch)
{
  return fribidi_get_type_internal (uch);
}