Bug 648271 - Add g_unicode_script_to_iso15924()

Add g_unicode_script_to_iso15924() and tests.
This commit is contained in:
Behdad Esfahbod 2011-07-20 19:04:29 -04:00
parent d8d67d1596
commit 7e03b28870
5 changed files with 157 additions and 1 deletions

View File

@ -2720,6 +2720,7 @@ g_unicode_canonical_decomposition
g_unichar_get_mirror_char
GUnicodeScript
g_unichar_get_script
g_unicode_script_to_iso15924
<SUBSECTION>
g_utf8_next_char

View File

@ -1229,6 +1229,7 @@ g_unichar_xdigit_value
g_unichar_type
g_unicode_canonical_decomposition
g_unicode_canonical_ordering
g_unicode_script_to_iso15924
g_utf8_casefold
g_utf8_collate
g_utf8_collate_key

View File

@ -475,6 +475,8 @@ typedef enum
G_UNICODE_SCRIPT_MANDAIC /* Mand */
} GUnicodeScript;
guint32 g_unicode_script_to_iso15924 (GUnicodeScript script);
/* Returns TRUE if current locale uses UTF-8 charset. If CHARSET is
* not null, sets *CHARSET to the name of the current locale's
* charset. This value is statically allocated, and should be copied

View File

@ -873,7 +873,7 @@ real_toupper (const gchar *str,
last_was_i = FALSE;
}
}
if (locale_type == LOCALE_TURKIC && c == 'i')
{
/* i => LATIN CAPITAL LETTER I WITH DOT ABOVE */
@ -1316,3 +1316,147 @@ g_unichar_get_script (gunichar ch)
else
return g_unichar_get_script_bsearch (ch);
}
/* http://unicode.org/iso15924/ */
static const guint32 iso15924_tags[] =
{
#define PACK(a,b,c,d) ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d))))
PACK ('Z','y','y','y'), /* G_UNICODE_SCRIPT_COMMON */
PACK ('Z','i','n','h'), /* G_UNICODE_SCRIPT_INHERITED */
PACK ('A','r','a','b'), /* G_UNICODE_SCRIPT_ARABIC */
PACK ('A','r','m','n'), /* G_UNICODE_SCRIPT_ARMENIAN */
PACK ('B','e','n','g'), /* G_UNICODE_SCRIPT_BENGALI */
PACK ('B','o','p','o'), /* G_UNICODE_SCRIPT_BOPOMOFO */
PACK ('C','h','e','r'), /* G_UNICODE_SCRIPT_CHEROKEE */
PACK ('C','o','p','t'), /* G_UNICODE_SCRIPT_COPTIC */
PACK ('C','y','r','l'), /* G_UNICODE_SCRIPT_CYRILLIC */
PACK ('D','s','r','t'), /* G_UNICODE_SCRIPT_DESERET */
PACK ('D','e','v','a'), /* G_UNICODE_SCRIPT_DEVANAGARI */
PACK ('E','t','h','i'), /* G_UNICODE_SCRIPT_ETHIOPIC */
PACK ('G','e','o','r'), /* G_UNICODE_SCRIPT_GEORGIAN */
PACK ('G','o','t','h'), /* G_UNICODE_SCRIPT_GOTHIC */
PACK ('G','r','e','k'), /* G_UNICODE_SCRIPT_GREEK */
PACK ('G','u','j','r'), /* G_UNICODE_SCRIPT_GUJARATI */
PACK ('G','u','r','u'), /* G_UNICODE_SCRIPT_GURMUKHI */
PACK ('H','a','n','i'), /* G_UNICODE_SCRIPT_HAN */
PACK ('H','a','n','g'), /* G_UNICODE_SCRIPT_HANGUL */
PACK ('H','e','b','r'), /* G_UNICODE_SCRIPT_HEBREW */
PACK ('H','i','r','a'), /* G_UNICODE_SCRIPT_HIRAGANA */
PACK ('K','n','d','a'), /* G_UNICODE_SCRIPT_KANNADA */
PACK ('K','a','n','a'), /* G_UNICODE_SCRIPT_KATAKANA */
PACK ('K','h','m','r'), /* G_UNICODE_SCRIPT_KHMER */
PACK ('L','a','o','o'), /* G_UNICODE_SCRIPT_LAO */
PACK ('L','a','t','n'), /* G_UNICODE_SCRIPT_LATIN */
PACK ('M','l','y','m'), /* G_UNICODE_SCRIPT_MALAYALAM */
PACK ('M','o','n','g'), /* G_UNICODE_SCRIPT_MONGOLIAN */
PACK ('M','y','m','r'), /* G_UNICODE_SCRIPT_MYANMAR */
PACK ('O','g','a','m'), /* G_UNICODE_SCRIPT_OGHAM */
PACK ('I','t','a','l'), /* G_UNICODE_SCRIPT_OLD_ITALIC */
PACK ('O','r','y','a'), /* G_UNICODE_SCRIPT_ORIYA */
PACK ('R','u','n','r'), /* G_UNICODE_SCRIPT_RUNIC */
PACK ('S','i','n','h'), /* G_UNICODE_SCRIPT_SINHALA */
PACK ('S','y','r','c'), /* G_UNICODE_SCRIPT_SYRIAC */
PACK ('T','a','m','l'), /* G_UNICODE_SCRIPT_TAMIL */
PACK ('T','e','l','u'), /* G_UNICODE_SCRIPT_TELUGU */
PACK ('T','h','a','a'), /* G_UNICODE_SCRIPT_THAANA */
PACK ('T','h','a','i'), /* G_UNICODE_SCRIPT_THAI */
PACK ('T','i','b','t'), /* G_UNICODE_SCRIPT_TIBETAN */
PACK ('C','a','n','s'), /* G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL */
PACK ('Y','i','i','i'), /* G_UNICODE_SCRIPT_YI */
PACK ('T','g','l','g'), /* G_UNICODE_SCRIPT_TAGALOG */
PACK ('H','a','n','o'), /* G_UNICODE_SCRIPT_HANUNOO */
PACK ('B','u','h','d'), /* G_UNICODE_SCRIPT_BUHID */
PACK ('T','a','g','b'), /* G_UNICODE_SCRIPT_TAGBANWA */
/* Unicode-4.0 additions */
PACK ('B','r','a','i'), /* G_UNICODE_SCRIPT_BRAILLE */
PACK ('C','p','r','t'), /* G_UNICODE_SCRIPT_CYPRIOT */
PACK ('L','i','m','b'), /* G_UNICODE_SCRIPT_LIMBU */
PACK ('O','s','m','a'), /* G_UNICODE_SCRIPT_OSMANYA */
PACK ('S','h','a','w'), /* G_UNICODE_SCRIPT_SHAVIAN */
PACK ('L','i','n','b'), /* G_UNICODE_SCRIPT_LINEAR_B */
PACK ('T','a','l','e'), /* G_UNICODE_SCRIPT_TAI_LE */
PACK ('U','g','a','r'), /* G_UNICODE_SCRIPT_UGARITIC */
/* Unicode-4.1 additions */
PACK ('T','a','l','u'), /* G_UNICODE_SCRIPT_NEW_TAI_LUE */
PACK ('B','u','g','i'), /* G_UNICODE_SCRIPT_BUGINESE */
PACK ('G','l','a','g'), /* G_UNICODE_SCRIPT_GLAGOLITIC */
PACK ('T','f','n','g'), /* G_UNICODE_SCRIPT_TIFINAGH */
PACK ('S','y','l','o'), /* G_UNICODE_SCRIPT_SYLOTI_NAGRI */
PACK ('X','p','e','o'), /* G_UNICODE_SCRIPT_OLD_PERSIAN */
PACK ('K','h','a','r'), /* G_UNICODE_SCRIPT_KHAROSHTHI */
/* Unicode-5.0 additions */
PACK ('Z','z','z','z'), /* G_UNICODE_SCRIPT_UNKNOWN */
PACK ('B','a','l','i'), /* G_UNICODE_SCRIPT_BALINESE */
PACK ('X','s','u','x'), /* G_UNICODE_SCRIPT_CUNEIFORM */
PACK ('P','h','n','x'), /* G_UNICODE_SCRIPT_PHOENICIAN */
PACK ('P','h','a','g'), /* G_UNICODE_SCRIPT_PHAGS_PA */
PACK ('N','k','o','o'), /* G_UNICODE_SCRIPT_NKO */
/* Unicode-5.1 additions */
PACK ('K','a','l','i'), /* G_UNICODE_SCRIPT_KAYAH_LI */
PACK ('L','e','p','c'), /* G_UNICODE_SCRIPT_LEPCHA */
PACK ('R','j','n','g'), /* G_UNICODE_SCRIPT_REJANG */
PACK ('S','u','n','d'), /* G_UNICODE_SCRIPT_SUNDANESE */
PACK ('S','a','u','r'), /* G_UNICODE_SCRIPT_SAURASHTRA */
PACK ('C','h','a','m'), /* G_UNICODE_SCRIPT_CHAM */
PACK ('O','l','c','k'), /* G_UNICODE_SCRIPT_OL_CHIKI */
PACK ('V','a','i','i'), /* G_UNICODE_SCRIPT_VAI */
PACK ('C','a','r','i'), /* G_UNICODE_SCRIPT_CARIAN */
PACK ('L','y','c','i'), /* G_UNICODE_SCRIPT_LYCIAN */
PACK ('L','y','d','i'), /* G_UNICODE_SCRIPT_LYDIAN */
/* Unicode-5.2 additions */
PACK ('A','v','s','t'), /* G_UNICODE_SCRIPT_AVESTAN */
PACK ('B','a','m','u'), /* G_UNICODE_SCRIPT_BAMUM */
PACK ('E','g','y','p'), /* G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS */
PACK ('A','r','m','i'), /* G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC */
PACK ('P','h','l','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI */
PACK ('P','r','t','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN */
PACK ('J','a','v','a'), /* G_UNICODE_SCRIPT_JAVANESE */
PACK ('K','t','h','i'), /* G_UNICODE_SCRIPT_KAITHI */
PACK ('L','i','s','u'), /* G_UNICODE_SCRIPT_LISU */
PACK ('M','t','e','i'), /* G_UNICODE_SCRIPT_MEETEI_MAYEK */
PACK ('S','a','r','b'), /* G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN */
PACK ('O','r','k','h'), /* G_UNICODE_SCRIPT_OLD_TURKIC */
PACK ('S','a','m','r'), /* G_UNICODE_SCRIPT_SAMARITAN */
PACK ('L','a','n','a'), /* G_UNICODE_SCRIPT_TAI_THAM */
PACK ('T','a','v','t'), /* G_UNICODE_SCRIPT_TAI_VIET */
/* Unicode-6.0 additions */
PACK ('B','a','t','k'), /* G_UNICODE_SCRIPT_BATAK */
PACK ('B','r','a','h'), /* G_UNICODE_SCRIPT_BRAHMI */
PACK ('M','a','n','d'), /* G_UNICODE_SCRIPT_MANDAIC */
#undef PACK
};
/**
* g_unicode_script_to_iso15924:
* @script: a Unicode script
*
* Looks up the ISO 15924 code for @script. ISO 15924 assigns four-letter
* codes to scripts. For example, the code for Arabic is 'Arab'. The
* four letter codes are encoded as a @guint32 by this function in a
* big-endian fashion. That is, the code returned for Arabic is
* 0x41726162 (0x41 is ASCII code for 'A', 0x72 is ASCII code for 'r', etc).
*
* See <ulink url="http://unicode.org/iso15924/codelists.html">Codes for the
* representation of names of scripts</ulink> for details.
*
* Return value: the ISO 15924 code for @script, encoded as an integer.
*
* Since: 2.30
*/
guint32
g_unicode_script_to_iso15924 (GUnicodeScript script)
{
if (G_UNLIKELY (script < 0 || script >= (int) G_N_ELEMENTS (iso15924_tags)))
return 0;
return iso15924_tags[script];
}

View File

@ -602,6 +602,13 @@ test_fully_decompose_len (void)
}
}
static void
test_script_to_iso15924 (void)
{
g_assert_cmphex (0, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_INVALID_CODE));
g_assert_cmphex (0x41726162, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_ARABIC));
}
int
main (int argc,
char *argv[])
@ -623,6 +630,7 @@ main (int argc,
g_test_add_func ("/unicode/canonical-decomposition", test_canonical_decomposition);
g_test_add_func ("/unicode/decompose-tail", test_decompose_tail);
g_test_add_func ("/unicode/fully-decompose-len", test_fully_decompose_len);
g_test_add_func ("/unicode/script-to-iso15924", test_script_to_iso15924);
return g_test_run();
}