|
Packit |
046f45 |
/* FriBidi
|
|
Packit |
046f45 |
* fribidi-char-sets.c - character set conversion routines
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* Authors:
|
|
Packit |
046f45 |
* Behdad Esfahbod, 2001, 2002, 2004
|
|
Packit |
046f45 |
* Dov Grobgeld, 1999, 2000
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* Copyright (C) 2004 Sharif FarsiWeb, Inc
|
|
Packit |
046f45 |
* Copyright (C) 2001,2002 Behdad Esfahbod
|
|
Packit |
046f45 |
* Copyright (C) 1999,2000 Dov Grobgeld
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
046f45 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
046f45 |
* License as published by the Free Software Foundation; either
|
|
Packit |
046f45 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
046f45 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
046f45 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
046f45 |
* Lesser General Public License for more details.
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
046f45 |
* along with this library, in a file named COPYING; if not, write to the
|
|
Packit |
046f45 |
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Packit |
046f45 |
* Boston, MA 02110-1301, USA
|
|
Packit |
046f45 |
*
|
|
Packit |
046f45 |
* For licensing issues, contact <fribidi.license@gmail.com>.
|
|
Packit |
046f45 |
*/
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
#include <common.h>
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
#include <fribidi-char-sets.h>
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
#include "fribidi-char-sets-cap-rtl.h"
|
|
Packit |
046f45 |
#include "fribidi-char-sets-utf8.h"
|
|
Packit |
046f45 |
#include "fribidi-char-sets-iso8859-6.h"
|
|
Packit |
046f45 |
#include "fribidi-char-sets-cp1256.h"
|
|
Packit |
046f45 |
#include "fribidi-char-sets-iso8859-8.h"
|
|
Packit |
046f45 |
#include "fribidi-char-sets-cp1255.h"
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
typedef struct
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
FriBidiChar (
|
|
Packit |
046f45 |
*charset_to_unicode_c
|
|
Packit |
046f45 |
) (
|
|
Packit |
046f45 |
char ch
|
|
Packit |
046f45 |
);
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FriBidiStrIndex (
|
|
Packit |
046f45 |
*charset_to_unicode
|
|
Packit |
046f45 |
) (
|
|
Packit |
046f45 |
const char *s,
|
|
Packit |
046f45 |
FriBidiStrIndex len,
|
|
Packit |
046f45 |
FriBidiChar *us
|
|
Packit |
046f45 |
);
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
char (
|
|
Packit |
046f45 |
*unicode_to_charset_c
|
|
Packit |
046f45 |
) (
|
|
Packit |
046f45 |
FriBidiChar uch
|
|
Packit |
046f45 |
);
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FriBidiStrIndex (
|
|
Packit |
046f45 |
*unicode_to_charset
|
|
Packit |
046f45 |
) (
|
|
Packit |
046f45 |
const FriBidiChar *us,
|
|
Packit |
046f45 |
FriBidiStrIndex len,
|
|
Packit |
046f45 |
char *s
|
|
Packit |
046f45 |
);
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
const char *name;
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
const char *title;
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
const char *(
|
|
Packit |
046f45 |
*desc
|
|
Packit |
046f45 |
) (
|
|
Packit |
046f45 |
void
|
|
Packit |
046f45 |
);
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
FriBidiCharSetHandler;
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
static FriBidiCharSetHandler char_sets[FRIBIDI_CHAR_SETS_NUM + 1] = {
|
|
Packit |
046f45 |
{NULL, NULL, NULL, NULL, "N/A", "Character set not available", NULL},
|
|
Packit |
046f45 |
# define _FRIBIDI_ADD_CHAR_SET_ONE2ONE(CHAR_SET, char_set) \
|
|
Packit |
046f45 |
{ \
|
|
Packit |
046f45 |
fribidi_##char_set##_to_unicode_c, \
|
|
Packit |
046f45 |
NULL, \
|
|
Packit |
046f45 |
fribidi_unicode_to_##char_set##_c, \
|
|
Packit |
046f45 |
NULL, \
|
|
Packit |
046f45 |
fribidi_char_set_name_##char_set, \
|
|
Packit |
046f45 |
fribidi_char_set_title_##char_set, \
|
|
Packit |
046f45 |
fribidi_char_set_desc_##char_set \
|
|
Packit |
046f45 |
},
|
|
Packit |
046f45 |
# define _FRIBIDI_ADD_CHAR_SET_OTHERS(CHAR_SET, char_set) \
|
|
Packit |
046f45 |
{ \
|
|
Packit |
046f45 |
NULL, \
|
|
Packit |
046f45 |
fribidi_##char_set##_to_unicode, \
|
|
Packit |
046f45 |
NULL, \
|
|
Packit |
046f45 |
fribidi_unicode_to_##char_set, \
|
|
Packit |
046f45 |
fribidi_char_set_name_##char_set, \
|
|
Packit |
046f45 |
fribidi_char_set_title_##char_set, \
|
|
Packit |
046f45 |
fribidi_char_set_desc_##char_set \
|
|
Packit |
046f45 |
},
|
|
Packit |
046f45 |
# include <fribidi-char-sets-list.h>
|
|
Packit |
046f45 |
# undef _FRIBIDI_ADD_CHAR_SET_OTHERS
|
|
Packit |
046f45 |
# undef _FRIBIDI_ADD_CHAR_SET_ONE2ONE
|
|
Packit |
046f45 |
};
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
static char
|
|
Packit |
046f45 |
fribidi_toupper (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
char c
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
return c < 'a' || c > 'z' ? c : c + 'A' - 'a';
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
static int
|
|
Packit |
046f45 |
fribidi_strcasecmp (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
const char *s1,
|
|
Packit |
046f45 |
const char *s2
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
while (*s1 && fribidi_toupper (*s1) == fribidi_toupper (*s2))
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
s1++;
|
|
Packit |
046f45 |
s2++;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
return fribidi_toupper (*s1) - fribidi_toupper (*s2);
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY FriBidiCharSet
|
|
Packit |
046f45 |
fribidi_parse_charset (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
const char *s
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
int i;
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
for (i = FRIBIDI_CHAR_SETS_NUM; i; i--)
|
|
Packit |
046f45 |
if (fribidi_strcasecmp (s, char_sets[i].name) == 0)
|
|
Packit |
046f45 |
return i;
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
return FRIBIDI_CHAR_SET_NOT_FOUND;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY FriBidiStrIndex
|
|
Packit |
046f45 |
fribidi_charset_to_unicode (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
FriBidiCharSet char_set,
|
|
Packit |
046f45 |
const char *s,
|
|
Packit |
046f45 |
FriBidiStrIndex len,
|
|
Packit |
046f45 |
/* output */
|
|
Packit |
046f45 |
FriBidiChar *us
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
if (char_sets[char_set].charset_to_unicode)
|
|
Packit |
046f45 |
return (*char_sets[char_set].charset_to_unicode) (s, len, us);
|
|
Packit |
046f45 |
else if (char_sets[char_set].charset_to_unicode_c)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
register FriBidiStrIndex l;
|
|
Packit |
046f45 |
for (l = len; l; l--)
|
|
Packit |
046f45 |
*us++ = (*char_sets[char_set].charset_to_unicode_c) (*s++);
|
|
Packit |
046f45 |
return len;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
else
|
|
Packit |
046f45 |
return 0;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY FriBidiStrIndex
|
|
Packit |
046f45 |
fribidi_unicode_to_charset (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
FriBidiCharSet char_set,
|
|
Packit |
046f45 |
const FriBidiChar *us,
|
|
Packit |
046f45 |
FriBidiStrIndex len,
|
|
Packit |
046f45 |
/* output */
|
|
Packit |
046f45 |
char *s
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
if (char_sets[char_set].unicode_to_charset)
|
|
Packit |
046f45 |
return (*char_sets[char_set].unicode_to_charset) (us, len, s);
|
|
Packit |
046f45 |
else if (char_sets[char_set].unicode_to_charset_c)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
register FriBidiStrIndex l;
|
|
Packit |
046f45 |
for (l = len; l; l--)
|
|
Packit |
046f45 |
*s++ = (*char_sets[char_set].unicode_to_charset_c) (*us++);
|
|
Packit |
046f45 |
*s = '\0';
|
|
Packit |
046f45 |
return len;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
else
|
|
Packit |
046f45 |
return 0;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY const char *
|
|
Packit |
046f45 |
fribidi_char_set_name (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
FriBidiCharSet char_set
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
return char_sets[char_set].name ? char_sets[char_set].name : "";
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY const char *
|
|
Packit |
046f45 |
fribidi_char_set_title (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
FriBidiCharSet char_set
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
return char_sets[char_set].title ? char_sets[char_set].
|
|
Packit |
046f45 |
title : fribidi_char_set_name (char_set);
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
FRIBIDI_ENTRY const char *
|
|
Packit |
046f45 |
fribidi_char_set_desc (
|
|
Packit |
046f45 |
/* input */
|
|
Packit |
046f45 |
FriBidiCharSet char_set
|
|
Packit |
046f45 |
)
|
|
Packit |
046f45 |
{
|
|
Packit |
046f45 |
return char_sets[char_set].desc ? char_sets[char_set].desc () : NULL;
|
|
Packit |
046f45 |
}
|
|
Packit |
046f45 |
|
|
Packit |
046f45 |
/* Editor directions:
|
|
Packit |
046f45 |
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
|
Packit |
046f45 |
*/
|