mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-19 07:08:54 +02:00
Use G_N_ELEMENTS rather than a custom macro.
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com> * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS rather than a custom macro. * glib/gen-unicode-tables.pl: Adapt to changes in table formats for Unicode 3.1 * glib/gunicode.h glib/guniprop.c glib/gunichartables.h glib/gen-unicode-tables.pl: Add case conversion functions g_utf8_casefold, g_utf8_strup, g_utf8_strdown. * tests/unicode-caseconv.c tests/gen-casefold-txt.pl tests/gen-casemap-txt.pl tests/casefold.txt tests/casemap.txt: Test cases for case conversion. * glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h glib/gen-unicode-tables.pl: Add function to do Unicode normalization g_utf8_normalize(). * tests/unicode-normalize.c: Test program for case conversion. * glib/gunicode.h glib/gunicollate.c: Add collation functions g_utf8_collate, g_utf8_collate_key. * test/unicode-collate.c: Test program for collation. * glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized variable. * glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt: Make work with UTF-8 even if the locale isn't UTF-8 based. Still somewhat of broken, if the format string contains characters not representable in the current locale, will warn and not work. * glib/gdate.c: Use UTF-8 normalization and casefolding.
This commit is contained in:
38
ChangeLog
38
ChangeLog
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -1,3 +1,41 @@
|
|||||||
|
Sun Jul 1 20:16:25 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS
|
||||||
|
rather than a custom macro.
|
||||||
|
|
||||||
|
* glib/gen-unicode-tables.pl: Adapt to changes in table
|
||||||
|
formats for Unicode 3.1
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/guniprop.c glib/gunichartables.h
|
||||||
|
glib/gen-unicode-tables.pl: Add case conversion functions
|
||||||
|
g_utf8_casefold, g_utf8_strup, g_utf8_strdown.
|
||||||
|
|
||||||
|
* tests/unicode-caseconv.c tests/gen-casefold-txt.pl
|
||||||
|
tests/gen-casemap-txt.pl tests/casefold.txt
|
||||||
|
tests/casemap.txt: Test cases for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h
|
||||||
|
glib/gen-unicode-tables.pl: Add function to do Unicode
|
||||||
|
normalization g_utf8_normalize().
|
||||||
|
|
||||||
|
* tests/unicode-normalize.c: Test program for case conversion.
|
||||||
|
|
||||||
|
* glib/gunicode.h glib/gunicollate.c: Add collation functions
|
||||||
|
g_utf8_collate, g_utf8_collate_key.
|
||||||
|
|
||||||
|
* test/unicode-collate.c: Test program for collation.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized
|
||||||
|
variable.
|
||||||
|
|
||||||
|
* glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt:
|
||||||
|
Make work with UTF-8 even if the locale isn't UTF-8 based.
|
||||||
|
Still somewhat of broken, if the format string contains
|
||||||
|
characters not representable in the current locale, will warn
|
||||||
|
and not work.
|
||||||
|
|
||||||
|
* glib/gdate.c: Use UTF-8 normalization and casefolding.
|
||||||
|
|
||||||
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
Sat Jun 30 16:03:16 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
* glib/giowin32.c glib/giounix.c glib/gmain.[ch]:
|
||||||
|
@@ -27,4 +27,8 @@
|
|||||||
are now safe against removal of the current item, not the next item.
|
are now safe against removal of the current item, not the next item.
|
||||||
|
|
||||||
It's not recommended to mutate the list in the callback to these
|
It's not recommended to mutate the list in the callback to these
|
||||||
functions in any case.
|
functions in any case.
|
||||||
|
|
||||||
|
* GDate now works in UTF-8, not in the current locale. If you
|
||||||
|
want to use it with the encoding of the locale, you need
|
||||||
|
to convert strings using g_locale_to_utf8 first.
|
||||||
|
@@ -120,6 +120,14 @@ the results may be needed.
|
|||||||
See #G_PRIORITY_DEFAULT, #G_PRIORITY_DEFAULT_IDLE, #G_PRIORITY_HIGH,
|
See #G_PRIORITY_DEFAULT, #G_PRIORITY_DEFAULT_IDLE, #G_PRIORITY_HIGH,
|
||||||
#G_PRIORITY_HIGH_IDLE, and #G_PRIORITY_LOW.
|
#G_PRIORITY_HIGH_IDLE, and #G_PRIORITY_LOW.
|
||||||
|
|
||||||
|
<!-- ##### FUNCTION g_main_context_get ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@thread:
|
||||||
|
@Returns:
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_main_loop_destroy ##### -->
|
<!-- ##### FUNCTION g_main_loop_destroy ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@@ -259,15 +259,6 @@ It is not used within GLib or GTK+.
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_main_context_get ##### -->
|
|
||||||
<para>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@thread:
|
|
||||||
@Returns:
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION g_main_context_default ##### -->
|
<!-- ##### FUNCTION g_main_context_default ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
@@ -644,7 +635,7 @@ the required condition has been met, and returns TRUE if so.
|
|||||||
@prepare:
|
@prepare:
|
||||||
@check:
|
@check:
|
||||||
@dispatch:
|
@dispatch:
|
||||||
@destroy:
|
@finalize:
|
||||||
|
|
||||||
<!-- ##### STRUCT GSourceCallbackFuncs ##### -->
|
<!-- ##### STRUCT GSourceCallbackFuncs ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
@@ -49,6 +49,7 @@ libglib_1_3_la_SOURCES = \
|
|||||||
gunibreak.h \
|
gunibreak.h \
|
||||||
gunibreak.c \
|
gunibreak.c \
|
||||||
gunichartables.h \
|
gunichartables.h \
|
||||||
|
gunicollate.c \
|
||||||
gunidecomp.h \
|
gunidecomp.h \
|
||||||
gunidecomp.c \
|
gunidecomp.c \
|
||||||
gutils.c
|
gutils.c
|
||||||
|
134
glib/gdate.c
134
glib/gdate.c
@@ -512,16 +512,19 @@ g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt)
|
|||||||
|
|
||||||
if (pt->num_ints < 3)
|
if (pt->num_ints < 3)
|
||||||
{
|
{
|
||||||
gchar lcstr[128];
|
gchar *casefold;
|
||||||
|
gchar *normalized;
|
||||||
strncpy (lcstr, str, 127);
|
|
||||||
g_strdown (lcstr);
|
|
||||||
|
|
||||||
|
casefold = g_utf8_casefold (str);
|
||||||
|
normalized = g_utf8_normalize (casefold, G_NORMALIZE_ALL);
|
||||||
|
g_free (casefold);
|
||||||
|
|
||||||
|
i = 1;
|
||||||
while (i < 13)
|
while (i < 13)
|
||||||
{
|
{
|
||||||
if (long_month_names[i] != NULL)
|
if (long_month_names[i] != NULL)
|
||||||
{
|
{
|
||||||
const gchar *found = strstr (lcstr, long_month_names[i]);
|
const gchar *found = strstr (normalized, long_month_names[i]);
|
||||||
|
|
||||||
if (found != NULL)
|
if (found != NULL)
|
||||||
{
|
{
|
||||||
@@ -532,7 +535,7 @@ g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt)
|
|||||||
|
|
||||||
if (short_month_names[i] != NULL)
|
if (short_month_names[i] != NULL)
|
||||||
{
|
{
|
||||||
const gchar *found = strstr (lcstr, short_month_names[i]);
|
const gchar *found = strstr (normalized, short_month_names[i]);
|
||||||
|
|
||||||
if (found != NULL)
|
if (found != NULL)
|
||||||
{
|
{
|
||||||
@@ -575,21 +578,24 @@ g_date_prepare_to_parse (const gchar *str, GDateParseTokens *pt)
|
|||||||
|
|
||||||
while (i < 13)
|
while (i < 13)
|
||||||
{
|
{
|
||||||
|
gchar *casefold;
|
||||||
|
|
||||||
g_date_set_dmy (&d, 1, i, 1);
|
g_date_set_dmy (&d, 1, i, 1);
|
||||||
|
|
||||||
g_return_if_fail (g_date_valid (&d));
|
g_return_if_fail (g_date_valid (&d));
|
||||||
|
|
||||||
g_date_strftime (buf, 127, "%b", &d);
|
g_date_strftime (buf, 127, "%b", &d);
|
||||||
|
|
||||||
|
casefold = g_utf8_casefold (buf);
|
||||||
g_free (short_month_names[i]);
|
g_free (short_month_names[i]);
|
||||||
g_strdown (buf);
|
short_month_names[i] = g_utf8_normalize (casefold, G_NORMALIZE_ALL);
|
||||||
short_month_names[i] = g_strdup (buf);
|
g_free (casefold);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
g_date_strftime (buf, 127, "%B", &d);
|
g_date_strftime (buf, 127, "%B", &d);
|
||||||
|
casefold = g_utf8_casefold (buf);
|
||||||
g_free (long_month_names[i]);
|
g_free (long_month_names[i]);
|
||||||
g_strdown (buf);
|
long_month_names[i] = g_utf8_normalize (casefold, G_NORMALIZE_ALL);
|
||||||
long_month_names[i] = g_strdup (buf);
|
g_free (casefold);
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@@ -1331,7 +1337,7 @@ g_date_strftime (gchar *s,
|
|||||||
const GDate *d)
|
const GDate *d)
|
||||||
{
|
{
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
gsize retval;
|
const gchar *charset;
|
||||||
|
|
||||||
g_return_val_if_fail (d != NULL, 0);
|
g_return_val_if_fail (d != NULL, 0);
|
||||||
g_return_val_if_fail (g_date_valid (d), 0);
|
g_return_val_if_fail (g_date_valid (d), 0);
|
||||||
@@ -1340,14 +1346,100 @@ g_date_strftime (gchar *s,
|
|||||||
g_return_val_if_fail (s != 0, 0);
|
g_return_val_if_fail (s != 0, 0);
|
||||||
|
|
||||||
g_date_to_struct_tm (d, &tm);
|
g_date_to_struct_tm (d, &tm);
|
||||||
|
|
||||||
retval = strftime (s, slen, format, &tm);
|
if (g_get_charset (&charset))
|
||||||
if (retval == 0)
|
|
||||||
{
|
{
|
||||||
/* If retval == 0, the contents of s are undefined. We define
|
gint retval = strftime (s, slen, format, &tm);
|
||||||
* them.
|
if (retval == 0)
|
||||||
*/
|
{
|
||||||
s[0] = '\0';
|
/* If retval == 0, the contents of s are undefined. We define
|
||||||
|
* them.
|
||||||
|
*/
|
||||||
|
s[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gchar *locale_format;
|
||||||
|
gsize tmplen;
|
||||||
|
gchar *tmpbuf;
|
||||||
|
gsize tmpbufsize;
|
||||||
|
gsize convlen = 0;
|
||||||
|
gchar *convbuf;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
locale_format = g_convert (format, -1 , "UTF-8", charset,
|
||||||
|
NULL, NULL, &error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
g_warning (G_STRLOC "Error converting format to %s: %s\n",
|
||||||
|
charset, error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpbufsize = MAX (128, strlen (locale_format) * 2);
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
tmpbuf = g_malloc (tmpbufsize + 1);
|
||||||
|
tmplen = strftime (tmpbuf, tmpbufsize + 1, locale_format, &tm);
|
||||||
|
if (tmplen == tmpbufsize + 1)
|
||||||
|
{
|
||||||
|
g_free (tmpbuf);
|
||||||
|
tmpbufsize *= 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_free (locale_format);
|
||||||
|
|
||||||
|
if (tmplen == 0)
|
||||||
|
{
|
||||||
|
/* If retval == 0, the contents of s are undefined. We define
|
||||||
|
* them.
|
||||||
|
*/
|
||||||
|
g_free (locale_format);
|
||||||
|
s[0] = '\0';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
convbuf = g_convert (tmpbuf, tmplen, "UTF-8", charset, NULL, &convlen, &error);
|
||||||
|
g_free (tmpbuf);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Only copy whole characters into the buffer
|
||||||
|
*/
|
||||||
|
gchar *in = convbuf;
|
||||||
|
gchar *out = s;
|
||||||
|
gchar *end = s + slen - 1;
|
||||||
|
|
||||||
|
while (*in)
|
||||||
|
{
|
||||||
|
int len = g_utf8_skip[*(guchar *)in];
|
||||||
|
if (out + len < end)
|
||||||
|
{
|
||||||
|
out += len;
|
||||||
|
in += len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy (s, convbuf, out - s);
|
||||||
|
*out = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (convbuf);
|
||||||
|
|
||||||
|
return convlen;
|
||||||
}
|
}
|
||||||
return retval;
|
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#! /usr/bin/perl -w
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
# Copyright (C) 1998, 1999 Tom Tromey
|
# Copyright (C) 1998, 1999 Tom Tromey
|
||||||
|
# Copyright (C) 2001 Red Hat Software
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,7 +20,7 @@
|
|||||||
|
|
||||||
# gen-unicode-tables.pl - Generate tables for libunicode from Unicode data.
|
# gen-unicode-tables.pl - Generate tables for libunicode from Unicode data.
|
||||||
# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
|
# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
|
||||||
# Usage: gen-unicode-tables.pl [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt
|
# Usage: gen-unicode-tables.pl [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt SpecialCasing.txt CaseFolding.txt
|
||||||
# I consider the output of this program to be unrestricted. Use it as
|
# I consider the output of this program to be unrestricted. Use it as
|
||||||
# you will.
|
# you will.
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@
|
|||||||
# * For decomp table it might make sense to use a shift count other
|
# * For decomp table it might make sense to use a shift count other
|
||||||
# than 8. We could easily compute the perfect shift count.
|
# than 8. We could easily compute the perfect shift count.
|
||||||
|
|
||||||
use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME);
|
use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION);
|
||||||
|
|
||||||
# Names of fields in Unicode data table.
|
# Names of fields in Unicode data table.
|
||||||
$CODE = 0;
|
$CODE = 0;
|
||||||
@@ -51,7 +52,18 @@ $TITLE = 14;
|
|||||||
# Names of fields in the line break table
|
# Names of fields in the line break table
|
||||||
$BREAK_CODE = 0;
|
$BREAK_CODE = 0;
|
||||||
$BREAK_PROPERTY = 1;
|
$BREAK_PROPERTY = 1;
|
||||||
$BREAK_NAME = 2;
|
|
||||||
|
# Names of fields in the SpecialCasing table
|
||||||
|
$CASE_CODE = 0;
|
||||||
|
$CASE_LOWER = 1;
|
||||||
|
$CASE_TITLE = 2;
|
||||||
|
$CASE_UPPER = 3;
|
||||||
|
$CASE_CONDITION = 4;
|
||||||
|
|
||||||
|
# Names of fields in the CaseFolding table
|
||||||
|
$FOLDING_CODE = 0;
|
||||||
|
$FOLDING_STATUS = 1;
|
||||||
|
$FOLDING_MAPPING = 2;
|
||||||
|
|
||||||
# Map general category code onto symbolic name.
|
# Map general category code onto symbolic name.
|
||||||
%mappings =
|
%mappings =
|
||||||
@@ -128,23 +140,54 @@ $BREAK_NAME = 2;
|
|||||||
%title_to_lower = ();
|
%title_to_lower = ();
|
||||||
%title_to_upper = ();
|
%title_to_upper = ();
|
||||||
|
|
||||||
|
# Maximum length of special-case strings
|
||||||
|
|
||||||
|
my $special_case_len = 0;
|
||||||
|
my @special_cases;
|
||||||
|
|
||||||
$do_decomp = 0;
|
$do_decomp = 0;
|
||||||
$do_props = 1;
|
$do_props = 1;
|
||||||
if ($ARGV[0] eq '-decomp')
|
if (@ARGV && $ARGV[0] eq '-decomp')
|
||||||
{
|
{
|
||||||
$do_decomp = 1;
|
$do_decomp = 1;
|
||||||
$do_props = 0;
|
$do_props = 0;
|
||||||
shift @ARGV;
|
shift @ARGV;
|
||||||
}
|
}
|
||||||
elsif ($ARGV[0] eq '-both')
|
elsif (@ARGV && $ARGV[0] eq '-both')
|
||||||
{
|
{
|
||||||
$do_decomp = 1;
|
$do_decomp = 1;
|
||||||
shift @ARGV;
|
shift @ARGV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (@ARGV != 6) {
|
||||||
|
$0 =~ s@.*/@@;
|
||||||
|
die "Usage: $0 [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt SpecialCasing.txt CaseFolding.txt CompositionExclusions.txt\n";
|
||||||
|
}
|
||||||
|
|
||||||
print "Creating decomp table\n" if ($do_decomp);
|
print "Creating decomp table\n" if ($do_decomp);
|
||||||
print "Creating property table\n" if ($do_props);
|
print "Creating property table\n" if ($do_props);
|
||||||
|
|
||||||
|
print "Composition exlusions from $ARGV[5]\n";
|
||||||
|
|
||||||
|
open (INPUT, "< $ARGV[5]") || exit 1;
|
||||||
|
|
||||||
|
while (<INPUT>) {
|
||||||
|
|
||||||
|
chop;
|
||||||
|
|
||||||
|
next if /^#/;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
|
s/^\s*//;
|
||||||
|
s/\s*$//;
|
||||||
|
|
||||||
|
$composition_exclusions{hex($_)} = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
print "Unicode data from $ARGV[1]\n";
|
print "Unicode data from $ARGV[1]\n";
|
||||||
|
|
||||||
open (INPUT, "< $ARGV[1]") || exit 1;
|
open (INPUT, "< $ARGV[1]") || exit 1;
|
||||||
@@ -189,6 +232,8 @@ while (<INPUT>)
|
|||||||
$last_code = $code;
|
$last_code = $code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
|
@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
|
||||||
'', '', '', '');
|
'', '', '', '');
|
||||||
for (++$last_code; $last_code < 0x10000; ++$last_code)
|
for (++$last_code; $last_code < 0x10000; ++$last_code)
|
||||||
@@ -207,54 +252,59 @@ open (INPUT, "< $ARGV[2]") || exit 1;
|
|||||||
$last_code = -1;
|
$last_code = -1;
|
||||||
while (<INPUT>)
|
while (<INPUT>)
|
||||||
{
|
{
|
||||||
|
my ($start_code, $end_code);
|
||||||
|
|
||||||
chop;
|
chop;
|
||||||
|
|
||||||
next if /^#/;
|
next if /^#/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
@fields = split (';', $_, 30);
|
@fields = split (';', $_, 30);
|
||||||
if ($#fields != 2)
|
if ($#fields != 1)
|
||||||
{
|
{
|
||||||
printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
|
printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
|
||||||
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
$code = hex ($fields[$CODE]);
|
if ($fields[$CODE] =~ /([A-F0-9]{4})..([A-F0-9]{4})/)
|
||||||
|
|
||||||
last if ($code > 0xFFFF); # ignore characters out of the basic plane
|
|
||||||
|
|
||||||
if ($code > $last_code + 1)
|
|
||||||
{
|
{
|
||||||
# Found a gap.
|
$start_code = hex ($1);
|
||||||
if ($fields[$NAME] =~ /Last>/)
|
$end_code = hex ($2);
|
||||||
|
} else {
|
||||||
|
$start_code = $end_code = hex ($fields[$CODE]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
last if ($start_code > 0xFFFF); # FIXME ignore characters out of the basic plane
|
||||||
|
|
||||||
|
if ($start_code > $last_code + 1)
|
||||||
|
{
|
||||||
|
# The gap represents undefined characters. If assigned,
|
||||||
|
# they are AL, if not assigned, XX
|
||||||
|
for (++$last_code; $last_code < $start_code; ++$last_code)
|
||||||
{
|
{
|
||||||
# Fill the gap with the last character read,
|
if ($type[$last_code] eq 'Cn')
|
||||||
# since this was a range specified in the char database
|
{
|
||||||
$gap_break_prop = $fields[$BREAK_PROPERTY];
|
$break_props[$last_code] = 'XX';
|
||||||
for (++$last_code; $last_code < $code; ++$last_code)
|
}
|
||||||
{
|
else
|
||||||
$break_props[$last_code] = $gap_break_prop;
|
{
|
||||||
}
|
$break_props[$last_code] = 'AL';
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
# The gap represents undefined characters. If assigned,
|
|
||||||
# they are AL, if not assigned, XX
|
|
||||||
for (++$last_code; $last_code < $code; ++$last_code)
|
|
||||||
{
|
|
||||||
if ($type[$last_code] eq 'Cn')
|
|
||||||
{
|
|
||||||
$break_props[$last_code] = 'XX';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$break_props[$last_code] = 'AL';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$break_props[$code] = $fields[$BREAK_PROPERTY];
|
|
||||||
$last_code = $code;
|
for ($last_code = $start_code; $last_code <= $end_code; $last_code++)
|
||||||
|
{
|
||||||
|
$break_props[$last_code] = $fields[$BREAK_PROPERTY];
|
||||||
|
}
|
||||||
|
|
||||||
|
$last_code = $end_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
for (++$last_code; $last_code < 0x10000; ++$last_code)
|
for (++$last_code; $last_code < 0x10000; ++$last_code)
|
||||||
{
|
{
|
||||||
if ($type[$last_code] eq 'Cn')
|
if ($type[$last_code] eq 'Cn')
|
||||||
@@ -270,10 +320,142 @@ for (++$last_code; $last_code < 0x10000; ++$last_code)
|
|||||||
|
|
||||||
print STDERR "Last code is not 0xFFFF" if ($last_code != 0xFFFF);
|
print STDERR "Last code is not 0xFFFF" if ($last_code != 0xFFFF);
|
||||||
|
|
||||||
&print_tables ($last_code)
|
print "Reading special-casing table for case conversion\n";
|
||||||
if $do_props;
|
|
||||||
&print_decomp ($last_code)
|
open (INPUT, "< $ARGV[3]") || exit 1;
|
||||||
if $do_decomp;
|
|
||||||
|
while (<INPUT>)
|
||||||
|
{
|
||||||
|
my $code;
|
||||||
|
|
||||||
|
chop;
|
||||||
|
|
||||||
|
next if /^#/;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
|
@fields = split ('\s*;\s*', $_, 30);
|
||||||
|
|
||||||
|
$raw_code = $fields[$CASE_CODE];
|
||||||
|
$code = hex ($raw_code);
|
||||||
|
|
||||||
|
if ($#fields != 4 && $#fields != 5)
|
||||||
|
{
|
||||||
|
printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!defined $type[$code])
|
||||||
|
{
|
||||||
|
printf STDERR "Special case for code point: $code, which has no defined type\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $fields[5]) {
|
||||||
|
# Ignore conditional special cases - we'll handle them in code
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type[$code] eq 'Lu')
|
||||||
|
{
|
||||||
|
(hex $fields[$CASE_UPPER] == $code) || die "$raw_code is Lu and UCD_Upper($raw_code) != $raw_code";
|
||||||
|
|
||||||
|
&add_special_case ($code, $value[$code],$fields[$CASE_LOWER], $fields[$CASE_TITLE]);
|
||||||
|
|
||||||
|
} elsif ($type[$code] eq 'Lt')
|
||||||
|
{
|
||||||
|
(hex $fields[$CASE_TITLE] == $code) || die "$raw_code is Lt and UCD_Title($raw_code) != $raw_code";
|
||||||
|
|
||||||
|
&add_special_case ($code, undef,$fields[$CASE_LOWER], $fields[$CASE_UPPER]);
|
||||||
|
} elsif ($type[$code] eq 'Ll')
|
||||||
|
{
|
||||||
|
(hex $fields[$CASE_LOWER] == $code) || die "$raw_code is Ll and UCD_Lower($raw_code) != $raw_code";
|
||||||
|
|
||||||
|
&add_special_case ($code, $value[$code],$fields[$CASE_UPPER], $fields[$CASE_TITLE]);
|
||||||
|
} else {
|
||||||
|
printf STDERR "Special case for non-alphabetic code point: $raw_code\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
|
open (INPUT, "< $ARGV[4]") || exit 1;
|
||||||
|
|
||||||
|
my $casefoldlen = 0;
|
||||||
|
my @casefold;
|
||||||
|
|
||||||
|
while (<INPUT>)
|
||||||
|
{
|
||||||
|
my $code;
|
||||||
|
|
||||||
|
chop;
|
||||||
|
|
||||||
|
next if /^#/;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
|
@fields = split ('\s*;\s*', $_, 30);
|
||||||
|
|
||||||
|
$raw_code = $fields[$FOLDING_CODE];
|
||||||
|
$code = hex ($raw_code);
|
||||||
|
|
||||||
|
next if $code > 0xffff; # FIXME!
|
||||||
|
|
||||||
|
if ($#fields != 3)
|
||||||
|
{
|
||||||
|
printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
next if ($fields[$FOLDING_STATUS] eq 'S');
|
||||||
|
|
||||||
|
@values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING];
|
||||||
|
|
||||||
|
# Check simple case
|
||||||
|
|
||||||
|
if (@values == 1 &&
|
||||||
|
!(defined $value[$code] && $value[$code] >= 0xd800 && $value[$code] < 0xdc00) &&
|
||||||
|
defined $type[$code]) {
|
||||||
|
|
||||||
|
my $lower;
|
||||||
|
if ($type[$code] eq 'Ll')
|
||||||
|
{
|
||||||
|
$lower = $code;
|
||||||
|
} elsif ($type[$code] eq 'Lt')
|
||||||
|
{
|
||||||
|
$lower = $title_to_lower{$code};
|
||||||
|
} elsif ($type[$code] eq 'Lu')
|
||||||
|
{
|
||||||
|
$lower = $value[$code];
|
||||||
|
} else {
|
||||||
|
$lower = $code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($lower == $values[0]) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $string = pack ("U*", @values);
|
||||||
|
if (1 + length $string > $casefoldlen) {
|
||||||
|
$casefoldlen = 1 + length $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
push @casefold, [ $code, $string ];
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
|
if ($do_props) {
|
||||||
|
&print_tables ($last_code)
|
||||||
|
}
|
||||||
|
if ($do_decomp) {
|
||||||
|
&print_decomp ($last_code);
|
||||||
|
&output_composition_table;
|
||||||
|
}
|
||||||
|
|
||||||
&print_line_break ($last_code);
|
&print_line_break ($last_code);
|
||||||
|
|
||||||
@@ -307,9 +489,17 @@ sub process_one
|
|||||||
$cclass[$code] = $fields[$COMBINING_CLASSES];
|
$cclass[$code] = $fields[$COMBINING_CLASSES];
|
||||||
|
|
||||||
# Handle decompositions.
|
# Handle decompositions.
|
||||||
if ($fields[$DECOMPOSITION] ne ''
|
if ($fields[$DECOMPOSITION] ne '')
|
||||||
&& $fields[$DECOMPOSITION] !~ /\<.*\>/)
|
|
||||||
{
|
{
|
||||||
|
if ($fields[$DECOMPOSITION] =~ s/\<.*\>\s*//) {
|
||||||
|
$decompose_compat[$code] = 1;
|
||||||
|
} else {
|
||||||
|
$decompose_compat[$code] = 0;
|
||||||
|
|
||||||
|
if (!exists $composition_exclusions{$code}) {
|
||||||
|
$compositions{$code} = $fields[$DECOMPOSITION];
|
||||||
|
}
|
||||||
|
}
|
||||||
$decompositions[$code] = $fields[$DECOMPOSITION];
|
$decompositions[$code] = $fields[$DECOMPOSITION];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -369,6 +559,10 @@ sub print_tables
|
|||||||
}
|
}
|
||||||
print OUT "\n};\n\n";
|
print OUT "\n};\n\n";
|
||||||
|
|
||||||
|
#
|
||||||
|
# print title case table
|
||||||
|
#
|
||||||
|
|
||||||
# FIXME: type.
|
# FIXME: type.
|
||||||
print OUT "static unsigned short title_table[][3] = {\n";
|
print OUT "static unsigned short title_table[][3] = {\n";
|
||||||
my ($item);
|
my ($item);
|
||||||
@@ -383,6 +577,12 @@ sub print_tables
|
|||||||
}
|
}
|
||||||
print OUT "\n};\n\n";
|
print OUT "\n};\n\n";
|
||||||
|
|
||||||
|
#
|
||||||
|
# And special case conversion table -- conversions that change length
|
||||||
|
#
|
||||||
|
&output_special_case_table (\*OUT);
|
||||||
|
&output_casefold_table (\*OUT);
|
||||||
|
|
||||||
print OUT "#endif /* CHARTABLES_H */\n";
|
print OUT "#endif /* CHARTABLES_H */\n";
|
||||||
|
|
||||||
close (OUT);
|
close (OUT);
|
||||||
@@ -494,6 +694,8 @@ sub print_decomp
|
|||||||
print OUT "typedef struct\n{\n";
|
print OUT "typedef struct\n{\n";
|
||||||
# FIXME: type.
|
# FIXME: type.
|
||||||
print OUT " unsigned short ch;\n";
|
print OUT " unsigned short ch;\n";
|
||||||
|
print OUT " unsigned char canon_offset;\n";
|
||||||
|
print OUT " unsigned char compat_offset;\n";
|
||||||
print OUT " unsigned char *expansion;\n";
|
print OUT " unsigned char *expansion;\n";
|
||||||
print OUT "} decomposition;\n\n";
|
print OUT "} decomposition;\n\n";
|
||||||
|
|
||||||
@@ -507,16 +709,43 @@ sub print_decomp
|
|||||||
print OUT ",\n"
|
print OUT ",\n"
|
||||||
if ! $first;
|
if ! $first;
|
||||||
$first = 0;
|
$first = 0;
|
||||||
printf OUT " { 0x%04x, \"", $count;
|
|
||||||
$bytes_out += 2;
|
my $canon_decomp;
|
||||||
foreach $iter (&expand_decomp ($count))
|
my $compat_decomp;
|
||||||
{
|
|
||||||
printf OUT "\\x%02x\\x%02x", $iter / 256, $iter & 0xff;
|
if (!$decompose_compat[$count]) {
|
||||||
$bytes_out += 2;
|
$canon_decomp = make_decomp ($count, 0);
|
||||||
}
|
}
|
||||||
|
$compat_decomp = make_decomp ($count, 1);
|
||||||
|
|
||||||
|
if (defined $canon_decomp && $compat_decomp eq $canon_decomp) {
|
||||||
|
undef $compat_decomp;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $string = "";
|
||||||
|
my $canon_offset = 0xff;
|
||||||
|
my $compat_offset = 0xff;
|
||||||
|
|
||||||
|
if (defined $canon_decomp) {
|
||||||
|
$canon_offset = 0;
|
||||||
|
$string .= $canon_decomp;
|
||||||
|
}
|
||||||
|
if (defined $compat_decomp) {
|
||||||
|
if (defined $canon_decomp) {
|
||||||
|
$string .= "\\x00\\x00";
|
||||||
|
}
|
||||||
|
$compat_offset = (length $string) / 4;
|
||||||
|
$string .= $compat_decomp;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bytes_out += (length $string) / 4; # "\x20"
|
||||||
|
|
||||||
# Only a single terminator because one is implied in the string.
|
# Only a single terminator because one is implied in the string.
|
||||||
print OUT "\\0\" }";
|
printf OUT qq( { 0x%04x, %u, %u, "%s\\0" }),
|
||||||
$bytes_out += 2;
|
$count, $canon_offset, $compat_offset, $string;
|
||||||
|
|
||||||
|
|
||||||
|
$bytes_out += 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print OUT "\n};\n\n";
|
print OUT "\n};\n\n";
|
||||||
@@ -588,16 +817,17 @@ sub fetch_cclass
|
|||||||
# Expand a character decomposition recursively.
|
# Expand a character decomposition recursively.
|
||||||
sub expand_decomp
|
sub expand_decomp
|
||||||
{
|
{
|
||||||
my ($code) = @_;
|
my ($code, $compat) = @_;
|
||||||
|
|
||||||
my ($iter, $val);
|
my ($iter, $val);
|
||||||
my (@result) = ();
|
my (@result) = ();
|
||||||
foreach $iter (split (' ', $decompositions[$code]))
|
foreach $iter (split (' ', $decompositions[$code]))
|
||||||
{
|
{
|
||||||
$val = hex ($iter);
|
$val = hex ($iter);
|
||||||
if (defined $decompositions[$val])
|
if (defined $decompositions[$val] &&
|
||||||
|
($compat || !$decompose_compat[$val]))
|
||||||
{
|
{
|
||||||
push (@result, &expand_decomp ($val));
|
push (@result, &expand_decomp ($val, $compat));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -607,3 +837,309 @@ sub expand_decomp
|
|||||||
|
|
||||||
return @result;
|
return @result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub make_decomp
|
||||||
|
{
|
||||||
|
my ($code, $compat) = @_;
|
||||||
|
|
||||||
|
my $result = "";
|
||||||
|
foreach $iter (&expand_decomp ($code, $compat))
|
||||||
|
{
|
||||||
|
$result .= sprintf "\\x%02x\\x%02x", $iter / 256, $iter & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result;
|
||||||
|
}
|
||||||
|
# Generate special case data string from two fields
|
||||||
|
sub add_special_case
|
||||||
|
{
|
||||||
|
my ($code, $single, $field1, $field2) = @_;
|
||||||
|
|
||||||
|
@values = (defined $single ? $single : (),
|
||||||
|
(map { hex ($_) } split /\s+/, $field1),
|
||||||
|
0,
|
||||||
|
(map { hex ($_) } split /\s+/, $field2));
|
||||||
|
$result = "";
|
||||||
|
|
||||||
|
|
||||||
|
for $value (@values) {
|
||||||
|
$result .= sprintf ("\\x%02x\\x%02x", $value / 256, $value & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result .= "\\0";
|
||||||
|
|
||||||
|
if (2 * @values + 2 > $special_case_len) {
|
||||||
|
$special_case_len = 2 * @values + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
push @special_cases, $result;
|
||||||
|
|
||||||
|
#
|
||||||
|
# We encode special cases in the surrogate pair space
|
||||||
|
#
|
||||||
|
$value[$code] = 0xD800 + scalar(@special_cases) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output_special_case_table
|
||||||
|
{
|
||||||
|
my $out = shift;
|
||||||
|
|
||||||
|
print $out <<EOT;
|
||||||
|
|
||||||
|
/* Table of special cases for case conversion; each record contains
|
||||||
|
* First, the best single character mapping to lowercase if Lu,
|
||||||
|
* and to uppercase if Ll, followed by the output mapping for the two cases
|
||||||
|
* other than the case of the codepoint, in the order [Ll],[Lu],[Lt],
|
||||||
|
* separated and terminated by a double NUL.
|
||||||
|
*/
|
||||||
|
guchar special_case_table[][$special_case_len] = {
|
||||||
|
EOT
|
||||||
|
|
||||||
|
for $case (@special_cases) {
|
||||||
|
print $out qq( "$case",\n);
|
||||||
|
}
|
||||||
|
|
||||||
|
print $out <<EOT;
|
||||||
|
};
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
print STDERR "Generated ", ($special_case_len * scalar @special_cases), " bytes in special case table\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub enumerate_ordered
|
||||||
|
{
|
||||||
|
my ($array) = @_;
|
||||||
|
|
||||||
|
my $n = 0;
|
||||||
|
for my $code (sort { $a <=> $b } keys %$array) {
|
||||||
|
if ($array->{$code} == 1) {
|
||||||
|
delete $array->{$code};
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
$array->{$code} = $n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output_composition_table
|
||||||
|
{
|
||||||
|
print STDERR "Generating composition table\n";
|
||||||
|
|
||||||
|
local ($bytes_out) = 0;
|
||||||
|
|
||||||
|
my %first;
|
||||||
|
my %second;
|
||||||
|
|
||||||
|
# First we need to go through and remove decompositions
|
||||||
|
# starting with a non-starter, and single-character
|
||||||
|
# decompositions. At the same time, record
|
||||||
|
# the first and second character of each decomposition
|
||||||
|
|
||||||
|
for $code (keys %compositions) {
|
||||||
|
@values = map { hex ($_) } split /\s+/, $compositions{$code};
|
||||||
|
if ($cclass[$values[0]]) {
|
||||||
|
delete $compositions{$code};
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if (@values == 1) {
|
||||||
|
delete $compositions{$code};
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if (@values != 2) {
|
||||||
|
die "$code has more than two elements in its decomposition!\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exists $first{$values[0]}) {
|
||||||
|
$first{$values[0]}++;
|
||||||
|
} else {
|
||||||
|
$first{$values[0]} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Assign integer indicices, removing singletons
|
||||||
|
my $n_first = enumerate_ordered (\%first);
|
||||||
|
|
||||||
|
# Now record the second character if each (non-singleton) decomposition
|
||||||
|
for $code (keys %compositions) {
|
||||||
|
@values = map { hex ($_) } split /\s+/, $compositions{$code};
|
||||||
|
|
||||||
|
if (exists $first{$values[0]}) {
|
||||||
|
if (exists $second{$values[1]}) {
|
||||||
|
$second{$values[1]}++;
|
||||||
|
} else {
|
||||||
|
$second{$values[1]} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Assign integer indices, removing duplicate
|
||||||
|
my $n_second = enumerate_ordered (\%second);
|
||||||
|
|
||||||
|
# Build reverse table
|
||||||
|
|
||||||
|
my @first_singletons;
|
||||||
|
my @second_singletons;
|
||||||
|
my %reverse;
|
||||||
|
for $code (keys %compositions) {
|
||||||
|
@values = map { hex ($_) } split /\s+/, $compositions{$code};
|
||||||
|
|
||||||
|
my $first = $first{$values[0]};
|
||||||
|
my $second = $second{$values[1]};
|
||||||
|
|
||||||
|
if (defined $first && defined $second) {
|
||||||
|
$reverse{"$first|$second"} = $code;
|
||||||
|
} elsif (!defined $first) {
|
||||||
|
push @first_singletons, [ $values[0], $values[1], $code ];
|
||||||
|
} else {
|
||||||
|
push @second_singletons, [ $values[1], $values[0], $code ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@first_singletons = sort { $a->[0] <=> $b->[0] } @first_singletons;
|
||||||
|
@second_singletons = sort { $a->[0] <=> $b->[0] } @second_singletons;
|
||||||
|
|
||||||
|
my %vals;
|
||||||
|
|
||||||
|
open OUT, ">gunicomp.h" or die "Cannot open gunicomp.h: $!\n";
|
||||||
|
|
||||||
|
# Assign values in lookup table for all code points involved
|
||||||
|
|
||||||
|
my $total = 1;
|
||||||
|
my $last = 0;
|
||||||
|
printf OUT "#define COMPOSE_FIRST_START %d\n", $total;
|
||||||
|
for $code (keys %first) {
|
||||||
|
$vals{$code} = $first{$code} + $total;
|
||||||
|
$last = $code if $code > $last;
|
||||||
|
}
|
||||||
|
$total += $n_first;
|
||||||
|
$i = 0;
|
||||||
|
printf OUT "#define COMPOSE_FIRST_SINGLE_START %d\n", $total;
|
||||||
|
for $record (@first_singletons) {
|
||||||
|
my $code = $record->[0];
|
||||||
|
$vals{$code} = $i++ + $total;
|
||||||
|
$last = $code if $code > $last;
|
||||||
|
}
|
||||||
|
$total += @first_singletons;
|
||||||
|
printf OUT "#define COMPOSE_SECOND_START %d\n", $total;
|
||||||
|
for $code (keys %second) {
|
||||||
|
$vals{$code} = $second{$code} + $total;
|
||||||
|
$last = $code if $code > $last;
|
||||||
|
}
|
||||||
|
$total += $n_second;
|
||||||
|
$i = 0;
|
||||||
|
printf OUT "#define COMPOSE_SECOND_SINGLE_START %d\n\n", $total;
|
||||||
|
for $record (@second_singletons) {
|
||||||
|
my $code = $record->[0];
|
||||||
|
$vals{$code} = $i++ + $total;
|
||||||
|
$last = $code if $code > $last;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output lookup table
|
||||||
|
|
||||||
|
my @row;
|
||||||
|
for (my $count = 0; $count <= $last; $count += 256)
|
||||||
|
{
|
||||||
|
$row[$count / 256] = &print_row ($count, '(gushort *) ', 'gushort', 2,
|
||||||
|
'compose_page',
|
||||||
|
sub { exists $vals{$_[0]} ? $vals{$_[0]} : 0; });
|
||||||
|
}
|
||||||
|
|
||||||
|
print OUT "static unsigned short *compose_table[256] = {\n";
|
||||||
|
for (my $count = 0; $count <= $last; $count += 256)
|
||||||
|
{
|
||||||
|
print OUT ",\n" if $count > 0;
|
||||||
|
print OUT " ", $row[$count / 256];
|
||||||
|
$bytes_out += 4;
|
||||||
|
}
|
||||||
|
print OUT "\n};\n\n";
|
||||||
|
|
||||||
|
# Output first singletons
|
||||||
|
|
||||||
|
print OUT "gushort compose_first_single[][2] = {\n";
|
||||||
|
$i = 0;
|
||||||
|
for $record (@first_singletons) {
|
||||||
|
print OUT ",\n" if $i++ > 0;
|
||||||
|
printf OUT " { %#06x, %#06x }", $record->[1], $record->[2];
|
||||||
|
}
|
||||||
|
print OUT "\n};\n";
|
||||||
|
|
||||||
|
$bytes_out += @first_singletons * 4;
|
||||||
|
|
||||||
|
# Output second singletons
|
||||||
|
|
||||||
|
print OUT "gushort compose_second_single[][2] = {\n";
|
||||||
|
$i = 0;
|
||||||
|
for $record (@second_singletons) {
|
||||||
|
print OUT ",\n" if $i++ > 0;
|
||||||
|
printf OUT " { %#06x, %#06x }", $record->[1], $record->[2];
|
||||||
|
}
|
||||||
|
print OUT "\n};\n";
|
||||||
|
|
||||||
|
$bytes_out += @second_singletons * 4;
|
||||||
|
|
||||||
|
# Output array of composition pairs
|
||||||
|
|
||||||
|
print OUT <<EOT;
|
||||||
|
gushort compose_array[$n_first][$n_second] = {
|
||||||
|
EOT
|
||||||
|
|
||||||
|
for (my $i = 0; $i < $n_first; $i++) {
|
||||||
|
print OUT ",\n" if $i;
|
||||||
|
print OUT " { ";
|
||||||
|
for (my $j = 0; $j < $n_second; $j++) {
|
||||||
|
print OUT ", " if $j;
|
||||||
|
if (exists $reverse{"$i|$j"}) {
|
||||||
|
printf OUT "%#06x", $reverse{"$i|$j"};
|
||||||
|
} else {
|
||||||
|
print OUT " 0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print OUT " }";
|
||||||
|
}
|
||||||
|
print OUT "\n";
|
||||||
|
|
||||||
|
print OUT <<EOT;
|
||||||
|
};
|
||||||
|
EOT
|
||||||
|
|
||||||
|
$bytes_out += $n_first * $n_second * 2;
|
||||||
|
|
||||||
|
printf STDERR "Generated %d bytes in compose tables\n", $bytes_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output_casefold_table
|
||||||
|
{
|
||||||
|
my $out = shift;
|
||||||
|
|
||||||
|
print $out <<EOT;
|
||||||
|
|
||||||
|
/* Table of casefolding cases that can't be derived by lowercasing
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
guint16 ch;
|
||||||
|
gchar data[$casefoldlen];
|
||||||
|
} casefold_table[] = {
|
||||||
|
EOT
|
||||||
|
|
||||||
|
@casefold = sort { $a->[0] <=> $b->[0] } @casefold;
|
||||||
|
|
||||||
|
for $case (@casefold) {
|
||||||
|
$code = $case->[0];
|
||||||
|
$string = $case->[1];
|
||||||
|
print $out sprintf(qq({ %#04x, "$string" },\n), $code);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
print $out <<EOT;
|
||||||
|
};
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
my $recordlen = (2+$casefoldlen+1) & ~1;
|
||||||
|
printf "Generated %d bytes for casefold table\n", $recordlen * @casefold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -706,7 +706,6 @@ g_io_channel_seek_position (GIOChannel* channel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status = channel->funcs->io_seek (channel, offset, type, error);
|
status = channel->funcs->io_seek (channel, offset, type, error);
|
||||||
|
|
||||||
if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer))
|
if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer))
|
||||||
|
2069
glib/gunibreak.h
2069
glib/gunibreak.h
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
|||||||
#ifndef CHARTABLES_H
|
#ifndef CHARTABLES_H
|
||||||
#define CHARTABLES_H
|
#define CHARTABLES_H
|
||||||
|
|
||||||
#define G_UNICODE_DATA_VERSION "3.0.1"
|
#define G_UNICODE_DATA_VERSION "3.1"
|
||||||
|
|
||||||
#define G_UNICODE_LAST_CHAR 0xffff
|
#define G_UNICODE_LAST_CHAR 0xffff
|
||||||
|
|
||||||
@@ -487,11 +487,11 @@ static char page3[256] = {
|
|||||||
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
|
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
|
||||||
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
|
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
|
||||||
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
|
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER,
|
||||||
|
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER,
|
||||||
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED
|
||||||
G_UNICODE_UNASSIGNED
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static char page4[256] = {
|
static char page4[256] = {
|
||||||
@@ -2142,7 +2142,7 @@ static char page22[256] = {
|
|||||||
G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
|
G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER,
|
||||||
G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION,
|
G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION,
|
||||||
G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
|
G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION,
|
||||||
G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER,
|
G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED,
|
||||||
@@ -4982,7 +4982,7 @@ static unsigned short attrpage0[256] = {
|
|||||||
0x0000, 0x0000, 0x0000, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,
|
0x0000, 0x0000, 0x0000, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,
|
||||||
0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee,
|
0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee,
|
||||||
0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000,
|
0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000,
|
||||||
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0000, 0x00c0,
|
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0xd800, 0x00c0,
|
||||||
0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9,
|
0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9,
|
||||||
0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2,
|
0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2,
|
||||||
0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000, 0x00d8, 0x00d9, 0x00da, 0x00db,
|
0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000, 0x00d8, 0x00d9, 0x00da, 0x00db,
|
||||||
@@ -4998,7 +4998,7 @@ static unsigned short attrpage1[256] = {
|
|||||||
0x012c, 0x012f, 0x012e, 0x0069, 0x0049, 0x0133, 0x0132, 0x0135, 0x0134,
|
0x012c, 0x012f, 0x012e, 0x0069, 0x0049, 0x0133, 0x0132, 0x0135, 0x0134,
|
||||||
0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e, 0x013d,
|
0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e, 0x013d,
|
||||||
0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145, 0x0148,
|
0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145, 0x0148,
|
||||||
0x0147, 0x0000, 0x014b, 0x014a, 0x014d, 0x014c, 0x014f, 0x014e, 0x0151,
|
0x0147, 0xd80e, 0x014b, 0x014a, 0x014d, 0x014c, 0x014f, 0x014e, 0x0151,
|
||||||
0x0150, 0x0153, 0x0152, 0x0155, 0x0154, 0x0157, 0x0156, 0x0159, 0x0158,
|
0x0150, 0x0153, 0x0152, 0x0155, 0x0154, 0x0157, 0x0156, 0x0159, 0x0158,
|
||||||
0x015b, 0x015a, 0x015d, 0x015c, 0x015f, 0x015e, 0x0161, 0x0160, 0x0163,
|
0x015b, 0x015a, 0x015d, 0x015c, 0x015f, 0x015e, 0x0161, 0x0160, 0x0163,
|
||||||
0x0162, 0x0165, 0x0164, 0x0167, 0x0166, 0x0169, 0x0168, 0x016b, 0x016a,
|
0x0162, 0x0165, 0x0164, 0x0167, 0x0166, 0x0169, 0x0168, 0x016b, 0x016a,
|
||||||
@@ -5016,7 +5016,7 @@ static unsigned short attrpage1[256] = {
|
|||||||
0x01d0, 0x01cf, 0x01d2, 0x01d1, 0x01d4, 0x01d3, 0x01d6, 0x01d5, 0x01d8,
|
0x01d0, 0x01cf, 0x01d2, 0x01d1, 0x01d4, 0x01d3, 0x01d6, 0x01d5, 0x01d8,
|
||||||
0x01d7, 0x01da, 0x01d9, 0x01dc, 0x01db, 0x018e, 0x01df, 0x01de, 0x01e1,
|
0x01d7, 0x01da, 0x01d9, 0x01dc, 0x01db, 0x018e, 0x01df, 0x01de, 0x01e1,
|
||||||
0x01e0, 0x01e3, 0x01e2, 0x01e5, 0x01e4, 0x01e7, 0x01e6, 0x01e9, 0x01e8,
|
0x01e0, 0x01e3, 0x01e2, 0x01e5, 0x01e4, 0x01e7, 0x01e6, 0x01e9, 0x01e8,
|
||||||
0x01eb, 0x01ea, 0x01ed, 0x01ec, 0x01ef, 0x01ee, 0x0000, 0x01f3, 0x0000,
|
0x01eb, 0x01ea, 0x01ed, 0x01ec, 0x01ef, 0x01ee, 0xd811, 0x01f3, 0x0000,
|
||||||
0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf, 0x01f9, 0x01f8, 0x01fb, 0x01fa,
|
0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf, 0x01f9, 0x01f8, 0x01fb, 0x01fa,
|
||||||
0x01fd, 0x01fc, 0x01ff, 0x01fe
|
0x01fd, 0x01fc, 0x01ff, 0x01fe
|
||||||
};
|
};
|
||||||
@@ -5070,10 +5070,10 @@ static unsigned short attrpage3[256] = {
|
|||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac,
|
||||||
0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce,
|
0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce,
|
||||||
0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
|
0xd80f, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
|
||||||
0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1,
|
0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1,
|
||||||
0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca,
|
0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca,
|
||||||
0x03cb, 0x0386, 0x0388, 0x0389, 0x038a, 0x0000, 0x0391, 0x0392, 0x0393,
|
0x03cb, 0x0386, 0x0388, 0x0389, 0x038a, 0xd810, 0x0391, 0x0392, 0x0393,
|
||||||
0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c,
|
0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c,
|
||||||
0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5,
|
0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5,
|
||||||
0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f,
|
0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f,
|
||||||
@@ -5081,7 +5081,7 @@ static unsigned short attrpage3[256] = {
|
|||||||
0x0000, 0x0000, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df, 0x03de, 0x03e1,
|
0x0000, 0x0000, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df, 0x03de, 0x03e1,
|
||||||
0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6, 0x03e9, 0x03e8,
|
0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6, 0x03e9, 0x03e8,
|
||||||
0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a, 0x03a1, 0x03a3,
|
0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a, 0x03a1, 0x03a3,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x03b8, 0x0395, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000
|
0x0000, 0x0000, 0x0000, 0x0000
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5133,7 +5133,7 @@ static unsigned short attrpage5[256] = {
|
|||||||
0x053c, 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544,
|
0x053c, 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544,
|
||||||
0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d,
|
0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d,
|
||||||
0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556,
|
0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0xd808, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
@@ -5550,8 +5550,8 @@ static unsigned short attrpage30[256] = {
|
|||||||
0x1e74, 0x1e77, 0x1e76, 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c,
|
0x1e74, 0x1e77, 0x1e76, 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c,
|
||||||
0x1e7f, 0x1e7e, 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87,
|
0x1e7f, 0x1e7e, 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87,
|
||||||
0x1e86, 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e,
|
0x1e86, 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e,
|
||||||
0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x0000, 0x0000, 0x0000,
|
0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0xd812, 0xd813, 0xd814,
|
||||||
0x0000, 0x0000, 0x1e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1, 0x1ea0,
|
0xd815, 0xd816, 0x1e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1, 0x1ea0,
|
||||||
0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, 0x1ea9, 0x1ea8, 0x1eab,
|
0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, 0x1ea9, 0x1ea8, 0x1eab,
|
||||||
0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2,
|
0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2,
|
||||||
0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd,
|
0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd,
|
||||||
@@ -5574,27 +5574,27 @@ static unsigned short attrpage31[256] = {
|
|||||||
0x1f25, 0x1f26, 0x1f27, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d,
|
0x1f25, 0x1f26, 0x1f27, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d,
|
||||||
0x1f3e, 0x1f3f, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36,
|
0x1f3e, 0x1f3f, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36,
|
||||||
0x1f37, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x0000, 0x0000,
|
0x1f37, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x0000, 0x0000,
|
||||||
0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, 0x0000,
|
0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, 0xd817,
|
||||||
0x1f59, 0x0000, 0x1f5b, 0x0000, 0x1f5d, 0x0000, 0x1f5f, 0x0000, 0x1f51,
|
0x1f59, 0xd818, 0x1f5b, 0xd819, 0x1f5d, 0xd81a, 0x1f5f, 0x0000, 0x1f51,
|
||||||
0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, 0x1f68, 0x1f69, 0x1f6a,
|
0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, 0x1f68, 0x1f69, 0x1f6a,
|
||||||
0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f60, 0x1f61, 0x1f62, 0x1f63,
|
0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f60, 0x1f61, 0x1f62, 0x1f63,
|
||||||
0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca,
|
0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca,
|
||||||
0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb,
|
0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb,
|
||||||
0x0000, 0x0000, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e,
|
0x0000, 0x0000, 0xd827, 0xd828, 0xd829, 0xd82a, 0xd82b, 0xd82c, 0xd82d,
|
||||||
0x1f8f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0xd82e, 0xd82f, 0xd830, 0xd831, 0xd832, 0xd833, 0xd834, 0xd835, 0xd836,
|
||||||
0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x0000,
|
0xd837, 0xd838, 0xd839, 0xd83a, 0xd83b, 0xd83c, 0xd83d, 0xd83e, 0xd83f,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fa8, 0x1fa9,
|
0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848,
|
||||||
0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x0000, 0x0000, 0x0000,
|
0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fb8, 0x1fb9, 0x0000, 0x1fbc,
|
0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0x1fb8, 0x1fb9, 0xd85d, 0xd857,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x0000,
|
0xd85e, 0x0000, 0xd81b, 0xd863, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0xd858,
|
||||||
0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fcc, 0x0000, 0x0000,
|
0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0xd85f, 0xd859, 0xd860, 0x0000,
|
||||||
0x0000, 0x0000, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x0000, 0x0000, 0x0000,
|
0xd81c, 0xd864, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0xd85a, 0x0000, 0x0000,
|
||||||
0x0000, 0x1fd8, 0x1fd9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x1fd8, 0x1fd9, 0xd81d, 0xd81e, 0x0000, 0x0000, 0xd81f, 0xd820,
|
||||||
0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8,
|
0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8,
|
||||||
0x1fe9, 0x0000, 0x0000, 0x0000, 0x1fec, 0x0000, 0x0000, 0x1fe0, 0x1fe1,
|
0x1fe9, 0xd821, 0xd822, 0xd823, 0x1fec, 0xd824, 0xd825, 0x1fe0, 0x1fe1,
|
||||||
0x1f7a, 0x1f7b, 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x1f7a, 0x1f7b, 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd861,
|
||||||
0x1ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d,
|
0xd85b, 0xd862, 0x0000, 0xd826, 0xd865, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000
|
0xd85c, 0x0000, 0x0000, 0x0000
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned short attrpage33[256] = {
|
static unsigned short attrpage33[256] = {
|
||||||
@@ -5629,6 +5629,38 @@ static unsigned short attrpage33[256] = {
|
|||||||
0x0000, 0x0000, 0x0000, 0x0000
|
0x0000, 0x0000, 0x0000, 0x0000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static unsigned short attrpage251[256] = {
|
||||||
|
0xd801, 0xd802, 0xd803, 0xd804, 0xd805, 0xd806, 0xd807, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0xd809, 0xd80a, 0xd80b, 0xd80c, 0xd80d, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000
|
||||||
|
};
|
||||||
|
|
||||||
static unsigned short attrpage255[256] = {
|
static unsigned short attrpage255[256] = {
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
|
||||||
@@ -5913,7 +5945,7 @@ static unsigned short *attr_table[256] = {
|
|||||||
0x0000,
|
0x0000,
|
||||||
0x0000,
|
0x0000,
|
||||||
0x0000,
|
0x0000,
|
||||||
0x0000,
|
attrpage251,
|
||||||
0x0000,
|
0x0000,
|
||||||
0x0000,
|
0x0000,
|
||||||
0x0000,
|
0x0000,
|
||||||
@@ -5954,4 +5986,284 @@ static unsigned short title_table[][3] = {
|
|||||||
{ 0x1ffc, 0x0000, 0x1ff3 }
|
{ 0x1ffc, 0x0000, 0x1ff3 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Table of special cases for case conversion; each record contains
|
||||||
|
* First, the best single character mapping to lowercase if Lu,
|
||||||
|
* and to uppercase if Ll, followed by the output mapping for the two cases
|
||||||
|
* other than the case of the codepoint, in the order [Ll],[Lu],[Lt],
|
||||||
|
* separated and terminated by a double NUL.
|
||||||
|
*/
|
||||||
|
guchar special_case_table[][18] = {
|
||||||
|
"\x00\x00\x00\x53\x00\x53\x00\x00\x00\x53\x00\x73\0",
|
||||||
|
"\x00\x00\x00\x46\x00\x46\x00\x00\x00\x46\x00\x66\0",
|
||||||
|
"\x00\x00\x00\x46\x00\x49\x00\x00\x00\x46\x00\x69\0",
|
||||||
|
"\x00\x00\x00\x46\x00\x4c\x00\x00\x00\x46\x00\x6c\0",
|
||||||
|
"\x00\x00\x00\x46\x00\x46\x00\x49\x00\x00\x00\x46\x00\x66\x00\x69\0",
|
||||||
|
"\x00\x00\x00\x46\x00\x46\x00\x4c\x00\x00\x00\x46\x00\x66\x00\x6c\0",
|
||||||
|
"\x00\x00\x00\x53\x00\x54\x00\x00\x00\x53\x00\x74\0",
|
||||||
|
"\x00\x00\x00\x53\x00\x54\x00\x00\x00\x53\x00\x74\0",
|
||||||
|
"\x00\x00\x05\x35\x05\x52\x00\x00\x05\x35\x05\x82\0",
|
||||||
|
"\x00\x00\x05\x44\x05\x46\x00\x00\x05\x44\x05\x76\0",
|
||||||
|
"\x00\x00\x05\x44\x05\x35\x00\x00\x05\x44\x05\x65\0",
|
||||||
|
"\x00\x00\x05\x44\x05\x3b\x00\x00\x05\x44\x05\x6b\0",
|
||||||
|
"\x00\x00\x05\x4e\x05\x46\x00\x00\x05\x4e\x05\x76\0",
|
||||||
|
"\x00\x00\x05\x44\x05\x3d\x00\x00\x05\x44\x05\x6d\0",
|
||||||
|
"\x00\x00\x02\xbc\x00\x4e\x00\x00\x02\xbc\x00\x4e\0",
|
||||||
|
"\x00\x00\x03\x99\x03\x08\x03\x01\x00\x00\x03\x99\x03\x08\x03\x01\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x08\x03\x01\x00\x00\x03\xa5\x03\x08\x03\x01\0",
|
||||||
|
"\x00\x00\x00\x4a\x03\x0c\x00\x00\x00\x4a\x03\x0c\0",
|
||||||
|
"\x00\x00\x00\x48\x03\x31\x00\x00\x00\x48\x03\x31\0",
|
||||||
|
"\x00\x00\x00\x54\x03\x08\x00\x00\x00\x54\x03\x08\0",
|
||||||
|
"\x00\x00\x00\x57\x03\x0a\x00\x00\x00\x57\x03\x0a\0",
|
||||||
|
"\x00\x00\x00\x59\x03\x0a\x00\x00\x00\x59\x03\x0a\0",
|
||||||
|
"\x00\x00\x00\x41\x02\xbe\x00\x00\x00\x41\x02\xbe\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x13\x00\x00\x03\xa5\x03\x13\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x13\x03\x00\x00\x00\x03\xa5\x03\x13\x03\x00\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x13\x03\x01\x00\x00\x03\xa5\x03\x13\x03\x01\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x13\x03\x42\x00\x00\x03\xa5\x03\x13\x03\x42\0",
|
||||||
|
"\x00\x00\x03\x91\x03\x42\x00\x00\x03\x91\x03\x42\0",
|
||||||
|
"\x00\x00\x03\x97\x03\x42\x00\x00\x03\x97\x03\x42\0",
|
||||||
|
"\x00\x00\x03\x99\x03\x08\x03\x00\x00\x00\x03\x99\x03\x08\x03\x00\0",
|
||||||
|
"\x00\x00\x03\x99\x03\x08\x03\x01\x00\x00\x03\x99\x03\x08\x03\x01\0",
|
||||||
|
"\x00\x00\x03\x99\x03\x42\x00\x00\x03\x99\x03\x42\0",
|
||||||
|
"\x00\x00\x03\x99\x03\x08\x03\x42\x00\x00\x03\x99\x03\x08\x03\x42\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x08\x03\x00\x00\x00\x03\xa5\x03\x08\x03\x00\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x08\x03\x01\x00\x00\x03\xa5\x03\x08\x03\x01\0",
|
||||||
|
"\x00\x00\x03\xa1\x03\x13\x00\x00\x03\xa1\x03\x13\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x42\x00\x00\x03\xa5\x03\x42\0",
|
||||||
|
"\x00\x00\x03\xa5\x03\x08\x03\x42\x00\x00\x03\xa5\x03\x08\x03\x42\0",
|
||||||
|
"\x00\x00\x03\xa9\x03\x42\x00\x00\x03\xa9\x03\x42\0",
|
||||||
|
"\x1f\x88\x1f\x08\x03\x99\x00\x00\x1f\x88\0",
|
||||||
|
"\x1f\x89\x1f\x09\x03\x99\x00\x00\x1f\x89\0",
|
||||||
|
"\x1f\x8a\x1f\x0a\x03\x99\x00\x00\x1f\x8a\0",
|
||||||
|
"\x1f\x8b\x1f\x0b\x03\x99\x00\x00\x1f\x8b\0",
|
||||||
|
"\x1f\x8c\x1f\x0c\x03\x99\x00\x00\x1f\x8c\0",
|
||||||
|
"\x1f\x8d\x1f\x0d\x03\x99\x00\x00\x1f\x8d\0",
|
||||||
|
"\x1f\x8e\x1f\x0e\x03\x99\x00\x00\x1f\x8e\0",
|
||||||
|
"\x1f\x8f\x1f\x0f\x03\x99\x00\x00\x1f\x8f\0",
|
||||||
|
"\x1f\x80\x00\x00\x1f\x08\x03\x99\0",
|
||||||
|
"\x1f\x81\x00\x00\x1f\x09\x03\x99\0",
|
||||||
|
"\x1f\x82\x00\x00\x1f\x0a\x03\x99\0",
|
||||||
|
"\x1f\x83\x00\x00\x1f\x0b\x03\x99\0",
|
||||||
|
"\x1f\x84\x00\x00\x1f\x0c\x03\x99\0",
|
||||||
|
"\x1f\x85\x00\x00\x1f\x0d\x03\x99\0",
|
||||||
|
"\x1f\x86\x00\x00\x1f\x0e\x03\x99\0",
|
||||||
|
"\x1f\x87\x00\x00\x1f\x0f\x03\x99\0",
|
||||||
|
"\x1f\x98\x1f\x28\x03\x99\x00\x00\x1f\x98\0",
|
||||||
|
"\x1f\x99\x1f\x29\x03\x99\x00\x00\x1f\x99\0",
|
||||||
|
"\x1f\x9a\x1f\x2a\x03\x99\x00\x00\x1f\x9a\0",
|
||||||
|
"\x1f\x9b\x1f\x2b\x03\x99\x00\x00\x1f\x9b\0",
|
||||||
|
"\x1f\x9c\x1f\x2c\x03\x99\x00\x00\x1f\x9c\0",
|
||||||
|
"\x1f\x9d\x1f\x2d\x03\x99\x00\x00\x1f\x9d\0",
|
||||||
|
"\x1f\x9e\x1f\x2e\x03\x99\x00\x00\x1f\x9e\0",
|
||||||
|
"\x1f\x9f\x1f\x2f\x03\x99\x00\x00\x1f\x9f\0",
|
||||||
|
"\x1f\x90\x00\x00\x1f\x28\x03\x99\0",
|
||||||
|
"\x1f\x91\x00\x00\x1f\x29\x03\x99\0",
|
||||||
|
"\x1f\x92\x00\x00\x1f\x2a\x03\x99\0",
|
||||||
|
"\x1f\x93\x00\x00\x1f\x2b\x03\x99\0",
|
||||||
|
"\x1f\x94\x00\x00\x1f\x2c\x03\x99\0",
|
||||||
|
"\x1f\x95\x00\x00\x1f\x2d\x03\x99\0",
|
||||||
|
"\x1f\x96\x00\x00\x1f\x2e\x03\x99\0",
|
||||||
|
"\x1f\x97\x00\x00\x1f\x2f\x03\x99\0",
|
||||||
|
"\x1f\xa8\x1f\x68\x03\x99\x00\x00\x1f\xa8\0",
|
||||||
|
"\x1f\xa9\x1f\x69\x03\x99\x00\x00\x1f\xa9\0",
|
||||||
|
"\x1f\xaa\x1f\x6a\x03\x99\x00\x00\x1f\xaa\0",
|
||||||
|
"\x1f\xab\x1f\x6b\x03\x99\x00\x00\x1f\xab\0",
|
||||||
|
"\x1f\xac\x1f\x6c\x03\x99\x00\x00\x1f\xac\0",
|
||||||
|
"\x1f\xad\x1f\x6d\x03\x99\x00\x00\x1f\xad\0",
|
||||||
|
"\x1f\xae\x1f\x6e\x03\x99\x00\x00\x1f\xae\0",
|
||||||
|
"\x1f\xaf\x1f\x6f\x03\x99\x00\x00\x1f\xaf\0",
|
||||||
|
"\x1f\xa0\x00\x00\x1f\x68\x03\x99\0",
|
||||||
|
"\x1f\xa1\x00\x00\x1f\x69\x03\x99\0",
|
||||||
|
"\x1f\xa2\x00\x00\x1f\x6a\x03\x99\0",
|
||||||
|
"\x1f\xa3\x00\x00\x1f\x6b\x03\x99\0",
|
||||||
|
"\x1f\xa4\x00\x00\x1f\x6c\x03\x99\0",
|
||||||
|
"\x1f\xa5\x00\x00\x1f\x6d\x03\x99\0",
|
||||||
|
"\x1f\xa6\x00\x00\x1f\x6e\x03\x99\0",
|
||||||
|
"\x1f\xa7\x00\x00\x1f\x6f\x03\x99\0",
|
||||||
|
"\x1f\xbc\x03\x91\x03\x99\x00\x00\x1f\xbc\0",
|
||||||
|
"\x1f\xb3\x00\x00\x03\x91\x03\x99\0",
|
||||||
|
"\x1f\xcc\x03\x97\x03\x99\x00\x00\x1f\xcc\0",
|
||||||
|
"\x1f\xc3\x00\x00\x03\x97\x03\x99\0",
|
||||||
|
"\x1f\xfc\x03\xa9\x03\x99\x00\x00\x1f\xfc\0",
|
||||||
|
"\x1f\xf3\x00\x00\x03\xa9\x03\x99\0",
|
||||||
|
"\x00\x00\x1f\xba\x03\x99\x00\x00\x1f\xba\x03\x45\0",
|
||||||
|
"\x00\x00\x03\x86\x03\x99\x00\x00\x03\x86\x03\x45\0",
|
||||||
|
"\x00\x00\x1f\xca\x03\x99\x00\x00\x1f\xca\x03\x45\0",
|
||||||
|
"\x00\x00\x03\x89\x03\x99\x00\x00\x03\x89\x03\x45\0",
|
||||||
|
"\x00\x00\x1f\xfa\x03\x99\x00\x00\x1f\xfa\x03\x45\0",
|
||||||
|
"\x00\x00\x03\x8f\x03\x99\x00\x00\x03\x8f\x03\x45\0",
|
||||||
|
"\x00\x00\x03\x91\x03\x42\x03\x99\x00\x00\x03\x91\x03\x42\x03\x45\0",
|
||||||
|
"\x00\x00\x03\x97\x03\x42\x03\x99\x00\x00\x03\x97\x03\x42\x03\x45\0",
|
||||||
|
"\x00\x00\x03\xa9\x03\x42\x03\x99\x00\x00\x03\xa9\x03\x42\x03\x45\0",
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Table of casefolding cases that can't be derived by lowercasing
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
guint16 ch;
|
||||||
|
gchar data[7];
|
||||||
|
} casefold_table[] = {
|
||||||
|
{ 0xb5, "μ" },
|
||||||
|
{ 0xdf, "ss" },
|
||||||
|
{ 0x131, "i" },
|
||||||
|
{ 0x149, "ʼn" },
|
||||||
|
{ 0x17f, "s" },
|
||||||
|
{ 0x1f0, "ǰ" },
|
||||||
|
{ 0x345, "ι" },
|
||||||
|
{ 0x390, "ΐ" },
|
||||||
|
{ 0x3b0, "ΰ" },
|
||||||
|
{ 0x3c2, "σ" },
|
||||||
|
{ 0x3d0, "β" },
|
||||||
|
{ 0x3d1, "θ" },
|
||||||
|
{ 0x3d5, "φ" },
|
||||||
|
{ 0x3d6, "π" },
|
||||||
|
{ 0x3f0, "κ" },
|
||||||
|
{ 0x3f1, "ρ" },
|
||||||
|
{ 0x3f2, "σ" },
|
||||||
|
{ 0x3f5, "ε" },
|
||||||
|
{ 0x587, "եւ" },
|
||||||
|
{ 0x1e96, "ẖ" },
|
||||||
|
{ 0x1e97, "ẗ" },
|
||||||
|
{ 0x1e98, "ẘ" },
|
||||||
|
{ 0x1e99, "ẙ" },
|
||||||
|
{ 0x1e9a, "aʾ" },
|
||||||
|
{ 0x1e9b, "ṡ" },
|
||||||
|
{ 0x1f50, "ὐ" },
|
||||||
|
{ 0x1f52, "ὒ" },
|
||||||
|
{ 0x1f54, "ὔ" },
|
||||||
|
{ 0x1f56, "ὖ" },
|
||||||
|
{ 0x1f80, "ἀι" },
|
||||||
|
{ 0x1f81, "ἁι" },
|
||||||
|
{ 0x1f82, "ἂι" },
|
||||||
|
{ 0x1f83, "ἃι" },
|
||||||
|
{ 0x1f84, "ἄι" },
|
||||||
|
{ 0x1f85, "ἅι" },
|
||||||
|
{ 0x1f86, "ἆι" },
|
||||||
|
{ 0x1f87, "ἇι" },
|
||||||
|
{ 0x1f88, "ἀι" },
|
||||||
|
{ 0x1f89, "ἁι" },
|
||||||
|
{ 0x1f8a, "ἂι" },
|
||||||
|
{ 0x1f8b, "ἃι" },
|
||||||
|
{ 0x1f8c, "ἄι" },
|
||||||
|
{ 0x1f8d, "ἅι" },
|
||||||
|
{ 0x1f8e, "ἆι" },
|
||||||
|
{ 0x1f8f, "ἇι" },
|
||||||
|
{ 0x1f90, "ἠι" },
|
||||||
|
{ 0x1f91, "ἡι" },
|
||||||
|
{ 0x1f92, "ἢι" },
|
||||||
|
{ 0x1f93, "ἣι" },
|
||||||
|
{ 0x1f94, "ἤι" },
|
||||||
|
{ 0x1f95, "ἥι" },
|
||||||
|
{ 0x1f96, "ἦι" },
|
||||||
|
{ 0x1f97, "ἧι" },
|
||||||
|
{ 0x1f98, "ἠι" },
|
||||||
|
{ 0x1f99, "ἡι" },
|
||||||
|
{ 0x1f9a, "ἢι" },
|
||||||
|
{ 0x1f9b, "ἣι" },
|
||||||
|
{ 0x1f9c, "ἤι" },
|
||||||
|
{ 0x1f9d, "ἥι" },
|
||||||
|
{ 0x1f9e, "ἦι" },
|
||||||
|
{ 0x1f9f, "ἧι" },
|
||||||
|
{ 0x1fa0, "ὠι" },
|
||||||
|
{ 0x1fa1, "ὡι" },
|
||||||
|
{ 0x1fa2, "ὢι" },
|
||||||
|
{ 0x1fa3, "ὣι" },
|
||||||
|
{ 0x1fa4, "ὤι" },
|
||||||
|
{ 0x1fa5, "ὥι" },
|
||||||
|
{ 0x1fa6, "ὦι" },
|
||||||
|
{ 0x1fa7, "ὧι" },
|
||||||
|
{ 0x1fa8, "ὠι" },
|
||||||
|
{ 0x1fa9, "ὡι" },
|
||||||
|
{ 0x1faa, "ὢι" },
|
||||||
|
{ 0x1fab, "ὣι" },
|
||||||
|
{ 0x1fac, "ὤι" },
|
||||||
|
{ 0x1fad, "ὥι" },
|
||||||
|
{ 0x1fae, "ὦι" },
|
||||||
|
{ 0x1faf, "ὧι" },
|
||||||
|
{ 0x1fb2, "ὰι" },
|
||||||
|
{ 0x1fb3, "αι" },
|
||||||
|
{ 0x1fb4, "άι" },
|
||||||
|
{ 0x1fb6, "ᾶ" },
|
||||||
|
{ 0x1fb7, "ᾶι" },
|
||||||
|
{ 0x1fbc, "αι" },
|
||||||
|
{ 0x1fbe, "ι" },
|
||||||
|
{ 0x1fc2, "ὴι" },
|
||||||
|
{ 0x1fc3, "ηι" },
|
||||||
|
{ 0x1fc4, "ήι" },
|
||||||
|
{ 0x1fc6, "ῆ" },
|
||||||
|
{ 0x1fc7, "ῆι" },
|
||||||
|
{ 0x1fcc, "ηι" },
|
||||||
|
{ 0x1fd2, "ῒ" },
|
||||||
|
{ 0x1fd3, "ΐ" },
|
||||||
|
{ 0x1fd6, "ῖ" },
|
||||||
|
{ 0x1fd7, "ῗ" },
|
||||||
|
{ 0x1fe2, "ῢ" },
|
||||||
|
{ 0x1fe3, "ΰ" },
|
||||||
|
{ 0x1fe4, "ῤ" },
|
||||||
|
{ 0x1fe6, "ῦ" },
|
||||||
|
{ 0x1fe7, "ῧ" },
|
||||||
|
{ 0x1ff2, "ὼι" },
|
||||||
|
{ 0x1ff3, "ωι" },
|
||||||
|
{ 0x1ff4, "ώι" },
|
||||||
|
{ 0x1ff6, "ῶ" },
|
||||||
|
{ 0x1ff7, "ῶι" },
|
||||||
|
{ 0x1ffc, "ωι" },
|
||||||
|
{ 0x2160, "ⅰ" },
|
||||||
|
{ 0x2161, "ⅱ" },
|
||||||
|
{ 0x2162, "ⅲ" },
|
||||||
|
{ 0x2163, "ⅳ" },
|
||||||
|
{ 0x2164, "ⅴ" },
|
||||||
|
{ 0x2165, "ⅵ" },
|
||||||
|
{ 0x2166, "ⅶ" },
|
||||||
|
{ 0x2167, "ⅷ" },
|
||||||
|
{ 0x2168, "ⅸ" },
|
||||||
|
{ 0x2169, "ⅹ" },
|
||||||
|
{ 0x216a, "ⅺ" },
|
||||||
|
{ 0x216b, "ⅻ" },
|
||||||
|
{ 0x216c, "ⅼ" },
|
||||||
|
{ 0x216d, "ⅽ" },
|
||||||
|
{ 0x216e, "ⅾ" },
|
||||||
|
{ 0x216f, "ⅿ" },
|
||||||
|
{ 0x24b6, "ⓐ" },
|
||||||
|
{ 0x24b7, "ⓑ" },
|
||||||
|
{ 0x24b8, "ⓒ" },
|
||||||
|
{ 0x24b9, "ⓓ" },
|
||||||
|
{ 0x24ba, "ⓔ" },
|
||||||
|
{ 0x24bb, "ⓕ" },
|
||||||
|
{ 0x24bc, "ⓖ" },
|
||||||
|
{ 0x24bd, "ⓗ" },
|
||||||
|
{ 0x24be, "ⓘ" },
|
||||||
|
{ 0x24bf, "ⓙ" },
|
||||||
|
{ 0x24c0, "ⓚ" },
|
||||||
|
{ 0x24c1, "ⓛ" },
|
||||||
|
{ 0x24c2, "ⓜ" },
|
||||||
|
{ 0x24c3, "ⓝ" },
|
||||||
|
{ 0x24c4, "ⓞ" },
|
||||||
|
{ 0x24c5, "ⓟ" },
|
||||||
|
{ 0x24c6, "ⓠ" },
|
||||||
|
{ 0x24c7, "ⓡ" },
|
||||||
|
{ 0x24c8, "ⓢ" },
|
||||||
|
{ 0x24c9, "ⓣ" },
|
||||||
|
{ 0x24ca, "ⓤ" },
|
||||||
|
{ 0x24cb, "ⓥ" },
|
||||||
|
{ 0x24cc, "ⓦ" },
|
||||||
|
{ 0x24cd, "ⓧ" },
|
||||||
|
{ 0x24ce, "ⓨ" },
|
||||||
|
{ 0x24cf, "ⓩ" },
|
||||||
|
{ 0xfb00, "ff" },
|
||||||
|
{ 0xfb01, "fi" },
|
||||||
|
{ 0xfb02, "fl" },
|
||||||
|
{ 0xfb03, "ffi" },
|
||||||
|
{ 0xfb04, "ffl" },
|
||||||
|
{ 0xfb05, "st" },
|
||||||
|
{ 0xfb06, "st" },
|
||||||
|
{ 0xfb13, "մն" },
|
||||||
|
{ 0xfb14, "մե" },
|
||||||
|
{ 0xfb15, "մի" },
|
||||||
|
{ 0xfb16, "վն" },
|
||||||
|
{ 0xfb17, "մխ" },
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* CHARTABLES_H */
|
#endif /* CHARTABLES_H */
|
||||||
|
@@ -247,6 +247,28 @@ gboolean g_utf8_validate (const gchar *str,
|
|||||||
/* Validate a Unicode character */
|
/* Validate a Unicode character */
|
||||||
gboolean g_unichar_validate (gunichar ch);
|
gboolean g_unichar_validate (gunichar ch);
|
||||||
|
|
||||||
|
gchar *g_utf8_strup (const gchar *str);
|
||||||
|
gchar *g_utf8_strdown (const gchar *str);
|
||||||
|
gchar *g_utf8_casefold (const gchar *str);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
G_NORMALIZE_DEFAULT,
|
||||||
|
G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT,
|
||||||
|
G_NORMALIZE_DEFAULT_COMPOSE,
|
||||||
|
G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE,
|
||||||
|
G_NORMALIZE_ALL,
|
||||||
|
G_NORMALIZE_NFKD = G_NORMALIZE_ALL,
|
||||||
|
G_NORMALIZE_ALL_COMPOSE,
|
||||||
|
G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
|
||||||
|
} GNormalizeMode;
|
||||||
|
|
||||||
|
gchar *g_utf8_normalize (const gchar *str,
|
||||||
|
GNormalizeMode mode);
|
||||||
|
|
||||||
|
gint g_utf8_collate (const gchar *str1,
|
||||||
|
const gchar *str2);
|
||||||
|
gchar *g_utf8_collate_key (const gchar *str);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __G_UNICODE_H__ */
|
#endif /* __G_UNICODE_H__ */
|
||||||
|
233
glib/gunicollate.c
Normal file
233
glib/gunicollate.c
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
/* gunicollate.c - Collation
|
||||||
|
*
|
||||||
|
* Copyright 2001 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* The Gnome Library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* The Gnome Library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with the Gnome Library; see the file COPYING.LIB. If not,
|
||||||
|
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <string.h>
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
#include <wchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "glib.h"
|
||||||
|
|
||||||
|
extern gunichar *_g_utf8_normalize_wc (const gchar *str,
|
||||||
|
GNormalizeMode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_utf8_collate:
|
||||||
|
* @str1: a UTF-8 encoded string
|
||||||
|
* @str2: a UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* Compares two strings for ordering using the linguistically
|
||||||
|
* correct rules for the current locale. When sorting a large
|
||||||
|
* number of strings, it will be significantly faster to
|
||||||
|
* obtain collation keys with g_utf8_collate_key() and
|
||||||
|
* compare the keys with strcmp() when sorting instead of
|
||||||
|
* sorting the original strings.
|
||||||
|
*
|
||||||
|
* Return value: -1 if str1 compares before str2, 0 if they
|
||||||
|
* compare equal, 1 if str1 compares after str2.
|
||||||
|
**/
|
||||||
|
gint
|
||||||
|
g_utf8_collate (const gchar *str1,
|
||||||
|
const gchar *str2)
|
||||||
|
{
|
||||||
|
gint result;
|
||||||
|
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
|
||||||
|
gunichar *str1_norm = _g_utf8_normalize_wc (str1, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
gunichar *str2_norm = _g_utf8_normalize_wc (str2, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
|
||||||
|
result = wcscoll ((wchar_t *)str1_norm, (wchar_t *)str2_norm);
|
||||||
|
|
||||||
|
g_free (str1_norm);
|
||||||
|
g_free (str2_norm);
|
||||||
|
|
||||||
|
#else /* !__STDC_ISO_10646__ */
|
||||||
|
|
||||||
|
const gchar *charset;
|
||||||
|
gchar *str1_norm = g_utf8_normalize (str1, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
gchar *str2_norm = g_utf8_normalize (str2, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
|
||||||
|
if (g_get_charset (&charset))
|
||||||
|
{
|
||||||
|
result = strcoll (str1_norm, str2_norm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gchar *str1_locale = g_convert (str1_norm, -1, "UTF-8", charset, NULL, NULL, NULL);
|
||||||
|
gchar *str2_locale = g_convert (str2_norm, -1, "UTF-8", charset, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (str1_locale && str2_locale)
|
||||||
|
result = strcoll (str1_locale, str2_locale);
|
||||||
|
else if (str1_locale)
|
||||||
|
result = -1;
|
||||||
|
else if (str2_locale)
|
||||||
|
result = 1;
|
||||||
|
else
|
||||||
|
result = strcmp (str1_norm, str2_norm);
|
||||||
|
|
||||||
|
g_free (str1_locale);
|
||||||
|
g_free (str2_locale);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (str1_norm);
|
||||||
|
g_free (str2_norm);
|
||||||
|
|
||||||
|
#endif /* __STDC_ISO_10646__ */
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
/* We need UTF-8 encoding of numbers to encode the weights if
|
||||||
|
* we are using wcsxfrm. However, we aren't encoding Unicode
|
||||||
|
* characters, so we can't simply use g_unichar_to_utf8.
|
||||||
|
*
|
||||||
|
* The following routine is taken (with modification) from GNU
|
||||||
|
* libc's strxfrm routine:
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-1999,2000,2001 Free Software Foundation, Inc.
|
||||||
|
* Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
*/
|
||||||
|
static inline int
|
||||||
|
utf8_encode (char *buf, wchar_t val)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
if (val < 0x80)
|
||||||
|
{
|
||||||
|
if (buf)
|
||||||
|
*buf++ = (char) val;
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int step;
|
||||||
|
|
||||||
|
for (step = 2; step < 6; ++step)
|
||||||
|
if ((val & (~(guint32)0 << (5 * step + 1))) == 0)
|
||||||
|
break;
|
||||||
|
retval = step;
|
||||||
|
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
*buf = (unsigned char) (~0xff >> step);
|
||||||
|
--step;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
buf[step] = 0x80 | (val & 0x3f);
|
||||||
|
val >>= 6;
|
||||||
|
}
|
||||||
|
while (--step > 0);
|
||||||
|
*buf |= val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
#endif /* __STDC_ISO_10646__ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_utf8_collate_key:
|
||||||
|
* @str: a UTF-8 encoded string.
|
||||||
|
*
|
||||||
|
* Converts a string into a collation key that can be compared
|
||||||
|
* with other collation keys using strcmp(). The results of
|
||||||
|
* comparing the collation keys of two strings with strcmp()
|
||||||
|
* will always be the same as comparing the two original
|
||||||
|
* keys with g_utf8_collate().
|
||||||
|
*
|
||||||
|
* Return value: a newly allocated string. This string should
|
||||||
|
* be freed with g_free when you are done with it.
|
||||||
|
**/
|
||||||
|
gchar *
|
||||||
|
g_utf8_collate_key (const gchar *str)
|
||||||
|
{
|
||||||
|
gchar *result;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
#ifdef __STDC_ISO_10646__
|
||||||
|
|
||||||
|
gunichar *str_norm = _g_utf8_normalize_wc (str, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
wchar_t *result_wc;
|
||||||
|
size_t i;
|
||||||
|
size_t result_len = 0;
|
||||||
|
|
||||||
|
setlocale (LC_COLLATE, "");
|
||||||
|
|
||||||
|
len = wcsxfrm (NULL, (wchar_t *)str_norm, 0);
|
||||||
|
result_wc = g_new (wchar_t, len + 1);
|
||||||
|
wcsxfrm (result_wc, (wchar_t *)str_norm, len + 1);
|
||||||
|
|
||||||
|
for (i=0; i < len; i++)
|
||||||
|
result_len += utf8_encode (NULL, result_wc[i]);
|
||||||
|
|
||||||
|
result = g_malloc (result_len + 1);
|
||||||
|
result_len = 0;
|
||||||
|
for (i=0; i < len; i++)
|
||||||
|
result_len += utf8_encode (result + result_len, result_wc[i]);
|
||||||
|
|
||||||
|
result[result_len] = '\0';
|
||||||
|
|
||||||
|
g_free (result_wc);
|
||||||
|
g_free (str_norm);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
#else /* !__STDC_ISO_10646__ */
|
||||||
|
|
||||||
|
const gchar *charset;
|
||||||
|
gchar *str_norm = g_utf8_normalize (str, G_NORMALIZE_ALL_COMPOSE);
|
||||||
|
|
||||||
|
if (g_get_charset (&charset))
|
||||||
|
{
|
||||||
|
len = strxfrm (NULL, str_norm, 0);
|
||||||
|
result = g_malloc (len + 1);
|
||||||
|
strxfrm (result, str_norm, len + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gchar *str_locale = g_convert (str_norm, -1, "UTF-8", charset, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (str_locale)
|
||||||
|
{
|
||||||
|
len = strxfrm (NULL, str_locale, 0);
|
||||||
|
result = g_malloc (len + 2);
|
||||||
|
result[0] = 'A';
|
||||||
|
strxfrm (result + 1, str_locale, len + 1);
|
||||||
|
|
||||||
|
g_free (str_locale);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = strlen (str_norm);
|
||||||
|
result = g_malloc (len + 2);
|
||||||
|
result[0] = 'B';
|
||||||
|
memcpy (result + 1, str_norm, len);
|
||||||
|
result[len+1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (str_norm);
|
||||||
|
#endif /* __STDC_ISO_10646__ */
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
667
glib/gunicomp.h
Normal file
667
glib/gunicomp.h
Normal file
@@ -0,0 +1,667 @@
|
|||||||
|
#define COMPOSE_FIRST_START 1
|
||||||
|
#define COMPOSE_FIRST_SINGLE_START 147
|
||||||
|
#define COMPOSE_SECOND_START 357
|
||||||
|
#define COMPOSE_SECOND_SINGLE_START 388
|
||||||
|
|
||||||
|
static gushort compose_page0[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, 150, 6,
|
||||||
|
7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0,
|
||||||
|
0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, 34, 35, 36, 37,
|
||||||
|
38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, 50, 155, 0, 0, 51, 0, 0, 0,
|
||||||
|
0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, 0, 0, 54, 0, 0, 0, 0, 0, 55, 0,
|
||||||
|
159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, 162, 0, 0, 0, 0, 58, 59, 163, 0,
|
||||||
|
164, 0, 0, 0, 60, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page1[256] = {
|
||||||
|
0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, 0, 0, 0,
|
||||||
|
167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 176, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page2[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, 181,
|
||||||
|
182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page3[256] = {
|
||||||
|
357, 358, 359, 360, 361, 0, 362, 363, 364, 365, 366, 367, 368, 0, 0, 369,
|
||||||
|
0, 370, 0, 371, 372, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 374, 375,
|
||||||
|
376, 377, 378, 379, 0, 0, 0, 0, 380, 381, 0, 382, 383, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 73, 0, 74, 0,
|
||||||
|
0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, 0, 185, 0, 186, 0, 0,
|
||||||
|
78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, 0, 83, 0, 0, 0, 84, 0, 0,
|
||||||
|
0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page4[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, 91,
|
||||||
|
190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, 194,
|
||||||
|
0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, 199, 0,
|
||||||
|
0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page6[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 0,
|
||||||
|
211, 0, 0, 0, 0, 0, 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 214, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page9[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 216,
|
||||||
|
0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page11[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page12[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 398, 0, 0, 0,
|
||||||
|
103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 400, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page13[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 104, 223, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0,
|
||||||
|
224, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page16[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page30[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, 0, 0, 0, 0, 0, 0,
|
||||||
|
230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page31[256] = {
|
||||||
|
108, 109, 236, 237, 238, 239, 240, 241, 110, 111, 242, 243, 244, 245, 246,
|
||||||
|
247, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, 117, 248,
|
||||||
|
249, 250, 251, 252, 253, 118, 119, 254, 255, 256, 257, 258, 259, 120, 121,
|
||||||
|
0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, 0, 0, 0, 0, 0,
|
||||||
|
126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0,
|
||||||
|
0, 0, 131, 132, 260, 261, 262, 263, 264, 265, 133, 134, 266, 267, 268, 269,
|
||||||
|
270, 271, 272, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
275, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
136, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page33[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, 279, 0,
|
||||||
|
280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 282, 0, 283, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page34[256] = {
|
||||||
|
0, 0, 0, 284, 0, 0, 0, 0, 285, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 290, 0, 291,
|
||||||
|
0, 0, 292, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 294, 0, 0, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 298,
|
||||||
|
0, 0, 299, 300, 0, 0, 301, 302, 303, 304, 0, 0, 0, 0, 305, 306, 0, 0, 307,
|
||||||
|
308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, 0, 0, 0, 0, 0, 315,
|
||||||
|
316, 317, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static gushort compose_page48[256] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0,
|
||||||
|
0, 320, 0, 321, 0, 322, 0, 323, 0, 324, 0, 325, 0, 326, 0, 327, 0, 328, 0,
|
||||||
|
329, 0, 330, 0, 331, 0, 0, 332, 0, 333, 0, 334, 0, 0, 0, 0, 0, 0, 137, 0,
|
||||||
|
0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 387, 0, 0, 335,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 337, 0, 338, 0, 339, 0, 340, 0,
|
||||||
|
341, 0, 342, 0, 343, 0, 344, 0, 345, 0, 346, 0, 347, 0, 348, 0, 0, 349, 0,
|
||||||
|
350, 0, 351, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, 0, 0, 145, 0, 0,
|
||||||
|
146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 353,
|
||||||
|
354, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned short *compose_table[256] = {
|
||||||
|
compose_page0,
|
||||||
|
compose_page1,
|
||||||
|
compose_page2,
|
||||||
|
compose_page3,
|
||||||
|
compose_page4,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page6,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page9,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page11,
|
||||||
|
compose_page12,
|
||||||
|
compose_page13,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page16,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page30,
|
||||||
|
compose_page31,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page33,
|
||||||
|
compose_page34,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
(gushort *) 0,
|
||||||
|
compose_page48
|
||||||
|
};
|
||||||
|
|
||||||
|
gushort compose_first_single[][2] = {
|
||||||
|
{ 0x0338, 0x226e },
|
||||||
|
{ 0x0338, 0x2260 },
|
||||||
|
{ 0x0338, 0x226f },
|
||||||
|
{ 0x0307, 0x1e1e },
|
||||||
|
{ 0x0302, 0x0134 },
|
||||||
|
{ 0x0307, 0x1e1f },
|
||||||
|
{ 0x0304, 0x01de },
|
||||||
|
{ 0x0301, 0x01fa },
|
||||||
|
{ 0x0301, 0x1e08 },
|
||||||
|
{ 0x0301, 0x1e2e },
|
||||||
|
{ 0x0304, 0x022a },
|
||||||
|
{ 0x0301, 0x01fe },
|
||||||
|
{ 0x0304, 0x01df },
|
||||||
|
{ 0x0301, 0x01fb },
|
||||||
|
{ 0x0301, 0x1e09 },
|
||||||
|
{ 0x0301, 0x1e2f },
|
||||||
|
{ 0x0304, 0x022b },
|
||||||
|
{ 0x0301, 0x01ff },
|
||||||
|
{ 0x0307, 0x1e64 },
|
||||||
|
{ 0x0307, 0x1e65 },
|
||||||
|
{ 0x0307, 0x1e66 },
|
||||||
|
{ 0x0307, 0x1e67 },
|
||||||
|
{ 0x0301, 0x1e78 },
|
||||||
|
{ 0x0301, 0x1e79 },
|
||||||
|
{ 0x0308, 0x1e7a },
|
||||||
|
{ 0x0308, 0x1e7b },
|
||||||
|
{ 0x0307, 0x1e9b },
|
||||||
|
{ 0x030c, 0x01ee },
|
||||||
|
{ 0x0304, 0x01ec },
|
||||||
|
{ 0x0304, 0x01ed },
|
||||||
|
{ 0x0304, 0x01e0 },
|
||||||
|
{ 0x0304, 0x01e1 },
|
||||||
|
{ 0x0306, 0x1e1c },
|
||||||
|
{ 0x0306, 0x1e1d },
|
||||||
|
{ 0x0304, 0x0230 },
|
||||||
|
{ 0x0304, 0x0231 },
|
||||||
|
{ 0x030c, 0x01ef },
|
||||||
|
{ 0x0314, 0x1fec },
|
||||||
|
{ 0x0345, 0x1fb4 },
|
||||||
|
{ 0x0345, 0x1fc4 },
|
||||||
|
{ 0x0345, 0x1ff4 },
|
||||||
|
{ 0x0308, 0x0407 },
|
||||||
|
{ 0x0301, 0x0403 },
|
||||||
|
{ 0x0308, 0x04de },
|
||||||
|
{ 0x0301, 0x040c },
|
||||||
|
{ 0x0308, 0x04e6 },
|
||||||
|
{ 0x0308, 0x04f4 },
|
||||||
|
{ 0x0308, 0x04f8 },
|
||||||
|
{ 0x0308, 0x04ec },
|
||||||
|
{ 0x0301, 0x0453 },
|
||||||
|
{ 0x0308, 0x04df },
|
||||||
|
{ 0x0301, 0x045c },
|
||||||
|
{ 0x0308, 0x04e7 },
|
||||||
|
{ 0x0308, 0x04f5 },
|
||||||
|
{ 0x0308, 0x04f9 },
|
||||||
|
{ 0x0308, 0x04ed },
|
||||||
|
{ 0x0308, 0x0457 },
|
||||||
|
{ 0x030f, 0x0476 },
|
||||||
|
{ 0x030f, 0x0477 },
|
||||||
|
{ 0x0308, 0x04da },
|
||||||
|
{ 0x0308, 0x04db },
|
||||||
|
{ 0x0308, 0x04ea },
|
||||||
|
{ 0x0308, 0x04eb },
|
||||||
|
{ 0x0654, 0x0624 },
|
||||||
|
{ 0x0654, 0x0626 },
|
||||||
|
{ 0x0654, 0x06c2 },
|
||||||
|
{ 0x0654, 0x06d3 },
|
||||||
|
{ 0x0654, 0x06c0 },
|
||||||
|
{ 0x093c, 0x0929 },
|
||||||
|
{ 0x093c, 0x0931 },
|
||||||
|
{ 0x093c, 0x0934 },
|
||||||
|
{ 0x0bd7, 0x0b94 },
|
||||||
|
{ 0x0bbe, 0x0bcb },
|
||||||
|
{ 0x0c56, 0x0c48 },
|
||||||
|
{ 0x0cd5, 0x0cc0 },
|
||||||
|
{ 0x0cd5, 0x0ccb },
|
||||||
|
{ 0x0d3e, 0x0d4b },
|
||||||
|
{ 0x0dca, 0x0ddd },
|
||||||
|
{ 0x102e, 0x1026 },
|
||||||
|
{ 0x0304, 0x1e38 },
|
||||||
|
{ 0x0304, 0x1e39 },
|
||||||
|
{ 0x0304, 0x1e5c },
|
||||||
|
{ 0x0304, 0x1e5d },
|
||||||
|
{ 0x0307, 0x1e68 },
|
||||||
|
{ 0x0307, 0x1e69 },
|
||||||
|
{ 0x0302, 0x1ec6 },
|
||||||
|
{ 0x0302, 0x1ec7 },
|
||||||
|
{ 0x0302, 0x1ed8 },
|
||||||
|
{ 0x0302, 0x1ed9 },
|
||||||
|
{ 0x0345, 0x1f82 },
|
||||||
|
{ 0x0345, 0x1f83 },
|
||||||
|
{ 0x0345, 0x1f84 },
|
||||||
|
{ 0x0345, 0x1f85 },
|
||||||
|
{ 0x0345, 0x1f86 },
|
||||||
|
{ 0x0345, 0x1f87 },
|
||||||
|
{ 0x0345, 0x1f8a },
|
||||||
|
{ 0x0345, 0x1f8b },
|
||||||
|
{ 0x0345, 0x1f8c },
|
||||||
|
{ 0x0345, 0x1f8d },
|
||||||
|
{ 0x0345, 0x1f8e },
|
||||||
|
{ 0x0345, 0x1f8f },
|
||||||
|
{ 0x0345, 0x1f92 },
|
||||||
|
{ 0x0345, 0x1f93 },
|
||||||
|
{ 0x0345, 0x1f94 },
|
||||||
|
{ 0x0345, 0x1f95 },
|
||||||
|
{ 0x0345, 0x1f96 },
|
||||||
|
{ 0x0345, 0x1f97 },
|
||||||
|
{ 0x0345, 0x1f9a },
|
||||||
|
{ 0x0345, 0x1f9b },
|
||||||
|
{ 0x0345, 0x1f9c },
|
||||||
|
{ 0x0345, 0x1f9d },
|
||||||
|
{ 0x0345, 0x1f9e },
|
||||||
|
{ 0x0345, 0x1f9f },
|
||||||
|
{ 0x0345, 0x1fa2 },
|
||||||
|
{ 0x0345, 0x1fa3 },
|
||||||
|
{ 0x0345, 0x1fa4 },
|
||||||
|
{ 0x0345, 0x1fa5 },
|
||||||
|
{ 0x0345, 0x1fa6 },
|
||||||
|
{ 0x0345, 0x1fa7 },
|
||||||
|
{ 0x0345, 0x1faa },
|
||||||
|
{ 0x0345, 0x1fab },
|
||||||
|
{ 0x0345, 0x1fac },
|
||||||
|
{ 0x0345, 0x1fad },
|
||||||
|
{ 0x0345, 0x1fae },
|
||||||
|
{ 0x0345, 0x1faf },
|
||||||
|
{ 0x0345, 0x1fb2 },
|
||||||
|
{ 0x0345, 0x1fc2 },
|
||||||
|
{ 0x0345, 0x1ff2 },
|
||||||
|
{ 0x0345, 0x1fb7 },
|
||||||
|
{ 0x0345, 0x1fc7 },
|
||||||
|
{ 0x0345, 0x1ff7 },
|
||||||
|
{ 0x0338, 0x219a },
|
||||||
|
{ 0x0338, 0x219b },
|
||||||
|
{ 0x0338, 0x21ae },
|
||||||
|
{ 0x0338, 0x21cd },
|
||||||
|
{ 0x0338, 0x21cf },
|
||||||
|
{ 0x0338, 0x21ce },
|
||||||
|
{ 0x0338, 0x2204 },
|
||||||
|
{ 0x0338, 0x2209 },
|
||||||
|
{ 0x0338, 0x220c },
|
||||||
|
{ 0x0338, 0x2224 },
|
||||||
|
{ 0x0338, 0x2226 },
|
||||||
|
{ 0x0338, 0x2241 },
|
||||||
|
{ 0x0338, 0x2244 },
|
||||||
|
{ 0x0338, 0x2247 },
|
||||||
|
{ 0x0338, 0x2249 },
|
||||||
|
{ 0x0338, 0x226d },
|
||||||
|
{ 0x0338, 0x2262 },
|
||||||
|
{ 0x0338, 0x2270 },
|
||||||
|
{ 0x0338, 0x2271 },
|
||||||
|
{ 0x0338, 0x2274 },
|
||||||
|
{ 0x0338, 0x2275 },
|
||||||
|
{ 0x0338, 0x2278 },
|
||||||
|
{ 0x0338, 0x2279 },
|
||||||
|
{ 0x0338, 0x2280 },
|
||||||
|
{ 0x0338, 0x2281 },
|
||||||
|
{ 0x0338, 0x22e0 },
|
||||||
|
{ 0x0338, 0x22e1 },
|
||||||
|
{ 0x0338, 0x2284 },
|
||||||
|
{ 0x0338, 0x2285 },
|
||||||
|
{ 0x0338, 0x2288 },
|
||||||
|
{ 0x0338, 0x2289 },
|
||||||
|
{ 0x0338, 0x22e2 },
|
||||||
|
{ 0x0338, 0x22e3 },
|
||||||
|
{ 0x0338, 0x22ac },
|
||||||
|
{ 0x0338, 0x22ad },
|
||||||
|
{ 0x0338, 0x22ae },
|
||||||
|
{ 0x0338, 0x22af },
|
||||||
|
{ 0x0338, 0x22ea },
|
||||||
|
{ 0x0338, 0x22eb },
|
||||||
|
{ 0x0338, 0x22ec },
|
||||||
|
{ 0x0338, 0x22ed },
|
||||||
|
{ 0x3099, 0x3094 },
|
||||||
|
{ 0x3099, 0x304c },
|
||||||
|
{ 0x3099, 0x304e },
|
||||||
|
{ 0x3099, 0x3050 },
|
||||||
|
{ 0x3099, 0x3052 },
|
||||||
|
{ 0x3099, 0x3054 },
|
||||||
|
{ 0x3099, 0x3056 },
|
||||||
|
{ 0x3099, 0x3058 },
|
||||||
|
{ 0x3099, 0x305a },
|
||||||
|
{ 0x3099, 0x305c },
|
||||||
|
{ 0x3099, 0x305e },
|
||||||
|
{ 0x3099, 0x3060 },
|
||||||
|
{ 0x3099, 0x3062 },
|
||||||
|
{ 0x3099, 0x3065 },
|
||||||
|
{ 0x3099, 0x3067 },
|
||||||
|
{ 0x3099, 0x3069 },
|
||||||
|
{ 0x3099, 0x309e },
|
||||||
|
{ 0x3099, 0x30f4 },
|
||||||
|
{ 0x3099, 0x30ac },
|
||||||
|
{ 0x3099, 0x30ae },
|
||||||
|
{ 0x3099, 0x30b0 },
|
||||||
|
{ 0x3099, 0x30b2 },
|
||||||
|
{ 0x3099, 0x30b4 },
|
||||||
|
{ 0x3099, 0x30b6 },
|
||||||
|
{ 0x3099, 0x30b8 },
|
||||||
|
{ 0x3099, 0x30ba },
|
||||||
|
{ 0x3099, 0x30bc },
|
||||||
|
{ 0x3099, 0x30be },
|
||||||
|
{ 0x3099, 0x30c0 },
|
||||||
|
{ 0x3099, 0x30c2 },
|
||||||
|
{ 0x3099, 0x30c5 },
|
||||||
|
{ 0x3099, 0x30c7 },
|
||||||
|
{ 0x3099, 0x30c9 },
|
||||||
|
{ 0x3099, 0x30f7 },
|
||||||
|
{ 0x3099, 0x30f8 },
|
||||||
|
{ 0x3099, 0x30f9 },
|
||||||
|
{ 0x3099, 0x30fa },
|
||||||
|
{ 0x3099, 0x30fe }
|
||||||
|
};
|
||||||
|
gushort compose_second_single[][2] = {
|
||||||
|
{ 0x0627, 0x0622 },
|
||||||
|
{ 0x0627, 0x0623 },
|
||||||
|
{ 0x0627, 0x0625 },
|
||||||
|
{ 0x09c7, 0x09cb },
|
||||||
|
{ 0x09c7, 0x09cc },
|
||||||
|
{ 0x0b47, 0x0b4b },
|
||||||
|
{ 0x0b47, 0x0b48 },
|
||||||
|
{ 0x0b47, 0x0b4c },
|
||||||
|
{ 0x0bc6, 0x0bca },
|
||||||
|
{ 0x0bc6, 0x0bcc },
|
||||||
|
{ 0x0cc6, 0x0cca },
|
||||||
|
{ 0x0cc6, 0x0cc7 },
|
||||||
|
{ 0x0cc6, 0x0cc8 },
|
||||||
|
{ 0x0d46, 0x0d4a },
|
||||||
|
{ 0x0d46, 0x0d4c },
|
||||||
|
{ 0x0dd9, 0x0dda },
|
||||||
|
{ 0x0dd9, 0x0ddc },
|
||||||
|
{ 0x0dd9, 0x0dde }
|
||||||
|
};
|
||||||
|
gushort compose_array[146][31] = {
|
||||||
|
{ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 },
|
||||||
|
{ 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 },
|
||||||
|
{ 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 },
|
||||||
|
{ 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 },
|
||||||
|
{ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 },
|
||||||
|
{ 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 },
|
||||||
|
{ 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 },
|
||||||
|
{ 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 },
|
||||||
|
{ 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 },
|
||||||
|
{ 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 },
|
||||||
|
{ 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 },
|
||||||
|
{ 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 },
|
||||||
|
{ 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 },
|
||||||
|
{ 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 },
|
||||||
|
{ 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 },
|
||||||
|
{ 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 },
|
||||||
|
{ 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 },
|
||||||
|
{ 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 },
|
||||||
|
{ 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 },
|
||||||
|
{ 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 },
|
||||||
|
{ 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 },
|
||||||
|
{ 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 },
|
||||||
|
{ 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 },
|
||||||
|
{ 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 },
|
||||||
|
{ 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 },
|
||||||
|
{ 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 },
|
||||||
|
{ 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 },
|
||||||
|
{ 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 },
|
||||||
|
{ 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 },
|
||||||
|
{ 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 },
|
||||||
|
{ 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 },
|
||||||
|
{ 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 },
|
||||||
|
{ 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 },
|
||||||
|
{ 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 },
|
||||||
|
{ 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 },
|
||||||
|
{ 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 },
|
||||||
|
{ 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 },
|
||||||
|
{ 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 },
|
||||||
|
{ 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 },
|
||||||
|
{ 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 },
|
||||||
|
{ 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da },
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd }
|
||||||
|
};
|
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "glib.h"
|
#include "glib.h"
|
||||||
#include "gunidecomp.h"
|
#include "gunidecomp.h"
|
||||||
|
#include "gunicomp.h"
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -76,41 +77,40 @@ g_unicode_canonical_ordering (gunichar *string,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gunichar *
|
guchar *
|
||||||
g_unicode_canonical_decomposition (gunichar ch,
|
find_decomposition (gunichar ch,
|
||||||
size_t *result_len)
|
gboolean compat)
|
||||||
{
|
{
|
||||||
gunichar *r = NULL;
|
int start = 0;
|
||||||
|
int end = G_N_ELEMENTS (decomp_table);
|
||||||
if (ch <= 0xffff)
|
|
||||||
|
if (ch >= decomp_table[start].ch &&
|
||||||
|
ch <= decomp_table[end - 1].ch)
|
||||||
{
|
{
|
||||||
int start = 0;
|
while (TRUE)
|
||||||
int end = G_N_ELEMENTS (decomp_table);
|
|
||||||
while (start != end)
|
|
||||||
{
|
{
|
||||||
int half = (start + end) / 2;
|
int half = (start + end) / 2;
|
||||||
if (ch == decomp_table[half].ch)
|
if (ch == decomp_table[half].ch)
|
||||||
{
|
{
|
||||||
/* Found it. */
|
int offset;
|
||||||
int i, len;
|
|
||||||
/* We store as a double-nul terminated string. */
|
|
||||||
for (len = 0; (decomp_table[half].expansion[len]
|
|
||||||
|| decomp_table[half].expansion[len + 1]);
|
|
||||||
len += 2)
|
|
||||||
;
|
|
||||||
|
|
||||||
/* We've counted twice as many bytes as there are
|
if (compat)
|
||||||
characters. */
|
|
||||||
*result_len = len / 2;
|
|
||||||
r = malloc (len / 2 * sizeof (gunichar));
|
|
||||||
|
|
||||||
for (i = 0; i < len; i += 2)
|
|
||||||
{
|
{
|
||||||
r[i / 2] = (decomp_table[half].expansion[i] << 8
|
offset = decomp_table[half].compat_offset;
|
||||||
| decomp_table[half].expansion[i + 1]);
|
if (offset == 0xff)
|
||||||
|
offset = decomp_table[half].canon_offset;
|
||||||
}
|
}
|
||||||
break;
|
else
|
||||||
|
{
|
||||||
|
offset = decomp_table[half].canon_offset;
|
||||||
|
if (offset == 0xff)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return decomp_table[half].expansion + offset;
|
||||||
}
|
}
|
||||||
|
else if (half == start)
|
||||||
|
break;
|
||||||
else if (ch > decomp_table[half].ch)
|
else if (ch > decomp_table[half].ch)
|
||||||
start = half;
|
start = half;
|
||||||
else
|
else
|
||||||
@@ -118,7 +118,36 @@ g_unicode_canonical_decomposition (gunichar ch,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r == NULL)
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gunichar *
|
||||||
|
g_unicode_canonical_decomposition (gunichar ch,
|
||||||
|
size_t *result_len)
|
||||||
|
{
|
||||||
|
guchar *decomp = find_decomposition (ch, FALSE);
|
||||||
|
gunichar *r;
|
||||||
|
|
||||||
|
if (decomp)
|
||||||
|
{
|
||||||
|
/* Found it. */
|
||||||
|
int i, len;
|
||||||
|
/* We store as a double-nul terminated string. */
|
||||||
|
for (len = 0; (decomp[len] || decomp[len + 1]);
|
||||||
|
len += 2)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* We've counted twice as many bytes as there are
|
||||||
|
characters. */
|
||||||
|
*result_len = len / 2;
|
||||||
|
r = malloc (len / 2 * sizeof (gunichar));
|
||||||
|
|
||||||
|
for (i = 0; i < len; i += 2)
|
||||||
|
{
|
||||||
|
r[i / 2] = (decomp[i] << 8 | decomp[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* Not in our table. */
|
/* Not in our table. */
|
||||||
r = malloc (sizeof (gunichar));
|
r = malloc (sizeof (gunichar));
|
||||||
@@ -131,3 +160,231 @@ g_unicode_canonical_decomposition (gunichar ch,
|
|||||||
this, but we rely on it here. */
|
this, but we rely on it here. */
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CI(Page, Char) \
|
||||||
|
((((GPOINTER_TO_INT(compose_table[Page])) & 0xff) \
|
||||||
|
== GPOINTER_TO_INT(compose_table[Page])) \
|
||||||
|
? GPOINTER_TO_INT(compose_table[Page]) \
|
||||||
|
: (compose_table[Page][Char]))
|
||||||
|
|
||||||
|
#define COMPOSE_INDEX(Char) \
|
||||||
|
(((Char) > (G_UNICODE_LAST_CHAR)) ? 0 : CI((Char) >> 8, (Char) & 0xff))
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
combine (gunichar a,
|
||||||
|
gunichar b,
|
||||||
|
gunichar *result)
|
||||||
|
{
|
||||||
|
gushort index_a, index_b;
|
||||||
|
|
||||||
|
index_a = COMPOSE_INDEX(a);
|
||||||
|
if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START)
|
||||||
|
{
|
||||||
|
if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0])
|
||||||
|
{
|
||||||
|
*result = compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
index_b = COMPOSE_INDEX(b);
|
||||||
|
if (index_b >= COMPOSE_SECOND_SINGLE_START)
|
||||||
|
{
|
||||||
|
if (a == compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0])
|
||||||
|
{
|
||||||
|
*result = compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START &&
|
||||||
|
index_b >= COMPOSE_SECOND_START && index_a < COMPOSE_SECOND_SINGLE_START)
|
||||||
|
{
|
||||||
|
gunichar res = compose_array[index_a - COMPOSE_FIRST_START][index_b - COMPOSE_SECOND_START];
|
||||||
|
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
*result = res;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gunichar *
|
||||||
|
_g_utf8_normalize_wc (const gchar *str,
|
||||||
|
GNormalizeMode mode)
|
||||||
|
{
|
||||||
|
gsize n_wc;
|
||||||
|
gunichar *wc_buffer;
|
||||||
|
const char *p;
|
||||||
|
gsize last_start;
|
||||||
|
gboolean do_compat = (mode == G_NORMALIZE_NFKC ||
|
||||||
|
mode == G_NORMALIZE_NFKD);
|
||||||
|
gboolean do_compose = (mode == G_NORMALIZE_NFC ||
|
||||||
|
mode == G_NORMALIZE_NFKC);
|
||||||
|
|
||||||
|
n_wc = 0;
|
||||||
|
p = str;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar wc = g_utf8_get_char (p);
|
||||||
|
|
||||||
|
guchar *decomp = find_decomposition (wc, do_compat);
|
||||||
|
|
||||||
|
if (decomp)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
/* We store as a double-nul terminated string. */
|
||||||
|
for (len = 0; (decomp[len] || decomp[len + 1]);
|
||||||
|
len += 2)
|
||||||
|
;
|
||||||
|
n_wc += len / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
n_wc++;
|
||||||
|
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
wc_buffer = g_new (gunichar, n_wc + 1);
|
||||||
|
|
||||||
|
last_start = 0;
|
||||||
|
n_wc = 0;
|
||||||
|
p = str;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar wc = g_utf8_get_char (p);
|
||||||
|
guchar *decomp;
|
||||||
|
int cc;
|
||||||
|
size_t old_n_wc = n_wc;
|
||||||
|
|
||||||
|
decomp = find_decomposition (wc, do_compat);
|
||||||
|
|
||||||
|
if (decomp)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
/* We store as a double-nul terminated string. */
|
||||||
|
for (len = 0; (decomp[len] || decomp[len + 1]);
|
||||||
|
len += 2)
|
||||||
|
wc_buffer[n_wc++] = (decomp[len] << 8 | decomp[len + 1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
wc_buffer[n_wc++] = wc;
|
||||||
|
|
||||||
|
if (n_wc > 0)
|
||||||
|
{
|
||||||
|
cc = COMBINING_CLASS (wc_buffer[old_n_wc]);
|
||||||
|
|
||||||
|
if (cc == 0)
|
||||||
|
{
|
||||||
|
g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start);
|
||||||
|
last_start = old_n_wc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_wc > 0)
|
||||||
|
{
|
||||||
|
g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start);
|
||||||
|
last_start = n_wc;
|
||||||
|
}
|
||||||
|
|
||||||
|
wc_buffer[n_wc] = 0;
|
||||||
|
|
||||||
|
/* All decomposed and reordered */
|
||||||
|
|
||||||
|
|
||||||
|
if (do_compose && n_wc > 0)
|
||||||
|
{
|
||||||
|
gsize i, j;
|
||||||
|
int last_cc = 0;
|
||||||
|
last_start = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n_wc; i++)
|
||||||
|
{
|
||||||
|
int cc = COMBINING_CLASS (wc_buffer[i]);
|
||||||
|
|
||||||
|
if (i > 0 &&
|
||||||
|
(last_cc == 0 || last_cc != cc) &&
|
||||||
|
combine (wc_buffer[last_start], wc_buffer[i],
|
||||||
|
&wc_buffer[last_start]))
|
||||||
|
{
|
||||||
|
for (j = i + 1; j < n_wc; j++)
|
||||||
|
wc_buffer[j-1] = wc_buffer[j];
|
||||||
|
n_wc--;
|
||||||
|
i--;
|
||||||
|
|
||||||
|
if (i == last_start)
|
||||||
|
last_cc = 0;
|
||||||
|
else
|
||||||
|
last_cc = COMBINING_CLASS (wc_buffer[i-1]);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cc == 0)
|
||||||
|
last_start = i;
|
||||||
|
|
||||||
|
last_cc = cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wc_buffer[n_wc] = 0;
|
||||||
|
|
||||||
|
return wc_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_utf8_normalize:
|
||||||
|
* @str: a UTF-8 encoded string.
|
||||||
|
* @mode: the type of normalization to perform.
|
||||||
|
*
|
||||||
|
* Convert a string into canonical form, standardizing
|
||||||
|
* such issues as whether a character with an accent
|
||||||
|
* is represented as a base character and combining
|
||||||
|
* accent or as a single precomposed characters. You
|
||||||
|
* should generally call g_utf8_normalize before
|
||||||
|
* comparing two Unicode strings.
|
||||||
|
*
|
||||||
|
* The normalization mode %G_NORMALIZE_DEFAULT only
|
||||||
|
* standardizes differences that do not affect the
|
||||||
|
* text content, such as the above-mentioned accent
|
||||||
|
* representation. %G_NORMALIZE_ALL also standardizes
|
||||||
|
* the "compatibility" characters in Unicode, such
|
||||||
|
* as SUPERSCRIPT THREE to the standard forms
|
||||||
|
* (in this case DIGIT THREE). Formatting information
|
||||||
|
* may be lost but for most text operations such
|
||||||
|
* characters should be considered the same.
|
||||||
|
* For example, g_utf8_collate() normalizes
|
||||||
|
* with %G_NORMALIZE_ALL as its first step.
|
||||||
|
*
|
||||||
|
* %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE
|
||||||
|
* are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL,
|
||||||
|
* but returned a result with composed forms rather
|
||||||
|
* than a maximally decomposed form. This is often
|
||||||
|
* useful if you intend to convert the string to
|
||||||
|
* a legacy encoding or pass it to a system with
|
||||||
|
* less capable Unicode handling.
|
||||||
|
*
|
||||||
|
* Return value: the string in normalized form
|
||||||
|
**/
|
||||||
|
gchar *
|
||||||
|
g_utf8_normalize (const gchar *str,
|
||||||
|
GNormalizeMode mode)
|
||||||
|
{
|
||||||
|
gunichar *result_wc = _g_utf8_normalize_wc (str, mode);
|
||||||
|
gchar *result;
|
||||||
|
|
||||||
|
result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL);
|
||||||
|
g_free (result_wc);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
4798
glib/gunidecomp.h
4798
glib/gunidecomp.h
File diff suppressed because it is too large
Load Diff
464
glib/guniprop.c
464
glib/guniprop.c
@@ -25,8 +25,8 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
#define asize(x) ((sizeof (x)) / sizeof (x[0]))
|
#include <locale.h>
|
||||||
|
|
||||||
#define ATTTABLE(Page, Char) \
|
#define ATTTABLE(Page, Char) \
|
||||||
((attr_table[Page] == 0) ? 0 : (attr_table[Page][Char]))
|
((attr_table[Page] == 0) ? 0 : (attr_table[Page][Char]))
|
||||||
@@ -40,16 +40,21 @@
|
|||||||
|
|
||||||
#define TYPE(Char) (((Char) > (G_UNICODE_LAST_CHAR)) ? G_UNICODE_UNASSIGNED : TTYPE ((Char) >> 8, (Char) & 0xff))
|
#define TYPE(Char) (((Char) > (G_UNICODE_LAST_CHAR)) ? G_UNICODE_UNASSIGNED : TTYPE ((Char) >> 8, (Char) & 0xff))
|
||||||
|
|
||||||
#define ISDIGIT(Type) ((Type) == G_UNICODE_DECIMAL_NUMBER \
|
#define ISDIGIT(Type) ((Type) == G_UNICODE_DECIMAL_NUMBER \
|
||||||
|| (Type) == G_UNICODE_LETTER_NUMBER \
|
|| (Type) == G_UNICODE_LETTER_NUMBER \
|
||||||
|| (Type) == G_UNICODE_OTHER_NUMBER)
|
|| (Type) == G_UNICODE_OTHER_NUMBER)
|
||||||
|
|
||||||
#define ISALPHA(Type) ((Type) == G_UNICODE_LOWERCASE_LETTER \
|
#define ISALPHA(Type) ((Type) == G_UNICODE_LOWERCASE_LETTER \
|
||||||
|| (Type) == G_UNICODE_UPPERCASE_LETTER \
|
|| (Type) == G_UNICODE_UPPERCASE_LETTER \
|
||||||
|| (Type) == G_UNICODE_TITLECASE_LETTER \
|
|| (Type) == G_UNICODE_TITLECASE_LETTER \
|
||||||
|| (Type) == G_UNICODE_MODIFIER_LETTER \
|
|| (Type) == G_UNICODE_MODIFIER_LETTER \
|
||||||
|| (Type) == G_UNICODE_OTHER_LETTER)
|
|| (Type) == G_UNICODE_OTHER_LETTER)
|
||||||
|
|
||||||
|
#define ISMARK(Type) ((Type) == G_UNICODE_NON_SPACING_MARK || \
|
||||||
|
(Type) == G_UNICODE_COMBINING_MARK || \
|
||||||
|
(Type) == G_UNICODE_ENCLOSING_MARK)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_unichar_isalnum:
|
* g_unichar_isalnum:
|
||||||
* @c: a Unicode character
|
* @c: a Unicode character
|
||||||
@@ -270,7 +275,7 @@ gboolean
|
|||||||
g_unichar_istitle (gunichar c)
|
g_unichar_istitle (gunichar c)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < asize (title_table); ++i)
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
if (title_table[i][0] == c)
|
if (title_table[i][0] == c)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -350,11 +355,20 @@ g_unichar_toupper (gunichar c)
|
|||||||
{
|
{
|
||||||
int t = TYPE (c);
|
int t = TYPE (c);
|
||||||
if (t == G_UNICODE_LOWERCASE_LETTER)
|
if (t == G_UNICODE_LOWERCASE_LETTER)
|
||||||
return ATTTABLE (c >> 8, c & 0xff);
|
{
|
||||||
|
gunichar val = ATTTABLE (c >> 8, c & 0xff);
|
||||||
|
if (val >= 0xd800 && val < 0xdc00)
|
||||||
|
{
|
||||||
|
guchar *p = special_case_table[val - 0xd800];
|
||||||
|
return p[0] * 256 + p[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
else if (t == G_UNICODE_TITLECASE_LETTER)
|
else if (t == G_UNICODE_TITLECASE_LETTER)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < asize (title_table); ++i)
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
{
|
{
|
||||||
if (title_table[i][0] == c)
|
if (title_table[i][0] == c)
|
||||||
return title_table[i][1];
|
return title_table[i][1];
|
||||||
@@ -378,11 +392,20 @@ g_unichar_tolower (gunichar c)
|
|||||||
{
|
{
|
||||||
int t = TYPE (c);
|
int t = TYPE (c);
|
||||||
if (t == G_UNICODE_UPPERCASE_LETTER)
|
if (t == G_UNICODE_UPPERCASE_LETTER)
|
||||||
return ATTTABLE (c >> 8, c & 0xff);
|
{
|
||||||
|
gunichar val = ATTTABLE (c >> 8, c & 0xff);
|
||||||
|
if (val >= 0xd800 && val < 0xdc00)
|
||||||
|
{
|
||||||
|
guchar *p = special_case_table[val - 0xd800];
|
||||||
|
return p[0] * 256 + p[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
else if (t == G_UNICODE_TITLECASE_LETTER)
|
else if (t == G_UNICODE_TITLECASE_LETTER)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < asize (title_table); ++i)
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
{
|
{
|
||||||
if (title_table[i][0] == c)
|
if (title_table[i][0] == c)
|
||||||
return title_table[i][2];
|
return title_table[i][2];
|
||||||
@@ -405,7 +428,7 @@ gunichar
|
|||||||
g_unichar_totitle (gunichar c)
|
g_unichar_totitle (gunichar c)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < asize (title_table); ++i)
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
{
|
{
|
||||||
if (title_table[i][0] == c || title_table[i][1] == c
|
if (title_table[i][0] == c || title_table[i][1] == c
|
||||||
|| title_table[i][2] == c)
|
|| title_table[i][2] == c)
|
||||||
@@ -469,3 +492,416 @@ g_unichar_type (gunichar c)
|
|||||||
{
|
{
|
||||||
return TYPE (c);
|
return TYPE (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Case mapping functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LOCALE_NORMAL,
|
||||||
|
LOCALE_TURKIC,
|
||||||
|
LOCALE_LITHUANIAN
|
||||||
|
} LocaleType;
|
||||||
|
|
||||||
|
static LocaleType
|
||||||
|
get_locale_type (void)
|
||||||
|
{
|
||||||
|
const char *locale = setlocale (LC_CTYPE, NULL);
|
||||||
|
|
||||||
|
switch (locale[0])
|
||||||
|
{
|
||||||
|
case 'a':
|
||||||
|
if (locale[1] == 'z')
|
||||||
|
return LOCALE_TURKIC;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
if (locale[1] == 't')
|
||||||
|
return LOCALE_LITHUANIAN;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (locale[1] == 'r')
|
||||||
|
return LOCALE_TURKIC;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LOCALE_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
output_marks (const char **p_inout,
|
||||||
|
char *out_buffer,
|
||||||
|
int len,
|
||||||
|
gboolean remove_dot)
|
||||||
|
{
|
||||||
|
const char *p = *p_inout;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar c = g_utf8_get_char (p);
|
||||||
|
int t = TYPE(c);
|
||||||
|
|
||||||
|
if (ISMARK(t))
|
||||||
|
{
|
||||||
|
if (!remove_dot || c != 0x307 /* COMBINING DOT ABOVE */)
|
||||||
|
len += g_unichar_to_utf8 (c, out_buffer ? out_buffer + len : NULL);
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p_inout = p;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gsize
|
||||||
|
output_special_case (gchar *out_buffer,
|
||||||
|
gsize len,
|
||||||
|
int index,
|
||||||
|
int type,
|
||||||
|
int which)
|
||||||
|
{
|
||||||
|
guchar *p = special_case_table[index];
|
||||||
|
|
||||||
|
if (type != G_UNICODE_TITLECASE_LETTER)
|
||||||
|
p += 2; /* +2 to skip over "best single match" */
|
||||||
|
|
||||||
|
if (which == 1)
|
||||||
|
{
|
||||||
|
while (p[0] && p[1])
|
||||||
|
p += 2;
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
gunichar ch = p[0] * 256 + p[1];
|
||||||
|
if (!ch)
|
||||||
|
break;
|
||||||
|
|
||||||
|
len += g_unichar_to_utf8 (ch, out_buffer ? out_buffer + len : NULL);
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gsize
|
||||||
|
real_toupper (const gchar *str,
|
||||||
|
gchar *out_buffer,
|
||||||
|
LocaleType locale_type)
|
||||||
|
{
|
||||||
|
const gchar *p = str;
|
||||||
|
const char *last = NULL;
|
||||||
|
gsize len = 0;
|
||||||
|
gboolean last_was_i = FALSE;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar c = g_utf8_get_char (p);
|
||||||
|
int t = TYPE (c);
|
||||||
|
gunichar val;
|
||||||
|
|
||||||
|
last = p;
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
|
||||||
|
if (locale_type == LOCALE_LITHUANIAN)
|
||||||
|
{
|
||||||
|
if (c == 'i')
|
||||||
|
last_was_i = TRUE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (last_was_i)
|
||||||
|
{
|
||||||
|
/* Nasty, need to remove any dot above. Though
|
||||||
|
* I think only E WITH DOT ABOVE occurs in practice
|
||||||
|
* which could simplify this considerably.
|
||||||
|
*/
|
||||||
|
gsize decomp_len, i;
|
||||||
|
gunichar *decomp;
|
||||||
|
|
||||||
|
decomp = g_unicode_canonical_decomposition (c, &decomp_len);
|
||||||
|
for (i=0; i < decomp_len; i++)
|
||||||
|
{
|
||||||
|
if (decomp[i] != 0x307 /* COMBINING DOT ABOVE */)
|
||||||
|
len += g_unichar_to_utf8 (g_unichar_toupper (decomp[i]), out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
g_free (decomp);
|
||||||
|
|
||||||
|
len = output_marks (&p, out_buffer, len, TRUE);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ISMARK(t))
|
||||||
|
last_was_i = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locale_type == LOCALE_TURKIC && c == 'i')
|
||||||
|
{
|
||||||
|
/* i => LATIN CAPITAL LETTER I WITH DOT ABOVE */
|
||||||
|
len += g_unichar_to_utf8 (0x130, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
else if (c == 0x0345) /* COMBINING GREEK YPOGEGRAMMENI */
|
||||||
|
{
|
||||||
|
/* Nasty, need to move it after other combining marks .. this would go away if
|
||||||
|
* we normalized first.
|
||||||
|
*/
|
||||||
|
len = output_marks (&p, out_buffer, len, FALSE);
|
||||||
|
|
||||||
|
/* And output as GREEK CAPITAL LETTER IOTA */
|
||||||
|
len += g_unichar_to_utf8 (0x399, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
else if (t == G_UNICODE_LOWERCASE_LETTER || t == G_UNICODE_TITLECASE_LETTER)
|
||||||
|
{
|
||||||
|
val = ATTTABLE (c >> 8, c & 0xff);
|
||||||
|
|
||||||
|
if (val >= 0xd800 && val < 0xdc00)
|
||||||
|
{
|
||||||
|
len += output_special_case (out_buffer, len, val - 0xd800, t,
|
||||||
|
t == G_UNICODE_LOWERCASE_LETTER ? 0 : 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (t == G_UNICODE_TITLECASE_LETTER)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
|
{
|
||||||
|
if (title_table[i][0] == c)
|
||||||
|
val = title_table[i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gsize char_len = g_utf8_skip[*(guchar *)last];
|
||||||
|
|
||||||
|
if (out_buffer)
|
||||||
|
memcpy (out_buffer + len, last, char_len);
|
||||||
|
|
||||||
|
len += char_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_ut8f_strup:
|
||||||
|
* @string: a UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* Converts all Unicode characters in the string that have a case
|
||||||
|
* to uppercase. The exact manner that this is done depends
|
||||||
|
* on the current locale, and may result in the number of
|
||||||
|
* characters in the string increasing. (For instance, the
|
||||||
|
* German ess-zet will be changed to SS.)
|
||||||
|
*
|
||||||
|
* Return value: a newly allocated string, with all characters
|
||||||
|
* converted to uppercase.
|
||||||
|
**/
|
||||||
|
gchar *
|
||||||
|
g_utf8_strup (const gchar *str)
|
||||||
|
{
|
||||||
|
gsize len;
|
||||||
|
LocaleType locale_type;
|
||||||
|
gchar *result;
|
||||||
|
|
||||||
|
g_return_val_if_fail (str != NULL, NULL);
|
||||||
|
|
||||||
|
locale_type = get_locale_type ();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We use a two pass approach to keep memory management simple
|
||||||
|
*/
|
||||||
|
len = real_toupper (str, NULL, locale_type);
|
||||||
|
result = g_malloc (len + 1);
|
||||||
|
real_toupper (str, result, locale_type);
|
||||||
|
result[len] = '\0';
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gsize
|
||||||
|
real_tolower (const gchar *str,
|
||||||
|
gchar *out_buffer,
|
||||||
|
LocaleType locale_type)
|
||||||
|
{
|
||||||
|
const gchar *p = str;
|
||||||
|
const char *last = NULL;
|
||||||
|
gsize len = 0;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar c = g_utf8_get_char (p);
|
||||||
|
int t = TYPE (c);
|
||||||
|
gunichar val;
|
||||||
|
|
||||||
|
last = p;
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
|
||||||
|
if (locale_type == LOCALE_TURKIC && c == 'I')
|
||||||
|
{
|
||||||
|
/* I => LATIN SMALL LETTER DOTLESS I */
|
||||||
|
len += g_unichar_to_utf8 (0x131, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
else if (c == 0x03A3) /* GREEK CAPITAL LETTER SIGMA */
|
||||||
|
{
|
||||||
|
gunichar next_c = g_utf8_get_char (p);
|
||||||
|
int next_t = TYPE(next_c);
|
||||||
|
|
||||||
|
/* SIGMA mapps differently depending on whether it is
|
||||||
|
* final or not. The following simplified test would
|
||||||
|
* fail in the case of combining marks following the
|
||||||
|
* sigma, but I don't think that occurs in real text.
|
||||||
|
* The test here matches that in ICU.
|
||||||
|
*/
|
||||||
|
if (ISALPHA(next_t)) /* Lu,Ll,Lt,Lm,Lo */
|
||||||
|
val = 0x3c3; /* GREEK SMALL SIGMA */
|
||||||
|
else
|
||||||
|
val = 0x3c2; /* GREEK SMALL FINAL SIGMA */
|
||||||
|
|
||||||
|
len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
else if (t == G_UNICODE_UPPERCASE_LETTER || t == G_UNICODE_TITLECASE_LETTER)
|
||||||
|
{
|
||||||
|
val = ATTTABLE (c >> 8, c & 0xff);
|
||||||
|
|
||||||
|
if (val >= 0xd800 && val < 0xdc00)
|
||||||
|
{
|
||||||
|
len += output_special_case (out_buffer, len, val - 0xd800, t, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (t == G_UNICODE_TITLECASE_LETTER)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (title_table); ++i)
|
||||||
|
{
|
||||||
|
if (title_table[i][0] == c)
|
||||||
|
val = title_table[i][2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gsize char_len = g_utf8_skip[*(guchar *)last];
|
||||||
|
|
||||||
|
if (out_buffer)
|
||||||
|
memcpy (out_buffer + len, last, char_len);
|
||||||
|
|
||||||
|
len += char_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_ut8f_strdown:
|
||||||
|
* @string: a UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* Converts all Unicode characters in the string that have a case
|
||||||
|
* to lowercase. The exact manner that this is done depends
|
||||||
|
* on the current locale, and may result in the number of
|
||||||
|
* characters in the string changing.
|
||||||
|
*
|
||||||
|
* Return value: a newly allocated string, with all characters
|
||||||
|
* converted to lowercase.
|
||||||
|
**/
|
||||||
|
gchar *
|
||||||
|
g_utf8_strdown (const gchar *str)
|
||||||
|
{
|
||||||
|
gsize len;
|
||||||
|
LocaleType locale_type;
|
||||||
|
gchar *result;
|
||||||
|
|
||||||
|
g_return_val_if_fail (str != NULL, NULL);
|
||||||
|
|
||||||
|
locale_type = get_locale_type ();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We use a two pass approach to keep memory management simple
|
||||||
|
*/
|
||||||
|
len = real_tolower (str, NULL, locale_type);
|
||||||
|
result = g_malloc (len + 1);
|
||||||
|
real_tolower (str, result, locale_type);
|
||||||
|
result[len] = '\0';
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_utf8_casefold:
|
||||||
|
* @str: a UTF-8 encoded string
|
||||||
|
*
|
||||||
|
* Converts a string into a form that is independent of case. The
|
||||||
|
* result will not correspond to any particular case, but can be
|
||||||
|
* compared for equality or ordered with the results of calling
|
||||||
|
* g_utf8_casefold() on other strings.
|
||||||
|
*
|
||||||
|
* Note that calling g_utf8_casefold() followed by g_utf8_collate() is
|
||||||
|
* only an approximation to the correct linguistic case insensitive
|
||||||
|
* ordering, though it is a fairly good one. Getting this exactly
|
||||||
|
* right would require a more sophisticated collation function that
|
||||||
|
* takes case sensitivity into account. GLib does not currently
|
||||||
|
* provide such a function.
|
||||||
|
*
|
||||||
|
* Return value: a newly allocated string, that is a
|
||||||
|
* case independent form of @str.
|
||||||
|
**/
|
||||||
|
gchar *
|
||||||
|
g_utf8_casefold (const gchar *str)
|
||||||
|
{
|
||||||
|
GString *result = g_string_new (NULL);
|
||||||
|
const char *p;
|
||||||
|
gchar buf[6];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
p = str;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
gunichar ch = g_utf8_get_char (p);
|
||||||
|
|
||||||
|
int start = 0;
|
||||||
|
int end = G_N_ELEMENTS (casefold_table);
|
||||||
|
|
||||||
|
if (ch >= casefold_table[start].ch &&
|
||||||
|
ch <= casefold_table[end - 1].ch)
|
||||||
|
{
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
int half = (start + end) / 2;
|
||||||
|
if (ch == casefold_table[half].ch)
|
||||||
|
{
|
||||||
|
g_string_append (result, casefold_table[half].data);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
else if (half == start)
|
||||||
|
break;
|
||||||
|
else if (ch > casefold_table[half].ch)
|
||||||
|
start = half;
|
||||||
|
else
|
||||||
|
end = half;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ch = g_unichar_tolower (ch);
|
||||||
|
len = g_unichar_to_utf8 (ch, buf);
|
||||||
|
g_string_append_len (result, buf, len);
|
||||||
|
|
||||||
|
next:
|
||||||
|
p = g_utf8_next_char (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_string_free (result, FALSE);
|
||||||
|
}
|
||||||
|
@@ -44,3 +44,6 @@ testgdateparser
|
|||||||
testglib
|
testglib
|
||||||
timeloop
|
timeloop
|
||||||
timeloop-basic
|
timeloop-basic
|
||||||
|
unicode-caseconv
|
||||||
|
unicode-collate
|
||||||
|
unicode-normalize
|
||||||
|
@@ -34,39 +34,42 @@ endif
|
|||||||
if ENABLE_TIMELOOP
|
if ENABLE_TIMELOOP
|
||||||
timeloop = timeloop
|
timeloop = timeloop
|
||||||
endif
|
endif
|
||||||
noinst_PROGRAMS = testglib testgdate testgdateparser $(timeloop)
|
noinst_PROGRAMS = testglib testgdate testgdateparser unicode-normalize unicode-collate $(timeloop)
|
||||||
testglib_LDADD = $(libglib)
|
testglib_LDADD = $(libglib)
|
||||||
testgdate_LDADD = $(libglib)
|
testgdate_LDADD = $(libglib)
|
||||||
testgdateparser_LDADD = $(libglib)
|
testgdateparser_LDADD = $(libglib)
|
||||||
|
unicode_normalize_LDADD = $(libglib)
|
||||||
|
unicode_collate_LDADD = $(libglib)
|
||||||
if ENABLE_TIMELOOP
|
if ENABLE_TIMELOOP
|
||||||
timeloop_LDADD = $(libglib)
|
timeloop_LDADD = $(libglib)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
test_programs = \
|
test_programs = \
|
||||||
array-test \
|
array-test \
|
||||||
$(CXX_TEST) \
|
$(CXX_TEST) \
|
||||||
date-test \
|
date-test \
|
||||||
dirname-test \
|
dirname-test \
|
||||||
gio-test \
|
gio-test \
|
||||||
hash-test \
|
hash-test \
|
||||||
iochannel-test \
|
iochannel-test \
|
||||||
list-test \
|
list-test \
|
||||||
mainloop-test \
|
mainloop-test \
|
||||||
module-test \
|
module-test \
|
||||||
node-test \
|
node-test \
|
||||||
queue-test \
|
queue-test \
|
||||||
qsort-test \
|
qsort-test \
|
||||||
rand-test \
|
rand-test \
|
||||||
relation-test \
|
relation-test \
|
||||||
shell-test \
|
shell-test \
|
||||||
slist-test \
|
slist-test \
|
||||||
spawn-test \
|
spawn-test \
|
||||||
strfunc-test \
|
strfunc-test \
|
||||||
string-test \
|
string-test \
|
||||||
thread-test \
|
thread-test \
|
||||||
threadpool-test \
|
threadpool-test \
|
||||||
tree-test \
|
tree-test \
|
||||||
type-test \
|
type-test \
|
||||||
|
unicode-caseconv \
|
||||||
unicode-encoding
|
unicode-encoding
|
||||||
|
|
||||||
test_scripts = run-markup-tests.sh
|
test_scripts = run-markup-tests.sh
|
||||||
@@ -108,6 +111,7 @@ threadpool_test_LDADD = $(thread_LDADD)
|
|||||||
tree_test_LDADD = $(progs_LDADD)
|
tree_test_LDADD = $(progs_LDADD)
|
||||||
type_test_LDADD = $(progs_LDADD)
|
type_test_LDADD = $(progs_LDADD)
|
||||||
unicode_encoding_LDADD = $(progs_LDADD)
|
unicode_encoding_LDADD = $(progs_LDADD)
|
||||||
|
unicode_caseconv_LDADD = $(progs_LDADD)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libmoduletestplugin_a.la libmoduletestplugin_b.la
|
lib_LTLIBRARIES = libmoduletestplugin_a.la libmoduletestplugin_b.la
|
||||||
|
|
||||||
|
796
tests/casefold.txt
Normal file
796
tests/casefold.txt
Normal file
@@ -0,0 +1,796 @@
|
|||||||
|
# Test cases generated from Unicode 3.1 data
|
||||||
|
# by gen-casefold-test.pl. Do not edit.
|
||||||
|
#
|
||||||
|
# Some special hand crafted tests
|
||||||
|
#
|
||||||
|
AaBbCc@@ aabbcc@@
|
||||||
|
#
|
||||||
|
# Now the automatic tests
|
||||||
|
#
|
||||||
|
A a
|
||||||
|
B b
|
||||||
|
C c
|
||||||
|
D d
|
||||||
|
E e
|
||||||
|
F f
|
||||||
|
G g
|
||||||
|
H h
|
||||||
|
I i
|
||||||
|
J j
|
||||||
|
K k
|
||||||
|
L l
|
||||||
|
M m
|
||||||
|
N n
|
||||||
|
O o
|
||||||
|
P p
|
||||||
|
Q q
|
||||||
|
R r
|
||||||
|
S s
|
||||||
|
T t
|
||||||
|
U u
|
||||||
|
V v
|
||||||
|
W w
|
||||||
|
X x
|
||||||
|
Y y
|
||||||
|
Z z
|
||||||
|
µ μ
|
||||||
|
À à
|
||||||
|
Á á
|
||||||
|
 â
|
||||||
|
à ã
|
||||||
|
Ä ä
|
||||||
|
Å å
|
||||||
|
Æ æ
|
||||||
|
Ç ç
|
||||||
|
È è
|
||||||
|
É é
|
||||||
|
Ê ê
|
||||||
|
Ë ë
|
||||||
|
Ì ì
|
||||||
|
Í í
|
||||||
|
Î î
|
||||||
|
Ï ï
|
||||||
|
Ð ð
|
||||||
|
Ñ ñ
|
||||||
|
Ò ò
|
||||||
|
Ó ó
|
||||||
|
Ô ô
|
||||||
|
Õ õ
|
||||||
|
Ö ö
|
||||||
|
Ø ø
|
||||||
|
Ù ù
|
||||||
|
Ú ú
|
||||||
|
Û û
|
||||||
|
Ü ü
|
||||||
|
Ý ý
|
||||||
|
Þ þ
|
||||||
|
ß ss
|
||||||
|
Ā ā
|
||||||
|
Ă ă
|
||||||
|
Ą ą
|
||||||
|
Ć ć
|
||||||
|
Ĉ ĉ
|
||||||
|
Ċ ċ
|
||||||
|
Č č
|
||||||
|
Ď ď
|
||||||
|
Đ đ
|
||||||
|
Ē ē
|
||||||
|
Ĕ ĕ
|
||||||
|
Ė ė
|
||||||
|
Ę ę
|
||||||
|
Ě ě
|
||||||
|
Ĝ ĝ
|
||||||
|
Ğ ğ
|
||||||
|
Ġ ġ
|
||||||
|
Ģ ģ
|
||||||
|
Ĥ ĥ
|
||||||
|
Ħ ħ
|
||||||
|
Ĩ ĩ
|
||||||
|
Ī ī
|
||||||
|
Ĭ ĭ
|
||||||
|
Į į
|
||||||
|
İ i
|
||||||
|
ı i
|
||||||
|
IJ ij
|
||||||
|
Ĵ ĵ
|
||||||
|
Ķ ķ
|
||||||
|
Ĺ ĺ
|
||||||
|
Ļ ļ
|
||||||
|
Ľ ľ
|
||||||
|
Ŀ ŀ
|
||||||
|
Ł ł
|
||||||
|
Ń ń
|
||||||
|
Ņ ņ
|
||||||
|
Ň ň
|
||||||
|
ʼn ʼn
|
||||||
|
Ŋ ŋ
|
||||||
|
Ō ō
|
||||||
|
Ŏ ŏ
|
||||||
|
Ő ő
|
||||||
|
Œ œ
|
||||||
|
Ŕ ŕ
|
||||||
|
Ŗ ŗ
|
||||||
|
Ř ř
|
||||||
|
Ś ś
|
||||||
|
Ŝ ŝ
|
||||||
|
Ş ş
|
||||||
|
Š š
|
||||||
|
Ţ ţ
|
||||||
|
Ť ť
|
||||||
|
Ŧ ŧ
|
||||||
|
Ũ ũ
|
||||||
|
Ū ū
|
||||||
|
Ŭ ŭ
|
||||||
|
Ů ů
|
||||||
|
Ű ű
|
||||||
|
Ų ų
|
||||||
|
Ŵ ŵ
|
||||||
|
Ŷ ŷ
|
||||||
|
Ÿ ÿ
|
||||||
|
Ź ź
|
||||||
|
Ż ż
|
||||||
|
Ž ž
|
||||||
|
ſ s
|
||||||
|
Ɓ ɓ
|
||||||
|
Ƃ ƃ
|
||||||
|
Ƅ ƅ
|
||||||
|
Ɔ ɔ
|
||||||
|
Ƈ ƈ
|
||||||
|
Ɖ ɖ
|
||||||
|
Ɗ ɗ
|
||||||
|
Ƌ ƌ
|
||||||
|
Ǝ ǝ
|
||||||
|
Ə ə
|
||||||
|
Ɛ ɛ
|
||||||
|
Ƒ ƒ
|
||||||
|
Ɠ ɠ
|
||||||
|
Ɣ ɣ
|
||||||
|
Ɩ ɩ
|
||||||
|
Ɨ ɨ
|
||||||
|
Ƙ ƙ
|
||||||
|
Ɯ ɯ
|
||||||
|
Ɲ ɲ
|
||||||
|
Ɵ ɵ
|
||||||
|
Ơ ơ
|
||||||
|
Ƣ ƣ
|
||||||
|
Ƥ ƥ
|
||||||
|
Ʀ ʀ
|
||||||
|
Ƨ ƨ
|
||||||
|
Ʃ ʃ
|
||||||
|
Ƭ ƭ
|
||||||
|
Ʈ ʈ
|
||||||
|
Ư ư
|
||||||
|
Ʊ ʊ
|
||||||
|
Ʋ ʋ
|
||||||
|
Ƴ ƴ
|
||||||
|
Ƶ ƶ
|
||||||
|
Ʒ ʒ
|
||||||
|
Ƹ ƹ
|
||||||
|
Ƽ ƽ
|
||||||
|
DŽ dž
|
||||||
|
Dž dž
|
||||||
|
LJ lj
|
||||||
|
Lj lj
|
||||||
|
NJ nj
|
||||||
|
Nj nj
|
||||||
|
Ǎ ǎ
|
||||||
|
Ǐ ǐ
|
||||||
|
Ǒ ǒ
|
||||||
|
Ǔ ǔ
|
||||||
|
Ǖ ǖ
|
||||||
|
Ǘ ǘ
|
||||||
|
Ǚ ǚ
|
||||||
|
Ǜ ǜ
|
||||||
|
Ǟ ǟ
|
||||||
|
Ǡ ǡ
|
||||||
|
Ǣ ǣ
|
||||||
|
Ǥ ǥ
|
||||||
|
Ǧ ǧ
|
||||||
|
Ǩ ǩ
|
||||||
|
Ǫ ǫ
|
||||||
|
Ǭ ǭ
|
||||||
|
Ǯ ǯ
|
||||||
|
ǰ ǰ
|
||||||
|
DZ dz
|
||||||
|
Dz dz
|
||||||
|
Ǵ ǵ
|
||||||
|
Ƕ ƕ
|
||||||
|
Ƿ ƿ
|
||||||
|
Ǹ ǹ
|
||||||
|
Ǻ ǻ
|
||||||
|
Ǽ ǽ
|
||||||
|
Ǿ ǿ
|
||||||
|
Ȁ ȁ
|
||||||
|
Ȃ ȃ
|
||||||
|
Ȅ ȅ
|
||||||
|
Ȇ ȇ
|
||||||
|
Ȉ ȉ
|
||||||
|
Ȋ ȋ
|
||||||
|
Ȍ ȍ
|
||||||
|
Ȏ ȏ
|
||||||
|
Ȑ ȑ
|
||||||
|
Ȓ ȓ
|
||||||
|
Ȕ ȕ
|
||||||
|
Ȗ ȗ
|
||||||
|
Ș ș
|
||||||
|
Ț ț
|
||||||
|
Ȝ ȝ
|
||||||
|
Ȟ ȟ
|
||||||
|
Ȣ ȣ
|
||||||
|
Ȥ ȥ
|
||||||
|
Ȧ ȧ
|
||||||
|
Ȩ ȩ
|
||||||
|
Ȫ ȫ
|
||||||
|
Ȭ ȭ
|
||||||
|
Ȯ ȯ
|
||||||
|
Ȱ ȱ
|
||||||
|
Ȳ ȳ
|
||||||
|
ͅ ι
|
||||||
|
Ά ά
|
||||||
|
Έ έ
|
||||||
|
Ή ή
|
||||||
|
Ί ί
|
||||||
|
Ό ό
|
||||||
|
Ύ ύ
|
||||||
|
Ώ ώ
|
||||||
|
ΐ ΐ
|
||||||
|
Α α
|
||||||
|
Β β
|
||||||
|
Γ γ
|
||||||
|
Δ δ
|
||||||
|
Ε ε
|
||||||
|
Ζ ζ
|
||||||
|
Η η
|
||||||
|
Θ θ
|
||||||
|
Ι ι
|
||||||
|
Κ κ
|
||||||
|
Λ λ
|
||||||
|
Μ μ
|
||||||
|
Ν ν
|
||||||
|
Ξ ξ
|
||||||
|
Ο ο
|
||||||
|
Π π
|
||||||
|
Ρ ρ
|
||||||
|
Σ σ
|
||||||
|
Τ τ
|
||||||
|
Υ υ
|
||||||
|
Φ φ
|
||||||
|
Χ χ
|
||||||
|
Ψ ψ
|
||||||
|
Ω ω
|
||||||
|
Ϊ ϊ
|
||||||
|
Ϋ ϋ
|
||||||
|
ΰ ΰ
|
||||||
|
ς σ
|
||||||
|
ϐ β
|
||||||
|
ϑ θ
|
||||||
|
ϕ φ
|
||||||
|
ϖ π
|
||||||
|
Ϛ ϛ
|
||||||
|
Ϝ ϝ
|
||||||
|
Ϟ ϟ
|
||||||
|
Ϡ ϡ
|
||||||
|
Ϣ ϣ
|
||||||
|
Ϥ ϥ
|
||||||
|
Ϧ ϧ
|
||||||
|
Ϩ ϩ
|
||||||
|
Ϫ ϫ
|
||||||
|
Ϭ ϭ
|
||||||
|
Ϯ ϯ
|
||||||
|
ϰ κ
|
||||||
|
ϱ ρ
|
||||||
|
ϲ σ
|
||||||
|
ϴ θ
|
||||||
|
ϵ ε
|
||||||
|
Ѐ ѐ
|
||||||
|
Ё ё
|
||||||
|
Ђ ђ
|
||||||
|
Ѓ ѓ
|
||||||
|
Є є
|
||||||
|
Ѕ ѕ
|
||||||
|
І і
|
||||||
|
Ї ї
|
||||||
|
Ј ј
|
||||||
|
Љ љ
|
||||||
|
Њ њ
|
||||||
|
Ћ ћ
|
||||||
|
Ќ ќ
|
||||||
|
Ѝ ѝ
|
||||||
|
Ў ў
|
||||||
|
Џ џ
|
||||||
|
А а
|
||||||
|
Б б
|
||||||
|
В в
|
||||||
|
Г г
|
||||||
|
Д д
|
||||||
|
Е е
|
||||||
|
Ж ж
|
||||||
|
З з
|
||||||
|
И и
|
||||||
|
Й й
|
||||||
|
К к
|
||||||
|
Л л
|
||||||
|
М м
|
||||||
|
Н н
|
||||||
|
О о
|
||||||
|
П п
|
||||||
|
Р р
|
||||||
|
С с
|
||||||
|
Т т
|
||||||
|
У у
|
||||||
|
Ф ф
|
||||||
|
Х х
|
||||||
|
Ц ц
|
||||||
|
Ч ч
|
||||||
|
Ш ш
|
||||||
|
Щ щ
|
||||||
|
Ъ ъ
|
||||||
|
Ы ы
|
||||||
|
Ь ь
|
||||||
|
Э э
|
||||||
|
Ю ю
|
||||||
|
Я я
|
||||||
|
Ѡ ѡ
|
||||||
|
Ѣ ѣ
|
||||||
|
Ѥ ѥ
|
||||||
|
Ѧ ѧ
|
||||||
|
Ѩ ѩ
|
||||||
|
Ѫ ѫ
|
||||||
|
Ѭ ѭ
|
||||||
|
Ѯ ѯ
|
||||||
|
Ѱ ѱ
|
||||||
|
Ѳ ѳ
|
||||||
|
Ѵ ѵ
|
||||||
|
Ѷ ѷ
|
||||||
|
Ѹ ѹ
|
||||||
|
Ѻ ѻ
|
||||||
|
Ѽ ѽ
|
||||||
|
Ѿ ѿ
|
||||||
|
Ҁ ҁ
|
||||||
|
Ҍ ҍ
|
||||||
|
Ҏ ҏ
|
||||||
|
Ґ ґ
|
||||||
|
Ғ ғ
|
||||||
|
Ҕ ҕ
|
||||||
|
Җ җ
|
||||||
|
Ҙ ҙ
|
||||||
|
Қ қ
|
||||||
|
Ҝ ҝ
|
||||||
|
Ҟ ҟ
|
||||||
|
Ҡ ҡ
|
||||||
|
Ң ң
|
||||||
|
Ҥ ҥ
|
||||||
|
Ҧ ҧ
|
||||||
|
Ҩ ҩ
|
||||||
|
Ҫ ҫ
|
||||||
|
Ҭ ҭ
|
||||||
|
Ү ү
|
||||||
|
Ұ ұ
|
||||||
|
Ҳ ҳ
|
||||||
|
Ҵ ҵ
|
||||||
|
Ҷ ҷ
|
||||||
|
Ҹ ҹ
|
||||||
|
Һ һ
|
||||||
|
Ҽ ҽ
|
||||||
|
Ҿ ҿ
|
||||||
|
Ӂ ӂ
|
||||||
|
Ӄ ӄ
|
||||||
|
Ӈ ӈ
|
||||||
|
Ӌ ӌ
|
||||||
|
Ӑ ӑ
|
||||||
|
Ӓ ӓ
|
||||||
|
Ӕ ӕ
|
||||||
|
Ӗ ӗ
|
||||||
|
Ә ә
|
||||||
|
Ӛ ӛ
|
||||||
|
Ӝ ӝ
|
||||||
|
Ӟ ӟ
|
||||||
|
Ӡ ӡ
|
||||||
|
Ӣ ӣ
|
||||||
|
Ӥ ӥ
|
||||||
|
Ӧ ӧ
|
||||||
|
Ө ө
|
||||||
|
Ӫ ӫ
|
||||||
|
Ӭ ӭ
|
||||||
|
Ӯ ӯ
|
||||||
|
Ӱ ӱ
|
||||||
|
Ӳ ӳ
|
||||||
|
Ӵ ӵ
|
||||||
|
Ӹ ӹ
|
||||||
|
Ա ա
|
||||||
|
Բ բ
|
||||||
|
Գ գ
|
||||||
|
Դ դ
|
||||||
|
Ե ե
|
||||||
|
Զ զ
|
||||||
|
Է է
|
||||||
|
Ը ը
|
||||||
|
Թ թ
|
||||||
|
Ժ ժ
|
||||||
|
Ի ի
|
||||||
|
Լ լ
|
||||||
|
Խ խ
|
||||||
|
Ծ ծ
|
||||||
|
Կ կ
|
||||||
|
Հ հ
|
||||||
|
Ձ ձ
|
||||||
|
Ղ ղ
|
||||||
|
Ճ ճ
|
||||||
|
Մ մ
|
||||||
|
Յ յ
|
||||||
|
Ն ն
|
||||||
|
Շ շ
|
||||||
|
Ո ո
|
||||||
|
Չ չ
|
||||||
|
Պ պ
|
||||||
|
Ջ ջ
|
||||||
|
Ռ ռ
|
||||||
|
Ս ս
|
||||||
|
Վ վ
|
||||||
|
Տ տ
|
||||||
|
Ր ր
|
||||||
|
Ց ց
|
||||||
|
Ւ ւ
|
||||||
|
Փ փ
|
||||||
|
Ք ք
|
||||||
|
Օ օ
|
||||||
|
Ֆ ֆ
|
||||||
|
և եւ
|
||||||
|
Ḁ ḁ
|
||||||
|
Ḃ ḃ
|
||||||
|
Ḅ ḅ
|
||||||
|
Ḇ ḇ
|
||||||
|
Ḉ ḉ
|
||||||
|
Ḋ ḋ
|
||||||
|
Ḍ ḍ
|
||||||
|
Ḏ ḏ
|
||||||
|
Ḑ ḑ
|
||||||
|
Ḓ ḓ
|
||||||
|
Ḕ ḕ
|
||||||
|
Ḗ ḗ
|
||||||
|
Ḙ ḙ
|
||||||
|
Ḛ ḛ
|
||||||
|
Ḝ ḝ
|
||||||
|
Ḟ ḟ
|
||||||
|
Ḡ ḡ
|
||||||
|
Ḣ ḣ
|
||||||
|
Ḥ ḥ
|
||||||
|
Ḧ ḧ
|
||||||
|
Ḩ ḩ
|
||||||
|
Ḫ ḫ
|
||||||
|
Ḭ ḭ
|
||||||
|
Ḯ ḯ
|
||||||
|
Ḱ ḱ
|
||||||
|
Ḳ ḳ
|
||||||
|
Ḵ ḵ
|
||||||
|
Ḷ ḷ
|
||||||
|
Ḹ ḹ
|
||||||
|
Ḻ ḻ
|
||||||
|
Ḽ ḽ
|
||||||
|
Ḿ ḿ
|
||||||
|
Ṁ ṁ
|
||||||
|
Ṃ ṃ
|
||||||
|
Ṅ ṅ
|
||||||
|
Ṇ ṇ
|
||||||
|
Ṉ ṉ
|
||||||
|
Ṋ ṋ
|
||||||
|
Ṍ ṍ
|
||||||
|
Ṏ ṏ
|
||||||
|
Ṑ ṑ
|
||||||
|
Ṓ ṓ
|
||||||
|
Ṕ ṕ
|
||||||
|
Ṗ ṗ
|
||||||
|
Ṙ ṙ
|
||||||
|
Ṛ ṛ
|
||||||
|
Ṝ ṝ
|
||||||
|
Ṟ ṟ
|
||||||
|
Ṡ ṡ
|
||||||
|
Ṣ ṣ
|
||||||
|
Ṥ ṥ
|
||||||
|
Ṧ ṧ
|
||||||
|
Ṩ ṩ
|
||||||
|
Ṫ ṫ
|
||||||
|
Ṭ ṭ
|
||||||
|
Ṯ ṯ
|
||||||
|
Ṱ ṱ
|
||||||
|
Ṳ ṳ
|
||||||
|
Ṵ ṵ
|
||||||
|
Ṷ ṷ
|
||||||
|
Ṹ ṹ
|
||||||
|
Ṻ ṻ
|
||||||
|
Ṽ ṽ
|
||||||
|
Ṿ ṿ
|
||||||
|
Ẁ ẁ
|
||||||
|
Ẃ ẃ
|
||||||
|
Ẅ ẅ
|
||||||
|
Ẇ ẇ
|
||||||
|
Ẉ ẉ
|
||||||
|
Ẋ ẋ
|
||||||
|
Ẍ ẍ
|
||||||
|
Ẏ ẏ
|
||||||
|
Ẑ ẑ
|
||||||
|
Ẓ ẓ
|
||||||
|
Ẕ ẕ
|
||||||
|
ẖ ẖ
|
||||||
|
ẗ ẗ
|
||||||
|
ẘ ẘ
|
||||||
|
ẙ ẙ
|
||||||
|
ẚ aʾ
|
||||||
|
ẛ ṡ
|
||||||
|
Ạ ạ
|
||||||
|
Ả ả
|
||||||
|
Ấ ấ
|
||||||
|
Ầ ầ
|
||||||
|
Ẩ ẩ
|
||||||
|
Ẫ ẫ
|
||||||
|
Ậ ậ
|
||||||
|
Ắ ắ
|
||||||
|
Ằ ằ
|
||||||
|
Ẳ ẳ
|
||||||
|
Ẵ ẵ
|
||||||
|
Ặ ặ
|
||||||
|
Ẹ ẹ
|
||||||
|
Ẻ ẻ
|
||||||
|
Ẽ ẽ
|
||||||
|
Ế ế
|
||||||
|
Ề ề
|
||||||
|
Ể ể
|
||||||
|
Ễ ễ
|
||||||
|
Ệ ệ
|
||||||
|
Ỉ ỉ
|
||||||
|
Ị ị
|
||||||
|
Ọ ọ
|
||||||
|
Ỏ ỏ
|
||||||
|
Ố ố
|
||||||
|
Ồ ồ
|
||||||
|
Ổ ổ
|
||||||
|
Ỗ ỗ
|
||||||
|
Ộ ộ
|
||||||
|
Ớ ớ
|
||||||
|
Ờ ờ
|
||||||
|
Ở ở
|
||||||
|
Ỡ ỡ
|
||||||
|
Ợ ợ
|
||||||
|
Ụ ụ
|
||||||
|
Ủ ủ
|
||||||
|
Ứ ứ
|
||||||
|
Ừ ừ
|
||||||
|
Ử ử
|
||||||
|
Ữ ữ
|
||||||
|
Ự ự
|
||||||
|
Ỳ ỳ
|
||||||
|
Ỵ ỵ
|
||||||
|
Ỷ ỷ
|
||||||
|
Ỹ ỹ
|
||||||
|
Ἀ ἀ
|
||||||
|
Ἁ ἁ
|
||||||
|
Ἂ ἂ
|
||||||
|
Ἃ ἃ
|
||||||
|
Ἄ ἄ
|
||||||
|
Ἅ ἅ
|
||||||
|
Ἆ ἆ
|
||||||
|
Ἇ ἇ
|
||||||
|
Ἐ ἐ
|
||||||
|
Ἑ ἑ
|
||||||
|
Ἒ ἒ
|
||||||
|
Ἓ ἓ
|
||||||
|
Ἔ ἔ
|
||||||
|
Ἕ ἕ
|
||||||
|
Ἠ ἠ
|
||||||
|
Ἡ ἡ
|
||||||
|
Ἢ ἢ
|
||||||
|
Ἣ ἣ
|
||||||
|
Ἤ ἤ
|
||||||
|
Ἥ ἥ
|
||||||
|
Ἦ ἦ
|
||||||
|
Ἧ ἧ
|
||||||
|
Ἰ ἰ
|
||||||
|
Ἱ ἱ
|
||||||
|
Ἲ ἲ
|
||||||
|
Ἳ ἳ
|
||||||
|
Ἴ ἴ
|
||||||
|
Ἵ ἵ
|
||||||
|
Ἶ ἶ
|
||||||
|
Ἷ ἷ
|
||||||
|
Ὀ ὀ
|
||||||
|
Ὁ ὁ
|
||||||
|
Ὂ ὂ
|
||||||
|
Ὃ ὃ
|
||||||
|
Ὄ ὄ
|
||||||
|
Ὅ ὅ
|
||||||
|
ὐ ὐ
|
||||||
|
ὒ ὒ
|
||||||
|
ὔ ὔ
|
||||||
|
ὖ ὖ
|
||||||
|
Ὑ ὑ
|
||||||
|
Ὓ ὓ
|
||||||
|
Ὕ ὕ
|
||||||
|
Ὗ ὗ
|
||||||
|
Ὠ ὠ
|
||||||
|
Ὡ ὡ
|
||||||
|
Ὢ ὢ
|
||||||
|
Ὣ ὣ
|
||||||
|
Ὤ ὤ
|
||||||
|
Ὥ ὥ
|
||||||
|
Ὦ ὦ
|
||||||
|
Ὧ ὧ
|
||||||
|
ᾀ ἀι
|
||||||
|
ᾁ ἁι
|
||||||
|
ᾂ ἂι
|
||||||
|
ᾃ ἃι
|
||||||
|
ᾄ ἄι
|
||||||
|
ᾅ ἅι
|
||||||
|
ᾆ ἆι
|
||||||
|
ᾇ ἇι
|
||||||
|
ᾈ ἀι
|
||||||
|
ᾉ ἁι
|
||||||
|
ᾊ ἂι
|
||||||
|
ᾋ ἃι
|
||||||
|
ᾌ ἄι
|
||||||
|
ᾍ ἅι
|
||||||
|
ᾎ ἆι
|
||||||
|
ᾏ ἇι
|
||||||
|
ᾐ ἠι
|
||||||
|
ᾑ ἡι
|
||||||
|
ᾒ ἢι
|
||||||
|
ᾓ ἣι
|
||||||
|
ᾔ ἤι
|
||||||
|
ᾕ ἥι
|
||||||
|
ᾖ ἦι
|
||||||
|
ᾗ ἧι
|
||||||
|
ᾘ ἠι
|
||||||
|
ᾙ ἡι
|
||||||
|
ᾚ ἢι
|
||||||
|
ᾛ ἣι
|
||||||
|
ᾜ ἤι
|
||||||
|
ᾝ ἥι
|
||||||
|
ᾞ ἦι
|
||||||
|
ᾟ ἧι
|
||||||
|
ᾠ ὠι
|
||||||
|
ᾡ ὡι
|
||||||
|
ᾢ ὢι
|
||||||
|
ᾣ ὣι
|
||||||
|
ᾤ ὤι
|
||||||
|
ᾥ ὥι
|
||||||
|
ᾦ ὦι
|
||||||
|
ᾧ ὧι
|
||||||
|
ᾨ ὠι
|
||||||
|
ᾩ ὡι
|
||||||
|
ᾪ ὢι
|
||||||
|
ᾫ ὣι
|
||||||
|
ᾬ ὤι
|
||||||
|
ᾭ ὥι
|
||||||
|
ᾮ ὦι
|
||||||
|
ᾯ ὧι
|
||||||
|
ᾲ ὰι
|
||||||
|
ᾳ αι
|
||||||
|
ᾴ άι
|
||||||
|
ᾶ ᾶ
|
||||||
|
ᾷ ᾶι
|
||||||
|
Ᾰ ᾰ
|
||||||
|
Ᾱ ᾱ
|
||||||
|
Ὰ ὰ
|
||||||
|
Ά ά
|
||||||
|
ᾼ αι
|
||||||
|
ι ι
|
||||||
|
ῂ ὴι
|
||||||
|
ῃ ηι
|
||||||
|
ῄ ήι
|
||||||
|
ῆ ῆ
|
||||||
|
ῇ ῆι
|
||||||
|
Ὲ ὲ
|
||||||
|
Έ έ
|
||||||
|
Ὴ ὴ
|
||||||
|
Ή ή
|
||||||
|
ῌ ηι
|
||||||
|
ῒ ῒ
|
||||||
|
ΐ ΐ
|
||||||
|
ῖ ῖ
|
||||||
|
ῗ ῗ
|
||||||
|
Ῐ ῐ
|
||||||
|
Ῑ ῑ
|
||||||
|
Ὶ ὶ
|
||||||
|
Ί ί
|
||||||
|
ῢ ῢ
|
||||||
|
ΰ ΰ
|
||||||
|
ῤ ῤ
|
||||||
|
ῦ ῦ
|
||||||
|
ῧ ῧ
|
||||||
|
Ῠ ῠ
|
||||||
|
Ῡ ῡ
|
||||||
|
Ὺ ὺ
|
||||||
|
Ύ ύ
|
||||||
|
Ῥ ῥ
|
||||||
|
ῲ ὼι
|
||||||
|
ῳ ωι
|
||||||
|
ῴ ώι
|
||||||
|
ῶ ῶ
|
||||||
|
ῷ ῶι
|
||||||
|
Ὸ ὸ
|
||||||
|
Ό ό
|
||||||
|
Ὼ ὼ
|
||||||
|
Ώ ώ
|
||||||
|
ῼ ωι
|
||||||
|
Ω ω
|
||||||
|
K k
|
||||||
|
Å å
|
||||||
|
Ⅰ ⅰ
|
||||||
|
Ⅱ ⅱ
|
||||||
|
Ⅲ ⅲ
|
||||||
|
Ⅳ ⅳ
|
||||||
|
Ⅴ ⅴ
|
||||||
|
Ⅵ ⅵ
|
||||||
|
Ⅶ ⅶ
|
||||||
|
Ⅷ ⅷ
|
||||||
|
Ⅸ ⅸ
|
||||||
|
Ⅹ ⅹ
|
||||||
|
Ⅺ ⅺ
|
||||||
|
Ⅻ ⅻ
|
||||||
|
Ⅼ ⅼ
|
||||||
|
Ⅽ ⅽ
|
||||||
|
Ⅾ ⅾ
|
||||||
|
Ⅿ ⅿ
|
||||||
|
Ⓐ ⓐ
|
||||||
|
Ⓑ ⓑ
|
||||||
|
Ⓒ ⓒ
|
||||||
|
Ⓓ ⓓ
|
||||||
|
Ⓔ ⓔ
|
||||||
|
Ⓕ ⓕ
|
||||||
|
Ⓖ ⓖ
|
||||||
|
Ⓗ ⓗ
|
||||||
|
Ⓘ ⓘ
|
||||||
|
Ⓙ ⓙ
|
||||||
|
Ⓚ ⓚ
|
||||||
|
Ⓛ ⓛ
|
||||||
|
Ⓜ ⓜ
|
||||||
|
Ⓝ ⓝ
|
||||||
|
Ⓞ ⓞ
|
||||||
|
Ⓟ ⓟ
|
||||||
|
Ⓠ ⓠ
|
||||||
|
Ⓡ ⓡ
|
||||||
|
Ⓢ ⓢ
|
||||||
|
Ⓣ ⓣ
|
||||||
|
Ⓤ ⓤ
|
||||||
|
Ⓥ ⓥ
|
||||||
|
Ⓦ ⓦ
|
||||||
|
Ⓧ ⓧ
|
||||||
|
Ⓨ ⓨ
|
||||||
|
Ⓩ ⓩ
|
||||||
|
ff ff
|
||||||
|
fi fi
|
||||||
|
fl fl
|
||||||
|
ffi ffi
|
||||||
|
ffl ffl
|
||||||
|
ſt st
|
||||||
|
st st
|
||||||
|
ﬓ մն
|
||||||
|
ﬔ մե
|
||||||
|
ﬕ մի
|
||||||
|
ﬖ վն
|
||||||
|
ﬗ մխ
|
||||||
|
A a
|
||||||
|
B b
|
||||||
|
C c
|
||||||
|
D d
|
||||||
|
E e
|
||||||
|
F f
|
||||||
|
G g
|
||||||
|
H h
|
||||||
|
I i
|
||||||
|
J j
|
||||||
|
K k
|
||||||
|
L l
|
||||||
|
M m
|
||||||
|
N n
|
||||||
|
O o
|
||||||
|
P p
|
||||||
|
Q q
|
||||||
|
R r
|
||||||
|
S s
|
||||||
|
T t
|
||||||
|
U u
|
||||||
|
V v
|
||||||
|
W w
|
||||||
|
X x
|
||||||
|
Y y
|
||||||
|
Z z
|
1543
tests/casemap.txt
Normal file
1543
tests/casemap.txt
Normal file
File diff suppressed because it is too large
Load Diff
82
tests/gen-casefold-txt.pl
Executable file
82
tests/gen-casefold-txt.pl
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 1998, 1999 Tom Tromey
|
||||||
|
# Copyright (C) 2001 Red Hat Software
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
# 02111-1307, USA.
|
||||||
|
|
||||||
|
# gen-casefold-test.pl - Generate test cases for casefolding from Unicode data.
|
||||||
|
# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
|
||||||
|
# Usage:
|
||||||
|
# I consider the output of this program to be unrestricted. Use it as
|
||||||
|
# you will.
|
||||||
|
|
||||||
|
# Names of fields in the CaseFolding table
|
||||||
|
$FOLDING_CODE = 0;
|
||||||
|
$FOLDING_STATUS = 1;
|
||||||
|
$FOLDING_MAPPING = 2;
|
||||||
|
|
||||||
|
my $casefoldlen = 0;
|
||||||
|
my @casefold;
|
||||||
|
|
||||||
|
if (@ARGV != 2) {
|
||||||
|
$0 =~ s@.*/@@;
|
||||||
|
die "Usage: $0 UNICODE-VERSION CaseFolding.txt\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print <<EOT;
|
||||||
|
# Test cases generated from Unicode $ARGV[0] data
|
||||||
|
# by gen-casefold-test.pl. Do not edit.
|
||||||
|
#
|
||||||
|
# Some special hand crafted tests
|
||||||
|
#
|
||||||
|
AaBbCc@@\taabbcc@@
|
||||||
|
#
|
||||||
|
# Now the automatic tests
|
||||||
|
#
|
||||||
|
EOT
|
||||||
|
|
||||||
|
open (INPUT, "< $ARGV[1]") || exit 1;
|
||||||
|
|
||||||
|
while (<INPUT>)
|
||||||
|
{
|
||||||
|
chop;
|
||||||
|
|
||||||
|
next if /^#/;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
|
my @fields = split ('\s*;\s*', $_, 30);
|
||||||
|
|
||||||
|
my $raw_code = $fields[$FOLDING_CODE];
|
||||||
|
my $code = hex ($raw_code);
|
||||||
|
|
||||||
|
next if $code > 0xffff; # FIXME!
|
||||||
|
|
||||||
|
if ($#fields != 3)
|
||||||
|
{
|
||||||
|
printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
next if ($fields[$FOLDING_STATUS] eq 'S');
|
||||||
|
|
||||||
|
@values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING];
|
||||||
|
printf ("%s\t%s\n", pack ("U", $code), pack ("U*", @values));
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
232
tests/gen-casemap-txt.pl
Executable file
232
tests/gen-casemap-txt.pl
Executable file
@@ -0,0 +1,232 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 1998, 1999 Tom Tromey
|
||||||
|
# Copyright (C) 2001 Red Hat Software
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
# 02111-1307, USA.
|
||||||
|
|
||||||
|
# gen-casemap-test.pl - Generate test cases for case mapping from Unicode data.
|
||||||
|
# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
|
||||||
|
# I consider the output of this program to be unrestricted. Use it as
|
||||||
|
# you will.
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
if (@ARGV != 3) {
|
||||||
|
$0 =~ s@.*/@@;
|
||||||
|
die "Usage: $0 UNICODE-VERSION UnicodeData.txt SpecialCasing.txt\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION);
|
||||||
|
|
||||||
|
# Names of fields in Unicode data table.
|
||||||
|
$CODE = 0;
|
||||||
|
$NAME = 1;
|
||||||
|
$CATEGORY = 2;
|
||||||
|
$COMBINING_CLASSES = 3;
|
||||||
|
$BIDI_CATEGORY = 4;
|
||||||
|
$DECOMPOSITION = 5;
|
||||||
|
$DECIMAL_VALUE = 6;
|
||||||
|
$DIGIT_VALUE = 7;
|
||||||
|
$NUMERIC_VALUE = 8;
|
||||||
|
$MIRRORED = 9;
|
||||||
|
$OLD_NAME = 10;
|
||||||
|
$COMMENT = 11;
|
||||||
|
$UPPER = 12;
|
||||||
|
$LOWER = 13;
|
||||||
|
$TITLE = 14;
|
||||||
|
|
||||||
|
# Names of fields in the SpecialCasing table
|
||||||
|
$CASE_CODE = 0;
|
||||||
|
$CASE_LOWER = 1;
|
||||||
|
$CASE_TITLE = 2;
|
||||||
|
$CASE_UPPER = 3;
|
||||||
|
$CASE_CONDITION = 4;
|
||||||
|
|
||||||
|
my @upper;
|
||||||
|
my @title;
|
||||||
|
my @lower;
|
||||||
|
|
||||||
|
open (INPUT, "< $ARGV[1]") || exit 1;
|
||||||
|
|
||||||
|
$last_code = -1;
|
||||||
|
while (<INPUT>)
|
||||||
|
{
|
||||||
|
chop;
|
||||||
|
@fields = split (';', $_, 30);
|
||||||
|
if ($#fields != 14)
|
||||||
|
{
|
||||||
|
printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
$code = hex ($fields[$CODE]);
|
||||||
|
|
||||||
|
last if ($code > 0xFFFF); # ignore characters out of the basic plane
|
||||||
|
|
||||||
|
if ($code > $last_code + 1)
|
||||||
|
{
|
||||||
|
# Found a gap.
|
||||||
|
if ($fields[$NAME] =~ /Last>/)
|
||||||
|
{
|
||||||
|
# Fill the gap with the last character read,
|
||||||
|
# since this was a range specified in the char database
|
||||||
|
@gfields = @fields;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# The gap represents undefined characters. Only the type
|
||||||
|
# matters.
|
||||||
|
@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
|
||||||
|
'', '', '', '');
|
||||||
|
}
|
||||||
|
for (++$last_code; $last_code < $code; ++$last_code)
|
||||||
|
{
|
||||||
|
$gfields{$CODE} = sprintf ("%04x", $last_code);
|
||||||
|
&process_one ($last_code, @gfields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&process_one ($code, @fields);
|
||||||
|
$last_code = $code;
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
|
open (INPUT, "< $ARGV[2]") || exit 1;
|
||||||
|
|
||||||
|
while (<INPUT>)
|
||||||
|
{
|
||||||
|
my $code;
|
||||||
|
|
||||||
|
chop;
|
||||||
|
|
||||||
|
next if /^#/;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
s/\s*#.*//;
|
||||||
|
|
||||||
|
@fields = split ('\s*;\s*', $_, 30);
|
||||||
|
|
||||||
|
$raw_code = $fields[$CASE_CODE];
|
||||||
|
$code = hex ($raw_code);
|
||||||
|
|
||||||
|
if ($#fields != 4 && $#fields != 5)
|
||||||
|
{
|
||||||
|
printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $fields[5]) {
|
||||||
|
# Ignore conditional special cases - we'll handle them manually
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$upper[$code] = &make_hex ($fields[$CASE_UPPER]);
|
||||||
|
$lower[$code] = &make_hex ($fields[$CASE_LOWER]);
|
||||||
|
$title[$code] = &make_hex ($fields[$CASE_TITLE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
close INPUT;
|
||||||
|
|
||||||
|
print <<EOT;
|
||||||
|
# Test cases generated from Unicode $ARGV[0] data
|
||||||
|
# by gen-case-tests.pl. Do not edit.
|
||||||
|
#
|
||||||
|
# Some special hand crafted tests
|
||||||
|
#
|
||||||
|
tr_TR\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE
|
||||||
|
tr_TR\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I
|
||||||
|
# Test reordering of YPOGEGRAMMENI across other accents
|
||||||
|
\t\x{03b1}\x{0345}\x{0314}\t\x{03b1}\x{0345}\x{314}\t\x{0391}\x{0345}\x{0314}\t\x{0391}\x{0314}\x{0399}\t
|
||||||
|
\t\x{03b1}\x{0314}\x{0345}\t\x{03b1}\x{314}\x{0345}\t\x{0391}\x{0314}\x{0345}\t\x{0391}\x{0314}\x{0399}\t
|
||||||
|
# Handling of final and nonfinal sigma
|
||||||
|
ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
|
||||||
|
ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ
|
||||||
|
ΣΙΓΜΑ σιγμα Σιγμα ΣΙΓΜΑ
|
||||||
|
# Lithuanian rule of i followed by letter with dot. Not at all sure
|
||||||
|
# about the titlecase part here
|
||||||
|
lt_LT\ti\x{117}\ti\x{117}\tIe\tIE\t
|
||||||
|
lt_LT\tie\x{307}\tie\x{307}\tIe\tIE\t
|
||||||
|
#
|
||||||
|
# Now the automatic tests
|
||||||
|
#
|
||||||
|
EOT
|
||||||
|
&print_tests;
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
# Process a single character.
|
||||||
|
sub process_one
|
||||||
|
{
|
||||||
|
my ($code, @fields) = @_;
|
||||||
|
|
||||||
|
my $type = $fields[$CATEGORY];
|
||||||
|
if ($type eq 'Ll')
|
||||||
|
{
|
||||||
|
$upper[$code] = make_hex ($fields[$UPPER]);
|
||||||
|
$lower[$code] = pack ("U", $code);
|
||||||
|
$title[$code] = make_hex ($fields[$TITLE]);
|
||||||
|
}
|
||||||
|
elsif ($type eq 'Lu')
|
||||||
|
{
|
||||||
|
$lower[$code] = make_hex ($fields[$LOWER]);
|
||||||
|
$upper[$code] = pack ("U", $code);
|
||||||
|
$title[$code] = make_hex ($fields[$TITLE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type eq 'Lt')
|
||||||
|
{
|
||||||
|
$upper[$code] = make_hex ($fields[$UPPER]);
|
||||||
|
$lower[$code] = pack ("U", hex ($fields[$LOWER]));
|
||||||
|
$title[$code] = make_hex ($fields[$LOWER]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_tests
|
||||||
|
{
|
||||||
|
for ($i = 0; $i < 0xffff; $i++) {
|
||||||
|
if ($i == 0x3A3) {
|
||||||
|
# Greek sigma needs special tests
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $lower = $lower[$i];
|
||||||
|
my $title = $title[$i];
|
||||||
|
my $upper = $upper[$i];
|
||||||
|
|
||||||
|
if (defined $upper || defined $lower || defined $title) {
|
||||||
|
printf "\t%s\t%s\t%s\t%s\t# %4X\n",
|
||||||
|
pack ("U", $i),
|
||||||
|
(defined $lower ? $lower : ""),
|
||||||
|
(defined $title ? $title : ""),
|
||||||
|
(defined $upper ? $upper : ""),
|
||||||
|
$i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub make_hex
|
||||||
|
{
|
||||||
|
my $codes = shift;
|
||||||
|
|
||||||
|
$codes =~ s/^\s+//;
|
||||||
|
$codes =~ s/\s+$//;
|
||||||
|
|
||||||
|
if ($codes eq "0" || $codes eq "") {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return pack ("U*", map { hex ($_) } split /\s+/, $codes);
|
||||||
|
}
|
||||||
|
}
|
116
tests/unicode-caseconv.c
Normal file
116
tests/unicode-caseconv.c
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#include <locale.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *infile;
|
||||||
|
char buffer[1024];
|
||||||
|
char **strings;
|
||||||
|
char *srcdir = getenv ("srcdir");
|
||||||
|
char *filename;
|
||||||
|
const char *locale;
|
||||||
|
const char *test;
|
||||||
|
char *convert;
|
||||||
|
char *current_locale = setlocale (LC_CTYPE, NULL);
|
||||||
|
gint result = 0;
|
||||||
|
|
||||||
|
if (!srcdir)
|
||||||
|
srcdir = ".";
|
||||||
|
filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casemap.txt", NULL);
|
||||||
|
|
||||||
|
infile = fopen (filename, "r");
|
||||||
|
if (!infile)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failed to open %s\n", filename );
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fgets (buffer, sizeof(buffer), infile))
|
||||||
|
{
|
||||||
|
if (buffer[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
strings = g_strsplit (buffer, "\t", -1);
|
||||||
|
|
||||||
|
locale = strings[0];
|
||||||
|
|
||||||
|
if (!locale[0])
|
||||||
|
locale = "C";
|
||||||
|
|
||||||
|
if (strcmp (locale, current_locale) != 0)
|
||||||
|
{
|
||||||
|
setlocale (LC_CTYPE, locale);
|
||||||
|
current_locale = setlocale (LC_CTYPE, NULL);
|
||||||
|
|
||||||
|
if (strncmp (current_locale, locale, 2) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Cannot set locale to %s, skipping\n", locale);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test = strings[1];
|
||||||
|
|
||||||
|
convert = g_utf8_strup (test);
|
||||||
|
if (strcmp (convert, strings[4]) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failure: toupper(%s) == %s, should have been %s\n",
|
||||||
|
test, convert, strings[4]);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
g_free (convert);
|
||||||
|
|
||||||
|
convert = g_utf8_strdown (test);
|
||||||
|
if (strcmp (convert, strings[2]) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failure: tolower(%s) == %s, should have been %s\n",
|
||||||
|
test, convert, strings[2]);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
g_free (convert);
|
||||||
|
|
||||||
|
next:
|
||||||
|
g_strfreev (strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (infile);
|
||||||
|
|
||||||
|
g_free (filename);
|
||||||
|
filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casefold.txt", NULL);
|
||||||
|
|
||||||
|
infile = fopen (filename, "r");
|
||||||
|
if (!infile)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failed to open %s\n", filename );
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fgets (buffer, sizeof(buffer), infile))
|
||||||
|
{
|
||||||
|
if (buffer[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
buffer[strlen(buffer) - 1] = '\0';
|
||||||
|
strings = g_strsplit (buffer, "\t", -1);
|
||||||
|
|
||||||
|
test = strings[0];
|
||||||
|
|
||||||
|
convert = g_utf8_casefold (test);
|
||||||
|
if (strcmp (convert, strings[1]) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failure: casefold(%s) == '%s', should have been '%s'\n",
|
||||||
|
test, convert, strings[1]);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
g_free (convert);
|
||||||
|
|
||||||
|
g_strfreev (strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (infile);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
94
tests/unicode-collate.c
Normal file
94
tests/unicode-collate.c
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#include <glib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *key;
|
||||||
|
const char *str;
|
||||||
|
} Line;
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
compare_collate (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const Line *line_a = a;
|
||||||
|
const Line *line_b = b;
|
||||||
|
|
||||||
|
return g_utf8_collate (line_a->str, line_b->str);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
compare_key (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const Line *line_a = a;
|
||||||
|
const Line *line_b = b;
|
||||||
|
|
||||||
|
return strcmp (line_a->key, line_b->key);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
GIOChannel *in;
|
||||||
|
GError *error = NULL;
|
||||||
|
GArray *line_array = g_array_new (FALSE, FALSE, sizeof(Line));
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (argc != 1 && argc != 2)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Usage: unicode-collate [FILE]\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
in = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &error);
|
||||||
|
if (!in)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
in = g_io_channel_unix_new (fileno (stdin));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
gsize term_pos;
|
||||||
|
gchar *str;
|
||||||
|
Line line;
|
||||||
|
|
||||||
|
if (g_io_channel_read_line (in, &str, NULL, &term_pos, &error) != G_IO_STATUS_NORMAL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
str[term_pos] = '\0';
|
||||||
|
|
||||||
|
line.key = g_utf8_collate_key (str);
|
||||||
|
line.str = str;
|
||||||
|
|
||||||
|
g_array_append_val (line_array, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Error reading test file, %s\n", error->message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("== g_utf8_collate ==\n");
|
||||||
|
|
||||||
|
qsort (line_array->data, line_array->len, sizeof (Line), compare_collate);
|
||||||
|
for (i = 0; i < line_array->len; i++)
|
||||||
|
printf ("%s\n", g_array_index (line_array, Line, i).str);
|
||||||
|
|
||||||
|
printf ("== g_utf8_collate_key ==\n");
|
||||||
|
|
||||||
|
qsort (line_array->data, line_array->len, sizeof (Line), compare_key);
|
||||||
|
for (i = 0; i < line_array->len; i++)
|
||||||
|
printf ("%s\n", g_array_index (line_array, Line, i).str);
|
||||||
|
|
||||||
|
g_io_channel_close (in);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
194
tests/unicode-normalize.c
Normal file
194
tests/unicode-normalize.c
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
#include <glib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
gboolean success = TRUE;
|
||||||
|
|
||||||
|
static char *
|
||||||
|
decode (const gchar *input)
|
||||||
|
{
|
||||||
|
unsigned ch;
|
||||||
|
int offset = 0;
|
||||||
|
GString *result = g_string_new (NULL);
|
||||||
|
int len;
|
||||||
|
char buf[6];
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (sscanf (input + offset, "%x", &ch) != 1)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Error parsing character string %s\n", input);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: We don't handle the > BMP or Hangul syllables */
|
||||||
|
if (ch > 0xffff || /* > BMP */
|
||||||
|
(ch >= 0xac00 && ch <= 0xd7ff)) /* Hangul syllables */
|
||||||
|
{
|
||||||
|
g_string_free (result, TRUE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = g_unichar_to_utf8 (ch, buf);
|
||||||
|
g_string_append_len (result, buf, len);
|
||||||
|
|
||||||
|
while (input[offset] && input[offset] != ' ')
|
||||||
|
offset++;
|
||||||
|
while (input[offset] && input[offset] == ' ')
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
while (input[offset]);
|
||||||
|
|
||||||
|
return g_string_free (result, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *names[4] = {
|
||||||
|
"NFD",
|
||||||
|
"NFC",
|
||||||
|
"NFKD",
|
||||||
|
"NFKC"
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_form (int line,
|
||||||
|
GNormalizeMode mode,
|
||||||
|
gboolean do_compat,
|
||||||
|
int expected,
|
||||||
|
char **c,
|
||||||
|
char **raw)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
gboolean mode_is_compat = (mode == G_NORMALIZE_NFKC ||
|
||||||
|
mode == G_NORMALIZE_NFKD);
|
||||||
|
|
||||||
|
if (mode_is_compat || !do_compat)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
char *result = g_utf8_normalize (c[i], mode);
|
||||||
|
if (strcmp (result, c[expected]) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i + 1, raw[5]);
|
||||||
|
fprintf (stderr, " g_utf8_normalize (%s, %s) != %s\n",
|
||||||
|
raw[i], names[mode], raw[expected]);
|
||||||
|
success = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mode_is_compat || do_compat)
|
||||||
|
{
|
||||||
|
for (i = 3; i < 5; i++)
|
||||||
|
{
|
||||||
|
char *result = g_utf8_normalize (c[i], mode);
|
||||||
|
if (strcmp (result, c[expected]) != 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i, raw[5]);
|
||||||
|
fprintf (stderr, " g_utf8_normalize (%s, %s) != %s\n",
|
||||||
|
raw[i], names[mode], raw[expected]);
|
||||||
|
success = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
process_one (int line, gchar **columns)
|
||||||
|
{
|
||||||
|
char *c[5];
|
||||||
|
int i;
|
||||||
|
gboolean skip = FALSE;
|
||||||
|
|
||||||
|
for (i=0; i < 5; i++)
|
||||||
|
{
|
||||||
|
c[i] = decode(columns[i]);
|
||||||
|
if (!c[i])
|
||||||
|
skip = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!skip)
|
||||||
|
{
|
||||||
|
test_form (line, G_NORMALIZE_NFD, FALSE, 2, c, columns);
|
||||||
|
test_form (line, G_NORMALIZE_NFD, TRUE, 4, c, columns);
|
||||||
|
test_form (line, G_NORMALIZE_NFC, FALSE, 1, c, columns);
|
||||||
|
test_form (line, G_NORMALIZE_NFC, TRUE, 3, c, columns);
|
||||||
|
test_form (line, G_NORMALIZE_NFKD, TRUE, 4, c, columns);
|
||||||
|
test_form (line, G_NORMALIZE_NFKC, TRUE, 3, c, columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i < 5; i++)
|
||||||
|
g_free (c[i]);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
GIOChannel *in;
|
||||||
|
GError *error = NULL;
|
||||||
|
GString *buffer = g_string_new (NULL);
|
||||||
|
int line_to_do = 0;
|
||||||
|
int line = 1;
|
||||||
|
|
||||||
|
if (argc != 2 && argc != 3)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Usage: unicode-normalize NormalizationTest.txt LINE\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc == 3)
|
||||||
|
line_to_do = atoi(argv[2]);
|
||||||
|
|
||||||
|
in = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &error);
|
||||||
|
if (!in)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
gsize term_pos;
|
||||||
|
gchar **columns;
|
||||||
|
|
||||||
|
if (g_io_channel_read_line_string (in, buffer, &term_pos, &error) != G_IO_STATUS_NORMAL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (line_to_do && line != line_to_do)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
buffer->str[term_pos] = '\0';
|
||||||
|
|
||||||
|
if (buffer->str[0] == '#') /* Comment */
|
||||||
|
goto next;
|
||||||
|
if (buffer->str[0] == '@') /* Part */
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\nProcessing %s\n", buffer->str + 1);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
columns = g_strsplit (buffer->str, ";", -1);
|
||||||
|
if (!process_one (line, columns))
|
||||||
|
return 1;
|
||||||
|
g_strfreev (columns);
|
||||||
|
|
||||||
|
next:
|
||||||
|
g_string_truncate (buffer, 0);
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Error reading test file, %s\n", error->message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_io_channel_close (in);
|
||||||
|
g_string_free (buffer, TRUE);
|
||||||
|
|
||||||
|
return !success;
|
||||||
|
}
|
Reference in New Issue
Block a user