From 2fd6b001fb431c274ad6808912ec5fbe831afbef Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Tue, 26 Jun 2001 16:01:21 +0000 Subject: [PATCH] Move glib library into a subdirectory, make all GLib include files include Tue Jun 26 11:43:46 2001 Owen Taylor * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: Move glib library into a subdirectory, make all GLib include files include as * tests/testglib.c tests/testgdate.c tests/testgdateparser.c tests/timeloop.c tests/timeloop-basic.c: Move all tests into the tests/ subdirectory. --- .cvsignore | 13 - ChangeLog | 10 + ChangeLog.pre-2-0 | 10 + ChangeLog.pre-2-10 | 10 + ChangeLog.pre-2-12 | 10 + ChangeLog.pre-2-2 | 10 + ChangeLog.pre-2-4 | 10 + ChangeLog.pre-2-6 | 10 + ChangeLog.pre-2-8 | 10 + Makefile.am | 133 +- autogen.sh | 2 +- configure.in | 5 +- docs/reference/glib/.cvsignore | 1 + docs/reference/glib/Makefile.am | 6 +- docs/reference/gobject/.cvsignore | 1 + galloca.h | 60 - garray.c | 670 --- garray.h | 156 - gasyncqueue.c | 443 -- gasyncqueue.h | 95 - gbacktrace.c | 300 -- gbacktrace.h | 61 - gcache.c | 230 - gcache.h | 66 - gcompletion.c | 296 -- gcompletion.h | 71 - gconvert.c | 916 ---- gconvert.h | 106 - gdataset.c | 631 --- gdataset.h | 106 - gdate.c | 1353 ------ gdate.h | 252 - gen-unicode-tables.pl | 609 --- gerror.c | 254 - gerror.h | 74 - gfileutils.c | 698 --- gfileutils.h | 95 - ghash.c | 695 --- ghash.h | 108 - ghook.c | 640 --- ghook.h | 177 - giochannel.c | 148 - giochannel.h | 197 - giounix.c | 312 -- giowin32.c | 1179 ----- glib-object.h | 38 - glib.h | 75 - glib/.cvsignore | 10 + glib/Makefile.am | 125 +- glib/galloca.h | 2 +- glib/garray.h | 2 +- glib/gasyncqueue.h | 2 +- glib/gbacktrace.h | 2 +- glib/gcache.h | 2 +- glib/gcompletion.h | 2 +- glib/gconvert.h | 2 +- glib/gdataset.h | 2 +- glib/gdate.h | 2 +- glib/gerror.h | 2 +- glib/gfileutils.h | 2 +- glib/ghash.h | 2 +- glib/ghook.h | 2 +- glib/giochannel.h | 4 +- glib/glib.h | 84 +- glib/glist.h | 2 +- glib/gmain.h | 4 +- glib/gmarkup.h | 2 +- glib/gmem.h | 2 +- glib/gmessages.h | 2 +- glib/gnode.h | 2 +- glib/gpattern.h | 2 +- glib/gprimes.h | 2 +- glib/gqsort.h | 2 +- glib/gquark.h | 2 +- glib/gqueue.h | 2 +- glib/grand.h | 2 +- glib/grel.h | 2 +- glib/gscanner.h | 2 +- glib/gshell.h | 2 +- glib/gslist.h | 2 +- glib/gspawn.h | 2 +- glib/gstrfuncs.h | 2 +- glib/gstring.h | 2 +- glib/gthread.h | 4 +- glib/gthreadpool.h | 2 +- glib/gtimer.h | 2 +- glib/gtree.h | 2 +- glib/gunicode.h | 4 +- glib/gutils.h | 2 +- glib/gwin32.h | 2 +- glibintl.h | 28 - glist.c | 826 ---- glist.h | 105 - gmacros.h | 193 - gmain.c | 2937 ------------ gmain.h | 291 -- gmarkup.c | 1735 ------- gmarkup.h | 123 - gmem.c | 1263 ----- gmem.h | 174 - gmessages.c | 1256 ----- gmessages.h | 341 -- gmodule/Makefile.am | 4 +- gnode.c | 1064 ----- gnode.h | 163 - gobject/Makefile.am | 3 +- gpattern.c | 300 -- gpattern.h | 58 - gprimes.c | 83 - gprimes.h | 47 - gqsort.c | 282 -- gqsort.h | 44 - gquark.h | 46 - gqueue.c | 263 -- gqueue.h | 65 - grand.c | 403 -- grand.h | 82 - grel.c | 459 -- grel.h | 94 - gscanner.c | 1728 ------- gscanner.h | 271 -- gshell.c | 651 --- gshell.h | 53 - gslist.c | 728 --- gslist.h | 102 - gspawn-win32-helper.c | 218 - gspawn-win32.c | 987 ---- gspawn.c | 1404 ------ gspawn.h | 128 - gstrfuncs.c | 1660 ------- gstrfuncs.h | 136 - gstring.c | 616 --- gstring.h | 110 - gthread.c | 823 ---- gthread.h | 334 -- gthread/Makefile.am | 4 +- gthreadpool.c | 678 --- gthreadpool.h | 102 - gtimer.c | 276 -- gtimer.h | 57 - gtree.c | 1117 ----- gtree.h | 84 - gtypes.h | 350 -- gunibreak.c | 55 - gunibreak.h | 7254 ----------------------------- gunichartables.h | 5957 ----------------------- gunicode.h | 252 - gunidecomp.c | 133 - gunidecomp.h | 1857 -------- guniprop.c | 471 -- gutf8.c | 1482 ------ gutils.c | 1107 ----- gutils.h | 332 -- gwin32.c | 1032 ---- gwin32.h | 130 - testgdate.c | 489 -- testgdateparser.c | 112 - testglib.c | 1252 ----- tests/.cvsignore | 5 + tests/Makefile.am | 15 +- timeloop-basic.c | 232 - timeloop.c | 213 - 162 files changed, 221 insertions(+), 59167 deletions(-) delete mode 100644 galloca.h delete mode 100644 garray.c delete mode 100644 garray.h delete mode 100644 gasyncqueue.c delete mode 100644 gasyncqueue.h delete mode 100644 gbacktrace.c delete mode 100644 gbacktrace.h delete mode 100644 gcache.c delete mode 100644 gcache.h delete mode 100644 gcompletion.c delete mode 100644 gcompletion.h delete mode 100644 gconvert.c delete mode 100644 gconvert.h delete mode 100644 gdataset.c delete mode 100644 gdataset.h delete mode 100644 gdate.c delete mode 100644 gdate.h delete mode 100755 gen-unicode-tables.pl delete mode 100644 gerror.c delete mode 100644 gerror.h delete mode 100644 gfileutils.c delete mode 100644 gfileutils.h delete mode 100644 ghash.c delete mode 100644 ghash.h delete mode 100644 ghook.c delete mode 100644 ghook.h delete mode 100644 giochannel.c delete mode 100644 giochannel.h delete mode 100644 giounix.c delete mode 100644 giowin32.c delete mode 100644 glib-object.h delete mode 100644 glib.h create mode 100644 glib/.cvsignore delete mode 100644 glibintl.h delete mode 100644 glist.c delete mode 100644 glist.h delete mode 100644 gmacros.h delete mode 100644 gmain.c delete mode 100644 gmain.h delete mode 100644 gmarkup.c delete mode 100644 gmarkup.h delete mode 100644 gmem.c delete mode 100644 gmem.h delete mode 100644 gmessages.c delete mode 100644 gmessages.h delete mode 100644 gnode.c delete mode 100644 gnode.h delete mode 100644 gpattern.c delete mode 100644 gpattern.h delete mode 100644 gprimes.c delete mode 100644 gprimes.h delete mode 100644 gqsort.c delete mode 100644 gqsort.h delete mode 100644 gquark.h delete mode 100644 gqueue.c delete mode 100644 gqueue.h delete mode 100644 grand.c delete mode 100644 grand.h delete mode 100644 grel.c delete mode 100644 grel.h delete mode 100644 gscanner.c delete mode 100644 gscanner.h delete mode 100644 gshell.c delete mode 100644 gshell.h delete mode 100644 gslist.c delete mode 100644 gslist.h delete mode 100644 gspawn-win32-helper.c delete mode 100644 gspawn-win32.c delete mode 100644 gspawn.c delete mode 100644 gspawn.h delete mode 100644 gstrfuncs.c delete mode 100644 gstrfuncs.h delete mode 100644 gstring.c delete mode 100644 gstring.h delete mode 100644 gthread.c delete mode 100644 gthread.h delete mode 100644 gthreadpool.c delete mode 100644 gthreadpool.h delete mode 100644 gtimer.c delete mode 100644 gtimer.h delete mode 100644 gtree.c delete mode 100644 gtree.h delete mode 100644 gtypes.h delete mode 100644 gunibreak.c delete mode 100644 gunibreak.h delete mode 100644 gunichartables.h delete mode 100644 gunicode.h delete mode 100644 gunidecomp.c delete mode 100644 gunidecomp.h delete mode 100644 guniprop.c delete mode 100644 gutf8.c delete mode 100644 gutils.c delete mode 100644 gutils.h delete mode 100644 gwin32.c delete mode 100644 gwin32.h delete mode 100644 testgdate.c delete mode 100644 testgdateparser.c delete mode 100644 testglib.c delete mode 100644 timeloop-basic.c delete mode 100644 timeloop.c diff --git a/.cvsignore b/.cvsignore index d8cb34b3..fd945085 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,10 +1,3 @@ -*.lo -*.obj -*.lib -*.dll -*.exe -.deps -.libs Makefile Makefile.in _libs @@ -20,7 +13,6 @@ glib.spec glibconfig-sysdefs.h glibconfig.h glibconfig.h.win32 -libglib-1.3.la libtool makefile.cygwin makefile.mingw @@ -29,11 +21,6 @@ so_locations stamp-gc-h stamp-h stamp-h.in -testgdate -testgdateparser -testglib -timeloop -timeloop-basic annotations logs glib.rc diff --git a/ChangeLog b/ChangeLog index 5ca24a1c..f243e770 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5ca24a1c..f243e770 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + Sat Jun 23 17:34:38 2001 Tim Janik * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). diff --git a/Makefile.am b/Makefile.am index 11b4e82d..932b479d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ AUTOMAKE_OPTIONS = 1.4 -SUBDIRS = . m4macros gobject gmodule gthread docs tests build +SUBDIRS = . m4macros glib gobject gmodule gthread docs tests build INCLUDES = -DG_LOG_DOMAIN=g_log_domain_glib @GLIB_DEBUG_FLAGS@ \ -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION @@ -41,107 +41,6 @@ BUILT_EXTRA_DIST = \ glib.rc \ glib.spec -lib_LTLIBRARIES = libglib-1.3.la - -libglib_1_3_la_SOURCES = \ - garray.c \ - gasyncqueue.c \ - gbacktrace.c \ - gcache.c \ - gcompletion.c \ - gconvert.c \ - gdataset.c \ - gdate.c \ - gerror.c \ - gfileutils.c \ - ghash.c \ - ghook.c \ - giochannel.c \ - glibintl.h \ - glist.c \ - gmain.c \ - gmarkup.c \ - gmem.c \ - gmessages.c \ - gnode.c \ - gpattern.c \ - gprimes.c \ - gqsort.c \ - gqueue.c \ - grel.c \ - grand.c \ - gscanner.c \ - gshell.c \ - gslist.c \ - gstrfuncs.c \ - gstring.c \ - gthread.c \ - gthreadpool.c \ - gtimer.c \ - gtree.c \ - guniprop.c \ - gutf8.c \ - gunibreak.h \ - gunibreak.c \ - gunichartables.h \ - gunidecomp.h \ - gunidecomp.c \ - gutils.c - -EXTRA_libglib_1_3_la_SOURCES = \ - giounix.c \ - giowin32.c \ - gspawn.c \ - gspawn-win32.c \ - gwin32.c - -glibincludedir=$(includedir)/glib-2.0 -glibinclude_HEADERS = \ - galloca.h \ - garray.h \ - gasyncqueue.h \ - gbacktrace.h \ - gcache.h \ - gcompletion.h \ - gconvert.h \ - gdataset.h \ - gdate.h \ - gerror.h \ - gfileutils.h \ - ghash.h \ - ghook.h \ - giochannel.h \ - glib.h \ - glib-object.h \ - glist.h \ - gmacros.h \ - gmain.h \ - gmarkup.h \ - gmem.h \ - gmessages.h \ - gnode.h \ - gpattern.h \ - gprimes.h \ - gqsort.h \ - gquark.h \ - gqueue.h \ - grand.h \ - grel.h \ - gscanner.h \ - gshell.h \ - gslist.h \ - gspawn.h \ - gstrfuncs.h \ - gstring.h \ - gthread.h \ - gthreadpool.h \ - gtimer.h \ - gtree.h \ - gtypes.h \ - gunicode.h \ - gutils.h \ - gwin32.h - configexecincludedir = $(libdir)/glib-2.0/include #configexecinclude_DATA = glibconfig.h @@ -161,36 +60,6 @@ stamp-gc-h: config.status CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status echo timestamp > stamp-gc-h -libglib_1_3_la_LIBADD = @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ -libglib_1_3_la_DEPENDENCIES = @GIO@ @GSPAWN@ @PLATFORMDEP@ - - -if PLATFORM_WIN32 -no_undefined = -no-undefined -endif -if OS_WIN32 -# This requires a very new libtool -export_symbols = -export-symbols glib.def -endif - -libglib_1_3_la_LDFLAGS = \ - -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ - -export-dynamic $(no_undefined) $(export_symbols) - -if OS_WIN32 -bin_PROGRAMS = gspawn-win32-helper -gspawn_win32_helper_LDADD = libglib-1.3.la -endif -if ENABLE_TIMELOOP -timeloop = timeloop -endif -noinst_PROGRAMS = testglib testgdate testgdateparser $(timeloop) -testglib_LDADD = libglib-1.3.la -testgdate_LDADD = libglib-1.3.la -testgdateparser_LDADD = libglib-1.3.la -if ENABLE_TIMELOOP -timeloop_LDADD = libglib-1.3.la -endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = glib-2.0.pc gobject-2.0.pc gmodule-2.0.pc gthread-2.0.pc diff --git a/autogen.sh b/autogen.sh index cfa06d97..24012686 100755 --- a/autogen.sh +++ b/autogen.sh @@ -8,7 +8,7 @@ ORIGDIR=`pwd` cd $srcdir PROJECT=GLib TEST_TYPE=-f -FILE=glib.h +FILE=glib/glib.h DIE=0 diff --git a/configure.in b/configure.in index 6e39dbbd..fc315711 100644 --- a/configure.in +++ b/configure.in @@ -7,7 +7,7 @@ builtin(include, acglib.m4)dnl AC_PREREQ(2.13) # Process this file with autoconf to produce a configure script. -AC_INIT(glist.c) +AC_INIT(glib/glib.h) # Save this value here, since automake will set cflags later cflags_set=${CFLAGS+set} @@ -1535,7 +1535,7 @@ case "$CONFIG_OTHER" in #ifndef __G_LIBCONFIG_H__ #define __G_LIBCONFIG_H__ -#include +#include _______EOF @@ -2039,6 +2039,7 @@ glib.spec Makefile build/Makefile build/win32/Makefile +glib/Makefile gmodule/gmoduleconf.h gmodule/Makefile gobject/Makefile diff --git a/docs/reference/glib/.cvsignore b/docs/reference/glib/.cvsignore index 41882db1..cf19db77 100644 --- a/docs/reference/glib/.cvsignore +++ b/docs/reference/glib/.cvsignore @@ -3,6 +3,7 @@ Makefile.in glib-decl-list.txt glib-decl.txt glib-unused.txt +glib-undocumented.txt html sgml *.stamp diff --git a/docs/reference/glib/Makefile.am b/docs/reference/glib/Makefile.am index 82cb4042..7fca34b8 100644 --- a/docs/reference/glib/Makefile.am +++ b/docs/reference/glib/Makefile.am @@ -7,7 +7,7 @@ DOC_MODULE=glib DOC_MAIN_SGML_FILE=glib-docs.sgml # The directory containing the source code. Relative to $(srcdir) -DOC_SOURCE_DIR=../../.. +DOC_SOURCE_DIR=../../../glib # Extra options to supply to gtkdoc-scan SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" @@ -19,8 +19,8 @@ MKDB_OPTIONS= FIXXREF_OPTIONS= # Used for dependencies -HFILE_GLOB=$(top_srcdir)/*.h $(top_srcdir)/gmodule/*.h -CFILE_GLOB=$(top_srcdir)/*.c $(top_srcdir)/gmodule/*.c +HFILE_GLOB=$(top_srcdir)/glib/*.h $(top_srcdir)/gmodule/*.h +CFILE_GLOB=$(top_srcdir)/glib/*.c $(top_srcdir)/gmodule/*.c # Headers to ignore IGNORE_HFILES= \ diff --git a/docs/reference/gobject/.cvsignore b/docs/reference/gobject/.cvsignore index dede52a5..a18aa110 100644 --- a/docs/reference/gobject/.cvsignore +++ b/docs/reference/gobject/.cvsignore @@ -3,6 +3,7 @@ Makefile.in gobject-decl.txt gobject-unused.txt gobject-decl-list.txt +gobject-undocumented.txt html sgml *.stamp diff --git a/galloca.h b/galloca.h deleted file mode 100644 index b4194d4a..00000000 --- a/galloca.h +++ /dev/null @@ -1,60 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_ALLOCA_H__ -#define __G_ALLOCA_H__ - -#include - -#ifdef __GNUC__ -/* GCC does the right thing */ -# undef alloca -# define alloca(size) __builtin_alloca (size) -#elif defined (GLIB_HAVE_ALLOCA_H) -/* a native and working alloca.h is there */ -# include -#else /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ -# ifdef _MSC_VER -# include -# define alloca _alloca -# else /* !_MSC_VER */ -# ifdef _AIX - #pragma alloca -# else /* !_AIX */ -# ifndef alloca /* predefined by HP cc +Olibcalls */ -G_BEGIN_DECLS -char *alloca (); -G_END_DECLS -# endif /* !alloca */ -# endif /* !_AIX */ -# endif /* !_MSC_VER */ -#endif /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ - -#define g_alloca(size) alloca (size) - - -#endif /* __G_ALLOCA_H__ */ - diff --git a/garray.c b/garray.c deleted file mode 100644 index 9a5758f8..00000000 --- a/garray.c +++ /dev/null @@ -1,670 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include "glib.h" - - -#define MIN_ARRAY_SIZE 16 - -typedef struct _GRealArray GRealArray; - -struct _GRealArray -{ - guint8 *data; - guint len; - guint alloc; - guint elt_size; - guint zero_terminated : 1; - guint clear : 1; -}; - -#define g_array_elt_len(array,i) ((array)->elt_size * (i)) -#define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i))) -#define g_array_elt_zero(array, pos, len) \ - (memset (g_array_elt_pos ((array), pos), 0, g_array_elt_len ((array), len))) -#define g_array_zero_terminate(array) G_STMT_START{ \ - if ((array)->zero_terminated) \ - g_array_elt_zero ((array), (array)->len, 1); \ -}G_STMT_END - -static gint g_nearest_pow (gint num) G_GNUC_CONST; -static void g_array_maybe_expand (GRealArray *array, - gint len); - -static GMemChunk *array_mem_chunk = NULL; -G_LOCK_DEFINE_STATIC (array_mem_chunk); - -GArray* -g_array_new (gboolean zero_terminated, - gboolean clear, - guint elt_size) -{ - return (GArray*) g_array_sized_new (zero_terminated, clear, elt_size, 0); -} - -GArray* g_array_sized_new (gboolean zero_terminated, - gboolean clear, - guint elt_size, - guint reserved_size) -{ - GRealArray *array; - - G_LOCK (array_mem_chunk); - if (!array_mem_chunk) - array_mem_chunk = g_mem_chunk_new ("array mem chunk", - sizeof (GRealArray), - 1024, G_ALLOC_AND_FREE); - - array = g_chunk_new (GRealArray, array_mem_chunk); - G_UNLOCK (array_mem_chunk); - - array->data = NULL; - array->len = 0; - array->alloc = 0; - array->zero_terminated = (zero_terminated ? 1 : 0); - array->clear = (clear ? 1 : 0); - array->elt_size = elt_size; - - if (array->zero_terminated || reserved_size != 0) - { - g_array_maybe_expand (array, reserved_size); - g_array_zero_terminate(array); - } - - return (GArray*) array; -} - -gchar* -g_array_free (GArray *array, - gboolean free_segment) -{ - gchar* segment; - - g_return_val_if_fail (array, NULL); - - if (free_segment) - { - g_free (array->data); - segment = NULL; - } - else - segment = array->data; - - G_LOCK (array_mem_chunk); - g_mem_chunk_free (array_mem_chunk, array); - G_UNLOCK (array_mem_chunk); - - return segment; -} - -GArray* -g_array_append_vals (GArray *farray, - gconstpointer data, - guint len) -{ - GRealArray *array = (GRealArray*) farray; - - g_array_maybe_expand (array, len); - - memcpy (g_array_elt_pos (array, array->len), data, - g_array_elt_len (array, len)); - - array->len += len; - - g_array_zero_terminate (array); - - return farray; -} - -GArray* -g_array_prepend_vals (GArray *farray, - gconstpointer data, - guint len) -{ - GRealArray *array = (GRealArray*) farray; - - g_array_maybe_expand (array, len); - - g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), - g_array_elt_len (array, array->len)); - - memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len)); - - array->len += len; - - g_array_zero_terminate (array); - - return farray; -} - -GArray* -g_array_insert_vals (GArray *farray, - guint index, - gconstpointer data, - guint len) -{ - GRealArray *array = (GRealArray*) farray; - - g_array_maybe_expand (array, len); - - g_memmove (g_array_elt_pos (array, len + index), - g_array_elt_pos (array, index), - g_array_elt_len (array, array->len - index)); - - memcpy (g_array_elt_pos (array, index), data, g_array_elt_len (array, len)); - - array->len += len; - - g_array_zero_terminate (array); - - return farray; -} - -GArray* -g_array_set_size (GArray *farray, - guint length) -{ - GRealArray *array = (GRealArray*) farray; - if (length > array->len) - { - g_array_maybe_expand (array, length - array->len); - - if (array->clear) - g_array_elt_zero (array, array->len, length - array->len); - } -#ifdef ENABLE_GC_FRIENDLY - else if (length < array->len) - g_array_elt_zero (array, length, array->len - length); -#endif /* ENABLE_GC_FRIENDLY */ - - array->len = length; - - g_array_zero_terminate (array); - - return farray; -} - -GArray* -g_array_remove_index (GArray* farray, - guint index) -{ - GRealArray* array = (GRealArray*) farray; - - g_return_val_if_fail (array, NULL); - - g_return_val_if_fail (index < array->len, NULL); - - if (index != array->len - 1) - g_memmove (g_array_elt_pos (array, index), - g_array_elt_pos (array, index + 1), - g_array_elt_len (array, array->len - index - 1)); - - array->len -= 1; - -#ifdef ENABLE_GC_FRIENDLY - g_array_elt_zero (array, array->len, 1); -#else /* !ENABLE_GC_FRIENDLY */ - g_array_zero_terminate (array); -#endif /* ENABLE_GC_FRIENDLY */ - - return farray; -} - -GArray* -g_array_remove_index_fast (GArray* farray, - guint index) -{ - GRealArray* array = (GRealArray*) farray; - - g_return_val_if_fail (array, NULL); - - g_return_val_if_fail (index < array->len, NULL); - - if (index != array->len - 1) - memcpy (g_array_elt_pos (array, index), - g_array_elt_pos (array, array->len - 1), - g_array_elt_len (array, 1)); - - array->len -= 1; - -#ifdef ENABLE_GC_FRIENDLY - g_array_elt_zero (array, array->len, 1); -#else /* !ENABLE_GC_FRIENDLY */ - g_array_zero_terminate (array); -#endif /* ENABLE_GC_FRIENDLY */ - - return farray; -} - -void -g_array_sort (GArray *farray, - GCompareFunc compare_func) -{ - GRealArray *array = (GRealArray*) farray; - - g_return_if_fail (array != NULL); - g_return_if_fail (array->data != NULL); - - qsort (array->data, - array->len, - array->elt_size, - compare_func); -} - -void -g_array_sort_with_data (GArray *farray, - GCompareDataFunc compare_func, - gpointer user_data) -{ - GRealArray *array = (GRealArray*) farray; - - g_return_if_fail (array != NULL); - g_return_if_fail (array->data != NULL); - - g_qsort_with_data (array->data, - array->len, - array->elt_size, - compare_func, - user_data); -} - - -static gint -g_nearest_pow (gint num) -{ - gint n = 1; - - while (n < num) - n <<= 1; - - return n; -} - -static void -g_array_maybe_expand (GRealArray *array, - gint len) -{ - guint want_alloc = g_array_elt_len (array, array->len + len + - array->zero_terminated); - - if (want_alloc > array->alloc) - { - want_alloc = g_nearest_pow (want_alloc); - want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE); - - array->data = g_realloc (array->data, want_alloc); - -#ifdef ENABLE_GC_FRIENDLY - memset (array->data + array->alloc, 0, want_alloc - array->alloc); -#endif /* ENABLE_GC_FRIENDLY */ - - array->alloc = want_alloc; - } -} - -/* Pointer Array - */ - -typedef struct _GRealPtrArray GRealPtrArray; - -struct _GRealPtrArray -{ - gpointer *pdata; - guint len; - guint alloc; -}; - -static void g_ptr_array_maybe_expand (GRealPtrArray *array, - gint len); - -static GMemChunk *ptr_array_mem_chunk = NULL; -G_LOCK_DEFINE_STATIC (ptr_array_mem_chunk); - - -GPtrArray* -g_ptr_array_new (void) -{ - return g_ptr_array_sized_new (0); -} - -GPtrArray* -g_ptr_array_sized_new (guint reserved_size) -{ - GRealPtrArray *array; - - G_LOCK (ptr_array_mem_chunk); - if (!ptr_array_mem_chunk) - ptr_array_mem_chunk = g_mem_chunk_new ("array mem chunk", - sizeof (GRealPtrArray), - 1024, G_ALLOC_AND_FREE); - - array = g_chunk_new (GRealPtrArray, ptr_array_mem_chunk); - G_UNLOCK (ptr_array_mem_chunk); - - array->pdata = NULL; - array->len = 0; - array->alloc = 0; - - if (reserved_size != 0) - g_ptr_array_maybe_expand (array, reserved_size); - - return (GPtrArray*) array; -} - -gpointer* -g_ptr_array_free (GPtrArray *array, - gboolean free_segment) -{ - gpointer* segment; - - g_return_val_if_fail (array, NULL); - - if (free_segment) - { - g_free (array->pdata); - segment = NULL; - } - else - segment = array->pdata; - - G_LOCK (ptr_array_mem_chunk); - g_mem_chunk_free (ptr_array_mem_chunk, array); - G_UNLOCK (ptr_array_mem_chunk); - - return segment; -} - -static void -g_ptr_array_maybe_expand (GRealPtrArray *array, - gint len) -{ - if ((array->len + len) > array->alloc) - { -#ifdef ENABLE_GC_FRIENDLY - guint old_alloc = array->alloc; -#endif /* ENABLE_GC_FRIENDLY */ - array->alloc = g_nearest_pow (array->len + len); - array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE); - array->pdata = g_realloc (array->pdata, sizeof(gpointer) * array->alloc); -#ifdef ENABLE_GC_FRIENDLY - for ( ; old_alloc < array->alloc; old_alloc++) - array->pdata [old_alloc] = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - } -} - -void -g_ptr_array_set_size (GPtrArray *farray, - gint length) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - - g_return_if_fail (array); - - if (length > array->len) - { - int i; - g_ptr_array_maybe_expand (array, (length - array->len)); - /* This is not - * memset (array->pdata + array->len, 0, - * sizeof (gpointer) * (length - array->len)); - * to make it really portable. Remember (void*)NULL needn't be - * bitwise zero. It of course is silly not to use memset (..,0,..). - */ - for (i = array->len; i < length; i++) - array->pdata[i] = NULL; - } -#ifdef ENABLE_GC_FRIENDLY - else if (length < array->len) - { - int i; - for (i = length; i < array->len; i++) - array->pdata[i] = NULL; - } -#endif /* ENABLE_GC_FRIENDLY */ - - array->len = length; -} - -gpointer -g_ptr_array_remove_index (GPtrArray* farray, - guint index) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - gpointer result; - - g_return_val_if_fail (array, NULL); - - g_return_val_if_fail (index < array->len, NULL); - - result = array->pdata[index]; - - if (index != array->len - 1) - g_memmove (array->pdata + index, array->pdata + index + 1, - sizeof (gpointer) * (array->len - index - 1)); - - array->len -= 1; - -#ifdef ENABLE_GC_FRIENDLY - array->pdata[array->len] = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - return result; -} - -gpointer -g_ptr_array_remove_index_fast (GPtrArray* farray, - guint index) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - gpointer result; - - g_return_val_if_fail (array, NULL); - - g_return_val_if_fail (index < array->len, NULL); - - result = array->pdata[index]; - - if (index != array->len - 1) - array->pdata[index] = array->pdata[array->len - 1]; - - array->len -= 1; - -#ifdef ENABLE_GC_FRIENDLY - array->pdata[array->len] = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - return result; -} - -gboolean -g_ptr_array_remove (GPtrArray* farray, - gpointer data) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - guint i; - - g_return_val_if_fail (array, FALSE); - - for (i = 0; i < array->len; i += 1) - { - if (array->pdata[i] == data) - { - g_ptr_array_remove_index (farray, i); - return TRUE; - } - } - - return FALSE; -} - -gboolean -g_ptr_array_remove_fast (GPtrArray* farray, - gpointer data) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - guint i; - - g_return_val_if_fail (array, FALSE); - - for (i = 0; i < array->len; i += 1) - { - if (array->pdata[i] == data) - { - g_ptr_array_remove_index_fast (farray, i); - return TRUE; - } - } - - return FALSE; -} - -void -g_ptr_array_add (GPtrArray* farray, - gpointer data) -{ - GRealPtrArray* array = (GRealPtrArray*) farray; - - g_return_if_fail (array); - - g_ptr_array_maybe_expand (array, 1); - - array->pdata[array->len++] = data; -} - -void -g_ptr_array_sort (GPtrArray *array, - GCompareFunc compare_func) -{ - g_return_if_fail (array != NULL); - g_return_if_fail (array->pdata != NULL); - - qsort (array->pdata, - array->len, - sizeof (gpointer), - compare_func); -} - -void -g_ptr_array_sort_with_data (GPtrArray *array, - GCompareDataFunc compare_func, - gpointer user_data) -{ - g_return_if_fail (array != NULL); - g_return_if_fail (array->pdata != NULL); - - g_qsort_with_data (array->pdata, - array->len, - sizeof (gpointer), - compare_func, - user_data); -} - -/* Byte arrays - */ - -GByteArray* g_byte_array_new (void) -{ - return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0); -} - -GByteArray* g_byte_array_sized_new (guint reserved_size) -{ - return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size); -} - -guint8* g_byte_array_free (GByteArray *array, - gboolean free_segment) -{ - return (guint8*) g_array_free ((GArray*) array, free_segment); -} - -GByteArray* g_byte_array_append (GByteArray *array, - const guint8 *data, - guint len) -{ - g_array_append_vals ((GArray*) array, (guint8*)data, len); - - return array; -} - -GByteArray* g_byte_array_prepend (GByteArray *array, - const guint8 *data, - guint len) -{ - g_array_prepend_vals ((GArray*) array, (guint8*)data, len); - - return array; -} - -GByteArray* g_byte_array_set_size (GByteArray *array, - guint length) -{ - g_array_set_size ((GArray*) array, length); - - return array; -} - -GByteArray* g_byte_array_remove_index (GByteArray *array, - guint index) -{ - g_array_remove_index((GArray*) array, index); - - return array; -} - -GByteArray* g_byte_array_remove_index_fast (GByteArray *array, - guint index) -{ - g_array_remove_index_fast((GArray*) array, index); - - return array; -} - -void -g_byte_array_sort (GByteArray *array, - GCompareFunc compare_func) -{ - g_array_sort ((GArray *) array, compare_func); -} - -void -g_byte_array_sort_with_data (GByteArray *array, - GCompareDataFunc compare_func, - gpointer user_data) -{ - g_array_sort_with_data ((GArray *) array, compare_func, user_data); -} diff --git a/garray.h b/garray.h deleted file mode 100644 index 766da77d..00000000 --- a/garray.h +++ /dev/null @@ -1,156 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_ARRAY_H__ -#define __G_ARRAY_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GArray GArray; -typedef struct _GByteArray GByteArray; -typedef struct _GPtrArray GPtrArray; - -struct _GArray -{ - gchar *data; - guint len; -}; - -struct _GByteArray -{ - guint8 *data; - guint len; -}; - -struct _GPtrArray -{ - gpointer *pdata; - guint len; -}; - -/* Resizable arrays, remove fills any cleared spot and shortens the - * array, while preserving the order. remove_fast will distort the - * order by moving the last element to the position of the removed - */ - -#define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1) -#define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1) -#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1) -#define g_array_index(a,t,i) (((t*) (a)->data) [(i)]) - -GArray* g_array_new (gboolean zero_terminated, - gboolean clear, - guint element_size); -GArray* g_array_sized_new (gboolean zero_terminated, - gboolean clear, - guint element_size, - guint reserved_size); -gchar* g_array_free (GArray *array, - gboolean free_segment); -GArray* g_array_append_vals (GArray *array, - gconstpointer data, - guint len); -GArray* g_array_prepend_vals (GArray *array, - gconstpointer data, - guint len); -GArray* g_array_insert_vals (GArray *array, - guint index, - gconstpointer data, - guint len); -GArray* g_array_set_size (GArray *array, - guint length); -GArray* g_array_remove_index (GArray *array, - guint index); -GArray* g_array_remove_index_fast (GArray *array, - guint index); -void g_array_sort (GArray *array, - GCompareFunc compare_func); -void g_array_sort_with_data (GArray *array, - GCompareDataFunc compare_func, - gpointer user_data); - -/* Resizable pointer array. This interface is much less complicated - * than the above. Add appends appends a pointer. Remove fills any - * cleared spot and shortens the array. remove_fast will again distort - * order. - */ -#define g_ptr_array_index(array,index) (array->pdata)[index] -GPtrArray* g_ptr_array_new (void); -GPtrArray* g_ptr_array_sized_new (guint reserved_size); -gpointer* g_ptr_array_free (GPtrArray *array, - gboolean free_seg); -void g_ptr_array_set_size (GPtrArray *array, - gint length); -gpointer g_ptr_array_remove_index (GPtrArray *array, - guint index); -gpointer g_ptr_array_remove_index_fast (GPtrArray *array, - guint index); -gboolean g_ptr_array_remove (GPtrArray *array, - gpointer data); -gboolean g_ptr_array_remove_fast (GPtrArray *array, - gpointer data); -void g_ptr_array_add (GPtrArray *array, - gpointer data); -void g_ptr_array_sort (GPtrArray *array, - GCompareFunc compare_func); -void g_ptr_array_sort_with_data (GPtrArray *array, - GCompareDataFunc compare_func, - gpointer user_data); - - -/* Byte arrays, an array of guint8. Implemented as a GArray, - * but type-safe. - */ - -GByteArray* g_byte_array_new (void); -GByteArray* g_byte_array_sized_new (guint reserved_size); -guint8* g_byte_array_free (GByteArray *array, - gboolean free_segment); -GByteArray* g_byte_array_append (GByteArray *array, - const guint8 *data, - guint len); -GByteArray* g_byte_array_prepend (GByteArray *array, - const guint8 *data, - guint len); -GByteArray* g_byte_array_set_size (GByteArray *array, - guint length); -GByteArray* g_byte_array_remove_index (GByteArray *array, - guint index); -GByteArray* g_byte_array_remove_index_fast (GByteArray *array, - guint index); -void g_byte_array_sort (GByteArray *array, - GCompareFunc compare_func); -void g_byte_array_sort_with_data (GByteArray *array, - GCompareDataFunc compare_func, - gpointer user_data); - - -G_END_DECLS - -#endif /* __G_ARRAY_H__ */ - diff --git a/gasyncqueue.c b/gasyncqueue.c deleted file mode 100644 index c6624799..00000000 --- a/gasyncqueue.c +++ /dev/null @@ -1,443 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GAsyncQueue: asynchronous queue implementation, based on Gqueue. - * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * MT safe - */ - -#include "glib.h" - -struct _GAsyncQueue -{ - GMutex *mutex; - GCond *cond; - GQueue *queue; - guint waiting_threads; - guint ref_count; -}; - -/** - * g_async_queue_new: - * - * Creates a new asynchronous queue with the initial reference count of 1. - * - * Return value: the new #GAsyncQueue. - **/ -GAsyncQueue* -g_async_queue_new () -{ - GAsyncQueue* retval = g_new (GAsyncQueue, 1); - retval->mutex = g_mutex_new (); - retval->cond = g_cond_new (); - retval->queue = g_queue_new (); - retval->waiting_threads = 0; - retval->ref_count = 1; - return retval; -} - -/** - * g_async_queue_ref: - * @queue: a #GAsyncQueue. - * - * Increases the reference count of the asynchronous @queue by 1. - **/ -void -g_async_queue_ref (GAsyncQueue *queue) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - g_mutex_lock (queue->mutex); - queue->ref_count++; - g_mutex_unlock (queue->mutex); -} - -/** - * g_async_queue_ref_unlocked: - * @queue: a #GAsyncQueue. - * - * Increases the reference count of the asynchronous @queue by 1. This - * function must be called while holding the @queue's lock. - **/ -void -g_async_queue_ref_unlocked (GAsyncQueue *queue) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - queue->ref_count++; -} - -/** - * g_async_queue_unref_and_unlock: - * @queue: a #GAsyncQueue. - * - * Decreases the reference count of the asynchronous @queue by 1 and - * releases the lock. This function must be called while holding the - * @queue's lock. If the reference count went to 0, the @queue will be - * destroyed and the memory allocated will be freed. So you are not - * allowed to use the @queue afterwards, as it might have disappeared. - * The obvious asymmetry (it is not named - * g_async_queue_unref_unlocked) is because the queue can't be - * unlocked after dereffing it, as it might already have disappeared. - **/ -void -g_async_queue_unref_and_unlock (GAsyncQueue *queue) -{ - gboolean stop; - - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - queue->ref_count--; - stop = (queue->ref_count == 0); - g_mutex_unlock (queue->mutex); - - if (stop) - { - g_return_if_fail (queue->waiting_threads == 0); - g_mutex_free (queue->mutex); - g_cond_free (queue->cond); - g_queue_free (queue->queue); - g_free (queue); - } -} - -/** - * g_async_queue_unref: - * @queue: a #GAsyncQueue. - * - * Decreases the reference count of the asynchronous @queue by 1. If - * the reference count went to 0, the @queue will be destroyed and the - * memory allocated will be freed. So you are not allowed to use the - * @queue afterwards, as it might have disappeared. - **/ -void -g_async_queue_unref (GAsyncQueue *queue) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - g_mutex_lock (queue->mutex); - g_async_queue_unref_and_unlock (queue); -} - -/** - * g_async_queue_lock: - * @queue: a #GAsyncQueue. - * - * Acquire the @queue's lock. After that you can only call the - * g_async_queue_*_unlocked function variants on that - * @queue. Otherwise it will deadlock. - **/ -void -g_async_queue_lock (GAsyncQueue *queue) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - g_mutex_lock (queue->mutex); -} - -/** - * g_async_queue_unlock: - * @queue: a #GAsyncQueue. - * - * Release the queue's lock. - **/ -void -g_async_queue_unlock (GAsyncQueue *queue) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - - g_mutex_unlock (queue->mutex); -} - -/** - * g_async_queue_push: - * @queue: a #GAsyncQueue. - * @data: @data to push into the @queue. - * - * Push the @data into the @queue. @data must not be #NULL. - **/ -void -g_async_queue_push (GAsyncQueue* queue, gpointer data) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - g_return_if_fail (data); - - g_mutex_lock (queue->mutex); - g_async_queue_push_unlocked (queue, data); - g_mutex_unlock (queue->mutex); -} - -/** - * g_async_queue_push_unlocked: - * @queue: a #GAsyncQueue. - * @data: @data to push into the @queue. - * - * Push the @data into the @queue. @data must not be #NULL. This - * function must be called while holding the @queue's lock. - **/ -void -g_async_queue_push_unlocked (GAsyncQueue* queue, gpointer data) -{ - g_return_if_fail (queue); - g_return_if_fail (queue->ref_count > 0); - g_return_if_fail (data); - - g_queue_push_head (queue->queue, data); - g_cond_signal (queue->cond); -} - -static gpointer -g_async_queue_pop_intern_unlocked (GAsyncQueue* queue, gboolean try, - GTimeVal *end_time) -{ - gpointer retval; - - if (!g_queue_peek_tail (queue->queue)) - { - if (try) - return NULL; - if (!end_time) - { - queue->waiting_threads++; - while (!g_queue_peek_tail (queue->queue)) - g_cond_wait(queue->cond, queue->mutex); - queue->waiting_threads--; - } - else - { - queue->waiting_threads++; - while (!g_queue_peek_tail (queue->queue)) - if (!g_cond_timed_wait (queue->cond, queue->mutex, end_time)) - break; - queue->waiting_threads--; - if (!g_queue_peek_tail (queue->queue)) - return NULL; - } - } - - retval = g_queue_pop_tail (queue->queue); - - g_assert (retval); - - return retval; -} - -/** - * g_async_queue_pop: - * @queue: a #GAsyncQueue. - * - * Pop data from the @queue. This function blocks until data become - * available. - * - * Return value: data from the queue. - **/ -gpointer -g_async_queue_pop (GAsyncQueue* queue) -{ - gpointer retval; - - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - g_mutex_lock (queue->mutex); - retval = g_async_queue_pop_intern_unlocked (queue, FALSE, NULL); - g_mutex_unlock (queue->mutex); - - return retval; -} - -/** - * g_async_queue_pop_unlocked: - * @queue: a #GAsyncQueue. - * - * Pop data from the @queue. This function blocks until data become - * available. This function must be called while holding the @queue's - * lock. - * - * Return value: data from the queue. - **/ -gpointer -g_async_queue_pop_unlocked (GAsyncQueue* queue) -{ - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - return g_async_queue_pop_intern_unlocked (queue, FALSE, NULL); -} - -/** - * g_async_queue_try_pop: - * @queue: a #GAsyncQueue. - * - * Try to pop data from the @queue. If no data is available, #NULL is - * returned. - * - * Return value: data from the queue or #NULL, when no data is - * available immediately. - **/ -gpointer -g_async_queue_try_pop (GAsyncQueue* queue) -{ - gpointer retval; - - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - g_mutex_lock (queue->mutex); - retval = g_async_queue_pop_intern_unlocked (queue, TRUE, NULL); - g_mutex_unlock (queue->mutex); - - return retval; -} - -/** - * g_async_queue_try_pop_unlocked: - * @queue: a #GAsyncQueue. - * - * Try to pop data from the @queue. If no data is available, #NULL is - * returned. This function must be called while holding the @queue's - * lock. - * - * Return value: data from the queue or #NULL, when no data is - * available immediately. - **/ -gpointer -g_async_queue_try_pop_unlocked (GAsyncQueue* queue) -{ - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - return g_async_queue_pop_intern_unlocked (queue, TRUE, NULL); -} - -/** - * g_async_queue_timed_pop: - * @queue: a #GAsyncQueue. - * @end_time: a #GTimeVal, determining the final time. - * - * Pop data from the @queue. If no data is received before @end_time, - * #NULL is returned. - * - * To easily calculate @end_time a combination of g_get_current_time() - * and g_time_val_add() can be used. - * - * Return value: data from the queue or #NULL, when no data is - * received before @end_time. - **/ -gpointer -g_async_queue_timed_pop (GAsyncQueue* queue, GTimeVal *end_time) -{ - gpointer retval; - - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - g_mutex_lock (queue->mutex); - retval = g_async_queue_pop_intern_unlocked (queue, FALSE, end_time); - g_mutex_unlock (queue->mutex); - - return retval; -} - -/** - * g_async_queue_timed_pop_unlocked: - * @queue: a #GAsyncQueue. - * @end_time: a #GTimeVal, determining the final time. - * - * Pop data from the @queue. If no data is received before @end_time, - * #NULL is returned. This function must be called while holding the - * @queue's lock. - * - * To easily calculate @end_time a combination of g_get_current_time() - * and g_time_val_add() can be used. - * - * Return value: data from the queue or #NULL, when no data is - * received before @end_time. - **/ -gpointer -g_async_queue_timed_pop_unlocked (GAsyncQueue* queue, GTimeVal *end_time) -{ - g_return_val_if_fail (queue, NULL); - g_return_val_if_fail (queue->ref_count > 0, NULL); - - return g_async_queue_pop_intern_unlocked (queue, FALSE, end_time); -} - -/** - * g_async_queue_length: - * @queue: a #GAsyncQueue. - * - * Returns the length of the queue, negative values mean waiting - * threads, positive values mean available entries in the - * @queue. Actually this function returns the number of data items in - * the queue minus the number of waiting threads. Thus a return value - * of 0 could mean 'n' entries in the queue and 'n' thread waiting. - * That can happen due to locking of the queue or due to - * scheduling. - * - * Return value: the length of the @queue. - **/ -gint -g_async_queue_length (GAsyncQueue* queue) -{ - gint retval; - - g_return_val_if_fail (queue, 0); - g_return_val_if_fail (queue->ref_count > 0, 0); - - g_mutex_lock (queue->mutex); - retval = queue->queue->length - queue->waiting_threads; - g_mutex_unlock (queue->mutex); - - return retval; -} - -/** - * g_async_queue_length_unlocked: - * @queue: a #GAsyncQueue. - * - * Returns the length of the queue, negative values mean waiting - * threads, positive values mean available entries in the - * @queue. Actually this function returns the number of data items in - * the queue minus the number of waiting threads. Thus a return value - * of 0 could mean 'n' entries in the queue and 'n' thread waiting. - * That can happen due to locking of the queue or due to - * scheduling. This function must be called while holding the @queue's - * lock. - * - * Return value: the length of the @queue. - **/ -gint -g_async_queue_length_unlocked (GAsyncQueue* queue) -{ - g_return_val_if_fail (queue, 0); - g_return_val_if_fail (queue->ref_count > 0, 0); - - return queue->queue->length - queue->waiting_threads; -} - diff --git a/gasyncqueue.h b/gasyncqueue.h deleted file mode 100644 index 6e87425f..00000000 --- a/gasyncqueue.h +++ /dev/null @@ -1,95 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_ASYNCQUEUE_H__ -#define __G_ASYNCQUEUE_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GAsyncQueue GAsyncQueue; - -/* Asyncronous Queues, can be used to communicate between threads - */ - -/* Get a new GAsyncQueue with the ref_count 1 */ -GAsyncQueue* g_async_queue_new (void); - -/* Lock and unlock an GAsyncQueue, all functions lock the queue for - * themselves, but in certain cirumstances you want to hold the lock longer, - * thus you lock the queue, call the *_unlocked functions and unlock it again - */ -void g_async_queue_lock (GAsyncQueue *queue); -void g_async_queue_unlock (GAsyncQueue *queue); - -/* Ref and unref the GAsyncQueue. g_async_queue_unref_unlocked makes - * no sense, as after the unreffing the Queue might be gone and can't - * be unlocked. So you have a function to call, if you don't hold the - * lock (g_async_queue_unref) and one to call, when you already hold - * the lock (g_async_queue_unref_and_unlock). After that however, you - * don't hold the lock anymore and the Queue might in fact be - * destroyed, if you unrefed to zero */ -void g_async_queue_ref (GAsyncQueue *queue); -void g_async_queue_ref_unlocked (GAsyncQueue *queue); -void g_async_queue_unref (GAsyncQueue *queue); -void g_async_queue_unref_and_unlock (GAsyncQueue *queue); - -/* Push data into the async queue. Must not be NULL */ -void g_async_queue_push (GAsyncQueue *queue, - gpointer data); -void g_async_queue_push_unlocked (GAsyncQueue *queue, - gpointer data); - -/* Pop data from the async queue, when no data is there, the thread is blocked - * until data arrives */ -gpointer g_async_queue_pop (GAsyncQueue *queue); -gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue); - -/* Try to pop data, NULL is returned in case of empty queue */ -gpointer g_async_queue_try_pop (GAsyncQueue *queue); -gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue); - -/* Wait for data until at maximum until end_time is reached, NULL is returned - * in case of empty queue*/ -gpointer g_async_queue_timed_pop (GAsyncQueue *queue, - GTimeVal *end_time); -gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, - GTimeVal *end_time); - -/* Return the length of the queue, negative values mean, that threads - * are waiting, positve values mean, that there are entries in the - * queue. Actually this function returns the length of the queue minus - * the number of waiting threads, g_async_queue_length == 0 could also - * mean 'n' entries in the queue and 'n' thread waiting, such can - * happen due to locking of the queue or due to scheduling. */ -gint g_async_queue_length (GAsyncQueue *queue); -gint g_async_queue_length_unlocked (GAsyncQueue *queue); - -G_END_DECLS - -#endif /* __G_ASYNCQUEUE_H__ */ - diff --git a/gbacktrace.c b/gbacktrace.c deleted file mode 100644 index 7d131af7..00000000 --- a/gbacktrace.c +++ /dev/null @@ -1,300 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe ; except for g_on_error_stack_trace, but who wants thread safety - * then - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include "glib.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYS_TIMES_H -#include -#endif -#include - -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* HAVE_SYS_SELECT_H */ - -#ifdef STDC_HEADERS -#include /* for bzero on BSD systems */ -#endif - -#ifdef G_OS_WIN32 -# define STRICT /* Strict typing, please */ -# include -# undef STRICT -#endif - -#ifndef NO_FD_SET -# define SELECT_MASK fd_set -#else -# if defined(_IBMR2) -# define SELECT_MASK void -# else -# define SELECT_MASK int -# endif -#endif - - -#ifndef G_OS_WIN32 -static void stack_trace (char **args); -#endif - -extern volatile gboolean glib_on_error_halt; -volatile gboolean glib_on_error_halt = TRUE; - -void -g_on_error_query (const gchar *prg_name) -{ -#ifndef G_OS_WIN32 - static const gchar *query1 = "[E]xit, [H]alt"; - static const gchar *query2 = ", show [S]tack trace"; - static const gchar *query3 = " or [P]roceed"; - gchar buf[16]; - - if (!prg_name) - prg_name = g_get_prgname (); - - retry: - - if (prg_name) - fprintf (stdout, - "%s (pid:%u): %s%s%s: ", - prg_name, - (guint) getpid (), - query1, - query2, - query3); - else - fprintf (stdout, - "(process:%u): %s%s: ", - (guint) getpid (), - query1, - query3); - fflush (stdout); - - if (isatty(0) && isatty(1)) - fgets (buf, 8, stdin); - else - strcpy (buf, "E\n"); - - if ((buf[0] == 'E' || buf[0] == 'e') - && buf[1] == '\n') - _exit (0); - else if ((buf[0] == 'P' || buf[0] == 'p') - && buf[1] == '\n') - return; - else if (prg_name - && (buf[0] == 'S' || buf[0] == 's') - && buf[1] == '\n') - { - g_on_error_stack_trace (prg_name); - goto retry; - } - else if ((buf[0] == 'H' || buf[0] == 'h') - && buf[1] == '\n') - { - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; - return; - } - else - goto retry; -#else - if (!prg_name) - prg_name = g_get_prgname (); - - MessageBox (NULL, "g_on_error_query called, program terminating", - (prg_name && *prg_name) ? prg_name : NULL, - MB_OK|MB_ICONERROR); - _exit(0); -#endif -} - -void -g_on_error_stack_trace (const gchar *prg_name) -{ -#ifdef G_OS_UNIX - pid_t pid; - gchar buf[16]; - gchar *args[4] = { "gdb", NULL, NULL, NULL }; - - if (!prg_name) - return; - - sprintf (buf, "%u", (guint) getpid ()); - - args[1] = (gchar*) prg_name; - args[2] = buf; - - pid = fork (); - if (pid == 0) - { - stack_trace (args); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork gdb"); - return; - } - - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; -#else - abort (); -#endif -} - -#ifndef G_OS_WIN32 - -static gboolean stack_trace_done = FALSE; - -static void -stack_trace_sigchld (int signum) -{ - stack_trace_done = TRUE; -} - -static void -stack_trace (char **args) -{ - pid_t pid; - int in_fd[2]; - int out_fd[2]; - SELECT_MASK fdset; - SELECT_MASK readset; - struct timeval tv; - int sel, index, state; - char buffer[256]; - char c; - - stack_trace_done = FALSE; - signal (SIGCHLD, stack_trace_sigchld); - - if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1)) - { - perror ("unable to open pipe"); - _exit (0); - } - - pid = fork (); - if (pid == 0) - { - close (0); dup (in_fd[0]); /* set the stdin to the in pipe */ - close (1); dup (out_fd[1]); /* set the stdout to the out pipe */ - close (2); dup (out_fd[1]); /* set the stderr to the out pipe */ - - execvp (args[0], args); /* exec gdb */ - perror ("exec failed"); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork"); - _exit (0); - } - - FD_ZERO (&fdset); - FD_SET (out_fd[0], &fdset); - - write (in_fd[1], "backtrace\n", 10); - write (in_fd[1], "p x = 0\n", 8); - write (in_fd[1], "quit\n", 5); - - index = 0; - state = 0; - - while (1) - { - readset = fdset; - tv.tv_sec = 1; - tv.tv_usec = 0; - - sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv); - if (sel == -1) - break; - - if ((sel > 0) && (FD_ISSET (out_fd[0], &readset))) - { - if (read (out_fd[0], &c, 1)) - { - switch (state) - { - case 0: - if (c == '#') - { - state = 1; - index = 0; - buffer[index++] = c; - } - break; - case 1: - buffer[index++] = c; - if ((c == '\n') || (c == '\r')) - { - buffer[index] = 0; - fprintf (stdout, "%s", buffer); - state = 0; - index = 0; - } - break; - default: - break; - } - } - } - else if (stack_trace_done) - break; - } - - close (in_fd[0]); - close (in_fd[1]); - close (out_fd[0]); - close (out_fd[1]); - _exit (0); -} - -#endif /* !G_OS_WIN32 */ diff --git a/gbacktrace.h b/gbacktrace.h deleted file mode 100644 index 25d2f998..00000000 --- a/gbacktrace.h +++ /dev/null @@ -1,61 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_BACKTRACE_H__ -#define __G_BACKTRACE_H__ - -#include - -G_BEGIN_DECLS - -/* Fatal error handlers. - * g_on_error_query() will prompt the user to either - * [E]xit, [H]alt, [P]roceed or show [S]tack trace. - * g_on_error_stack_trace() invokes gdb, which attaches to the current - * process and shows a stack trace. - * These function may cause different actions on non-unix platforms. - * The prg_name arg is required by gdb to find the executable, if it is - * passed as NULL, g_on_error_query() will try g_get_prgname(). - */ -void g_on_error_query (const gchar *prg_name); -void g_on_error_stack_trace (const gchar *prg_name); - -/* Hacker macro to place breakpoints for elected machines. - * Actual use is strongly deprecated of course ;) - */ -#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2 -# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END -#elif defined (_MSC_VER) && defined (_M_IX86) -# define G_BREAKPOINT() G_STMT_START{ __asm int 3h }G_STMT_END -#elif defined (__alpha__) && defined (__GNUC__) && __GNUC__ >= 2 -# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END -#else /* !__i386__ && !__alpha__ */ -# define G_BREAKPOINT() G_STMT_START{ raise (5 /* SIGTRAP */); }G_STMT_END -#endif /* __i386__ */ - -G_END_DECLS - -#endif /* __G_BACKTRACE_H__ */ diff --git a/gcache.c b/gcache.c deleted file mode 100644 index 5a06e0ee..00000000 --- a/gcache.c +++ /dev/null @@ -1,230 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" - - -typedef struct _GCacheNode GCacheNode; -typedef struct _GRealCache GRealCache; - -struct _GCacheNode -{ - /* A reference counted node */ - gpointer value; - gint ref_count; -}; - -struct _GRealCache -{ - /* Called to create a value from a key */ - GCacheNewFunc value_new_func; - - /* Called to destroy a value */ - GCacheDestroyFunc value_destroy_func; - - /* Called to duplicate a key */ - GCacheDupFunc key_dup_func; - - /* Called to destroy a key */ - GCacheDestroyFunc key_destroy_func; - - /* Associates keys with nodes */ - GHashTable *key_table; - - /* Associates nodes with keys */ - GHashTable *value_table; -}; - - -static GCacheNode* g_cache_node_new (gpointer value); -static void g_cache_node_destroy (GCacheNode *node); - - -static GMemChunk *node_mem_chunk = NULL; -G_LOCK_DEFINE_STATIC (node_mem_chunk); - -GCache* -g_cache_new (GCacheNewFunc value_new_func, - GCacheDestroyFunc value_destroy_func, - GCacheDupFunc key_dup_func, - GCacheDestroyFunc key_destroy_func, - GHashFunc hash_key_func, - GHashFunc hash_value_func, - GEqualFunc key_equal_func) -{ - GRealCache *cache; - - g_return_val_if_fail (value_new_func != NULL, NULL); - g_return_val_if_fail (value_destroy_func != NULL, NULL); - g_return_val_if_fail (key_dup_func != NULL, NULL); - g_return_val_if_fail (key_destroy_func != NULL, NULL); - g_return_val_if_fail (hash_key_func != NULL, NULL); - g_return_val_if_fail (hash_value_func != NULL, NULL); - g_return_val_if_fail (key_equal_func != NULL, NULL); - - cache = g_new (GRealCache, 1); - cache->value_new_func = value_new_func; - cache->value_destroy_func = value_destroy_func; - cache->key_dup_func = key_dup_func; - cache->key_destroy_func = key_destroy_func; - cache->key_table = g_hash_table_new (hash_key_func, key_equal_func); - cache->value_table = g_hash_table_new (hash_value_func, NULL); - - return (GCache*) cache; -} - -void -g_cache_destroy (GCache *cache) -{ - GRealCache *rcache; - - g_return_if_fail (cache != NULL); - - rcache = (GRealCache*) cache; - g_hash_table_destroy (rcache->key_table); - g_hash_table_destroy (rcache->value_table); - g_free (rcache); -} - -gpointer -g_cache_insert (GCache *cache, - gpointer key) -{ - GRealCache *rcache; - GCacheNode *node; - gpointer value; - - g_return_val_if_fail (cache != NULL, NULL); - - rcache = (GRealCache*) cache; - - node = g_hash_table_lookup (rcache->key_table, key); - if (node) - { - node->ref_count += 1; - return node->value; - } - - key = (* rcache->key_dup_func) (key); - value = (* rcache->value_new_func) (key); - node = g_cache_node_new (value); - - g_hash_table_insert (rcache->key_table, key, node); - g_hash_table_insert (rcache->value_table, value, key); - - return node->value; -} - -void -g_cache_remove (GCache *cache, - gconstpointer value) -{ - GRealCache *rcache; - GCacheNode *node; - gpointer key; - - g_return_if_fail (cache != NULL); - - rcache = (GRealCache*) cache; - - key = g_hash_table_lookup (rcache->value_table, value); - node = g_hash_table_lookup (rcache->key_table, key); - - g_return_if_fail (node != NULL); - - node->ref_count -= 1; - if (node->ref_count == 0) - { - g_hash_table_remove (rcache->value_table, value); - g_hash_table_remove (rcache->key_table, key); - - (* rcache->key_destroy_func) (key); - (* rcache->value_destroy_func) (node->value); - g_cache_node_destroy (node); - } -} - -void -g_cache_key_foreach (GCache *cache, - GHFunc func, - gpointer user_data) -{ - GRealCache *rcache; - - g_return_if_fail (cache != NULL); - g_return_if_fail (func != NULL); - - rcache = (GRealCache*) cache; - - g_hash_table_foreach (rcache->value_table, func, user_data); -} - -void -g_cache_value_foreach (GCache *cache, - GHFunc func, - gpointer user_data) -{ - GRealCache *rcache; - - g_return_if_fail (cache != NULL); - g_return_if_fail (func != NULL); - - rcache = (GRealCache*) cache; - - g_hash_table_foreach (rcache->key_table, func, user_data); -} - - -static GCacheNode* -g_cache_node_new (gpointer value) -{ - GCacheNode *node; - - G_LOCK (node_mem_chunk); - if (!node_mem_chunk) - node_mem_chunk = g_mem_chunk_new ("cache node mem chunk", sizeof (GCacheNode), - 1024, G_ALLOC_AND_FREE); - - node = g_chunk_new (GCacheNode, node_mem_chunk); - G_UNLOCK (node_mem_chunk); - - node->value = value; - node->ref_count = 1; - - return node; -} - -static void -g_cache_node_destroy (GCacheNode *node) -{ - G_LOCK (node_mem_chunk); - g_mem_chunk_free (node_mem_chunk, node); - G_UNLOCK (node_mem_chunk); -} diff --git a/gcache.h b/gcache.h deleted file mode 100644 index 74ef5b65..00000000 --- a/gcache.h +++ /dev/null @@ -1,66 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_CACHE_H__ -#define __G_CACHE_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GCache GCache; - -typedef gpointer (*GCacheNewFunc) (gpointer key); -typedef gpointer (*GCacheDupFunc) (gpointer value); -typedef void (*GCacheDestroyFunc) (gpointer value); - -/* Caches - */ -GCache* g_cache_new (GCacheNewFunc value_new_func, - GCacheDestroyFunc value_destroy_func, - GCacheDupFunc key_dup_func, - GCacheDestroyFunc key_destroy_func, - GHashFunc hash_key_func, - GHashFunc hash_value_func, - GEqualFunc key_equal_func); -void g_cache_destroy (GCache *cache); -gpointer g_cache_insert (GCache *cache, - gpointer key); -void g_cache_remove (GCache *cache, - gconstpointer value); -void g_cache_key_foreach (GCache *cache, - GHFunc func, - gpointer user_data); -void g_cache_value_foreach (GCache *cache, - GHFunc func, - gpointer user_data); - -G_END_DECLS - -#endif /* __G_CACHE_H__ */ - - - diff --git a/gcompletion.c b/gcompletion.c deleted file mode 100644 index 1e882dca..00000000 --- a/gcompletion.c +++ /dev/null @@ -1,296 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" -#include - -static void completion_check_cache (GCompletion* cmp, - gchar** new_prefix); - -GCompletion* -g_completion_new (GCompletionFunc func) -{ - GCompletion* gcomp; - - gcomp = g_new (GCompletion, 1); - gcomp->items = NULL; - gcomp->cache = NULL; - gcomp->prefix = NULL; - gcomp->func = func; - gcomp->strncmp_func = strncmp; - - return gcomp; -} - -void -g_completion_add_items (GCompletion* cmp, - GList* items) -{ - GList* it; - - g_return_if_fail (cmp != NULL); - g_return_if_fail (items != NULL); - - /* optimize adding to cache? */ - if (cmp->cache) - { - g_list_free (cmp->cache); - cmp->cache = NULL; - } - - if (cmp->prefix) - { - g_free (cmp->prefix); - cmp->prefix = NULL; - } - - it = items; - while (it) - { - cmp->items = g_list_prepend (cmp->items, it->data); - it = it->next; - } -} - -void -g_completion_remove_items (GCompletion* cmp, - GList* items) -{ - GList* it; - - g_return_if_fail (cmp != NULL); - g_return_if_fail (items != NULL); - - it = items; - while (cmp->items && it) - { - cmp->items = g_list_remove (cmp->items, it->data); - it = it->next; - } - - it = items; - while (cmp->cache && it) - { - cmp->cache = g_list_remove(cmp->cache, it->data); - it = it->next; - } -} - -void -g_completion_clear_items (GCompletion* cmp) -{ - g_return_if_fail (cmp != NULL); - - g_list_free (cmp->items); - cmp->items = NULL; - g_list_free (cmp->cache); - cmp->cache = NULL; - g_free (cmp->prefix); - cmp->prefix = NULL; -} - -static void -completion_check_cache (GCompletion* cmp, - gchar** new_prefix) -{ - register GList* list; - register gsize len; - register gsize i; - register gsize plen; - gchar* postfix; - gchar* s; - - if (!new_prefix) - return; - if (!cmp->cache) - { - *new_prefix = NULL; - return; - } - - len = strlen(cmp->prefix); - list = cmp->cache; - s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; - postfix = s + len; - plen = strlen (postfix); - list = list->next; - - while (list && plen) - { - s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; - s += len; - for (i = 0; i < plen; ++i) - { - if (postfix[i] != s[i]) - break; - } - plen = i; - list = list->next; - } - - *new_prefix = g_new0 (gchar, len + plen + 1); - strncpy (*new_prefix, cmp->prefix, len); - strncpy (*new_prefix + len, postfix, plen); -} - -GList* -g_completion_complete (GCompletion* cmp, - gchar* prefix, - gchar** new_prefix) -{ - gsize plen, len; - gboolean done = FALSE; - GList* list; - - g_return_val_if_fail (cmp != NULL, NULL); - g_return_val_if_fail (prefix != NULL, NULL); - - len = strlen (prefix); - if (cmp->prefix && cmp->cache) - { - plen = strlen (cmp->prefix); - if (plen <= len && ! cmp->strncmp_func (prefix, cmp->prefix, plen)) - { - /* use the cache */ - list = cmp->cache; - while (list) - { - if (cmp->strncmp_func (prefix, - cmp->func ? cmp->func (list->data) : (gchar*) list->data, - len)) - { - list = g_list_remove_link (cmp->cache, list); - if (list != cmp->cache) - cmp->cache = list; - } - else - list = list->next; - } - done = TRUE; - } - } - - if (!done) - { - /* normal code */ - g_list_free (cmp->cache); - cmp->cache = NULL; - list = cmp->items; - while (*prefix && list) - { - if (!cmp->strncmp_func (prefix, - cmp->func ? cmp->func (list->data) : (gchar*) list->data, - len)) - cmp->cache = g_list_prepend (cmp->cache, list->data); - list = list->next; - } - } - if (cmp->prefix) - { - g_free (cmp->prefix); - cmp->prefix = NULL; - } - if (cmp->cache) - cmp->prefix = g_strdup (prefix); - completion_check_cache (cmp, new_prefix); - - return *prefix ? cmp->cache : cmp->items; -} - -void -g_completion_free (GCompletion* cmp) -{ - g_return_if_fail (cmp != NULL); - - g_completion_clear_items (cmp); - g_free (cmp); -} - -void -g_completion_set_compare(GCompletion *cmp, - GCompletionStrncmpFunc strncmp_func) -{ - cmp->strncmp_func = strncmp_func; -} - -#ifdef TEST_COMPLETION -#include -int -main (int argc, - char* argv[]) -{ - FILE *file; - gchar buf[1024]; - GList *list; - GList *result; - GList *tmp; - GCompletion *cmp; - gint i; - gchar *longp = NULL; - - if (argc < 3) - { - g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]); - return 1; - } - - file = fopen (argv[1], "r"); - if (!file) - { - g_warning ("Cannot open %s\n", argv[1]); - return 1; - } - - cmp = g_completion_new (NULL); - list = g_list_alloc (); - while (fgets (buf, 1024, file)) - { - list->data = g_strdup (buf); - g_completion_add_items (cmp, list); - } - fclose (file); - - for (i = 2; i < argc; ++i) - { - printf ("COMPLETING: %s\n", argv[i]); - result = g_completion_complete (cmp, argv[i], &longp); - g_list_foreach (result, (GFunc) printf, NULL); - printf ("LONG MATCH: %s\n", longp); - g_free (longp); - longp = NULL; - } - - g_list_foreach (cmp->items, (GFunc) g_free, NULL); - g_completion_free (cmp); - g_list_free (list); - - return 0; -} -#endif diff --git a/gcompletion.h b/gcompletion.h deleted file mode 100644 index 3aade532..00000000 --- a/gcompletion.h +++ /dev/null @@ -1,71 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_COMPLETION_H__ -#define __G_COMPLETION_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GCompletion GCompletion; - -typedef gchar* (*GCompletionFunc) (gpointer); - -/* GCompletion - */ - -typedef gint (*GCompletionStrncmpFunc) (const gchar *s1, - const gchar *s2, - gsize n); - -struct _GCompletion -{ - GList* items; - GCompletionFunc func; - - gchar* prefix; - GList* cache; - GCompletionStrncmpFunc strncmp_func; -}; - -GCompletion* g_completion_new (GCompletionFunc func); -void g_completion_add_items (GCompletion* cmp, - GList* items); -void g_completion_remove_items (GCompletion* cmp, - GList* items); -void g_completion_clear_items (GCompletion* cmp); -GList* g_completion_complete (GCompletion* cmp, - gchar* prefix, - gchar** new_prefix); -void g_completion_set_compare (GCompletion *cmp, - GCompletionStrncmpFunc strncmp_func); -void g_completion_free (GCompletion* cmp); - -G_END_DECLS - -#endif /* __G_COMPLETION_H__ */ - diff --git a/gconvert.c b/gconvert.c deleted file mode 100644 index 2a4cbebd..00000000 --- a/gconvert.c +++ /dev/null @@ -1,916 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * - * gconvert.c: Convert between character sets using iconv - * Copyright Red Hat Inc., 2000 - * Authors: Havoc Pennington , Owen Taylor -#include -#include -#include - -#include "glib.h" -#include "config.h" - -#ifdef G_PLATFORM_WIN32 -#define STRICT -#include -#undef STRICT -#endif - -#include "glibintl.h" - -GQuark -g_convert_error_quark() -{ - static GQuark quark; - if (!quark) - quark = g_quark_from_static_string ("g_convert_error"); - - return quark; -} - -#if defined(USE_LIBICONV) && !defined (_LIBICONV_H) -#error libiconv in use but included iconv.h not from libiconv -#endif -#if !defined(USE_LIBICONV) && defined (_LIBICONV_H) -#error libiconv not in use but included iconv.h is from libiconv -#endif - -/** - * g_iconv_open: - * @to_codeset: destination codeset - * @from_codeset: source codeset - * - * Same as the standard UNIX routine iconv_open(), but - * may be implemented via libiconv on UNIX flavors that lack - * a native implementation. - * - * GLib provides g_convert() and g_locale_to_utf8() which are likely - * more convenient than the raw iconv wrappers. - * - * Return value: a "conversion descriptor" - **/ -GIConv -g_iconv_open (const gchar *to_codeset, - const gchar *from_codeset) -{ - iconv_t cd = iconv_open (to_codeset, from_codeset); - - return (GIConv)cd; -} - -/** - * g_iconv: - * @converter: conversion descriptor from g_iconv_open() - * @inbuf: bytes to convert - * @inbytes_left: inout parameter, bytes remaining to convert in @inbuf - * @outbuf: converted output bytes - * @outbytes_left: inout parameter, bytes available to fill in @outbuf - * - * Same as the standard UNIX routine iconv(), but - * may be implemented via libiconv on UNIX flavors that lack - * a native implementation. - * - * GLib provides g_convert() and g_locale_to_utf8() which are likely - * more convenient than the raw iconv wrappers. - * - * Return value: count of non-reversible conversions, or -1 on error - **/ -size_t -g_iconv (GIConv converter, - gchar **inbuf, - gsize *inbytes_left, - gchar **outbuf, - gsize *outbytes_left) -{ - iconv_t cd = (iconv_t)converter; - - return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left); -} - -/** - * g_iconv_close: - * @converter: a conversion descriptor from g_iconv_open() - * - * Same as the standard UNIX routine iconv_close(), but - * may be implemented via libiconv on UNIX flavors that lack - * a native implementation. Should be called to clean up - * the conversion descriptor from iconv_open() when - * you are done converting things. - * - * GLib provides g_convert() and g_locale_to_utf8() which are likely - * more convenient than the raw iconv wrappers. - * - * Return value: -1 on error, 0 on success - **/ -gint -g_iconv_close (GIConv converter) -{ - iconv_t cd = (iconv_t)converter; - - return iconv_close (cd); -} - -static GIConv -open_converter (const gchar *to_codeset, - const gchar *from_codeset, - GError **error) -{ - GIConv cd = g_iconv_open (to_codeset, from_codeset); - - if (cd == (iconv_t) -1) - { - /* Something went wrong. */ - if (errno == EINVAL) - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, - _("Conversion from character set `%s' to `%s' is not supported"), - from_codeset, to_codeset); - else - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, - _("Could not open converter from `%s' to `%s': %s"), - from_codeset, to_codeset, strerror (errno)); - } - - return cd; - -} - -/** - * g_convert: - * @str: the string to convert - * @len: the length of the string - * @to_codeset: name of character set into which to convert @str - * @from_codeset: character set of @str. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. If the error - * G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value - * stored will the byte fofset after the last valid - * input sequence. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Convert a string from one character set to another. - * - * Return value: If the conversion was successful, a newly allocated - * NUL-terminated string, which must be freed with - * g_free. Otherwise %NULL and @error will be set. - **/ -gchar* -g_convert (const gchar *str, - gssize len, - const gchar *to_codeset, - const gchar *from_codeset, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ - gchar *dest; - gchar *outp; - const gchar *p; - gsize inbytes_remaining; - gsize outbytes_remaining; - gsize err; - GIConv cd; - gsize outbuf_size; - gboolean have_error = FALSE; - - g_return_val_if_fail (str != NULL, NULL); - g_return_val_if_fail (to_codeset != NULL, NULL); - g_return_val_if_fail (from_codeset != NULL, NULL); - - cd = open_converter (to_codeset, from_codeset, error); - - if (cd == (GIConv) -1) - { - if (bytes_read) - *bytes_read = 0; - - if (bytes_written) - *bytes_written = 0; - - return NULL; - } - - if (len < 0) - len = strlen (str); - - p = str; - inbytes_remaining = len; - outbuf_size = len + 1; /* + 1 for nul in case len == 1 */ - - outbytes_remaining = outbuf_size - 1; /* -1 for nul */ - outp = dest = g_malloc (outbuf_size); - - again: - - err = g_iconv (cd, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining); - - if (err == (size_t) -1) - { - switch (errno) - { - case EINVAL: - /* Incomplete text, do not report an error */ - break; - case E2BIG: - { - size_t used = outp - dest; - - outbuf_size *= 2; - dest = g_realloc (dest, outbuf_size); - - outp = dest + used; - outbytes_remaining = outbuf_size - used - 1; /* -1 for nul */ - - goto again; - } - case EILSEQ: - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid byte sequence in conversion input")); - have_error = TRUE; - break; - default: - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, - _("Error during conversion: %s"), - strerror (errno)); - have_error = TRUE; - break; - } - } - - *outp = '\0'; - - g_iconv_close (cd); - - if (bytes_read) - *bytes_read = p - str; - else - { - if ((p - str) != len) - { - if (!have_error) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - _("Partial character sequence at end of input")); - have_error = TRUE; - } - } - } - - if (bytes_written) - *bytes_written = outp - dest; /* Doesn't include '\0' */ - - if (have_error) - { - g_free (dest); - return NULL; - } - else - return dest; -} - -/** - * g_convert_with_fallback: - * @str: the string to convert - * @len: the length of the string - * @to_codeset: name of character set into which to convert @str - * @from_codeset: character set of @str. - * @fallback: UTF-8 string to use in place of character not - * present in the target encoding. (This must be - * in the target encoding), if %NULL, characters - * not in the target encoding will be represented - * as Unicode escapes \x{XXXX} or \x{XXXXXX}. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Convert a string from one character set to another, possibly - * including fallback sequences for characters not representable - * in the output. Note that it is not guaranteed that the specification - * for the fallback sequences in @fallback will be honored. Some - * systems may do a approximate conversion from @from_codeset - * to @to_codeset in their iconv() functions, in which case GLib - * will simply return that approximate conversion. - * - * Return value: If the conversion was successful, a newly allocated - * NUL-terminated string, which must be freed with - * g_free. Otherwise %NULL and @error will be set. - **/ -gchar* -g_convert_with_fallback (const gchar *str, - gssize len, - const gchar *to_codeset, - const gchar *from_codeset, - gchar *fallback, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ - gchar *utf8; - gchar *dest; - gchar *outp; - const gchar *insert_str = NULL; - const gchar *p; - gsize inbytes_remaining; - const gchar *save_p = NULL; - gsize save_inbytes = 0; - gsize outbytes_remaining; - gsize err; - GIConv cd; - gsize outbuf_size; - gboolean have_error = FALSE; - gboolean done = FALSE; - - GError *local_error = NULL; - - g_return_val_if_fail (str != NULL, NULL); - g_return_val_if_fail (to_codeset != NULL, NULL); - g_return_val_if_fail (from_codeset != NULL, NULL); - - if (len < 0) - len = strlen (str); - - /* Try an exact conversion; we only proceed if this fails - * due to an illegal sequence in the input string. - */ - dest = g_convert (str, len, to_codeset, from_codeset, - bytes_read, bytes_written, &local_error); - if (!local_error) - return dest; - - if (!g_error_matches (local_error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) - { - g_propagate_error (error, local_error); - return NULL; - } - else - g_error_free (local_error); - - local_error = NULL; - - /* No go; to proceed, we need a converter from "UTF-8" to - * to_codeset, and the string as UTF-8. - */ - cd = open_converter (to_codeset, "UTF-8", error); - if (cd == (GIConv) -1) - { - if (bytes_read) - *bytes_read = 0; - - if (bytes_written) - *bytes_written = 0; - - return NULL; - } - - utf8 = g_convert (str, len, "UTF-8", from_codeset, - bytes_read, &inbytes_remaining, error); - if (!utf8) - return NULL; - - /* Now the heart of the code. We loop through the UTF-8 string, and - * whenever we hit an offending character, we form fallback, convert - * the fallback to the target codeset, and then go back to - * converting the original string after finishing with the fallback. - * - * The variables save_p and save_inbytes store the input state - * for the original string while we are converting the fallback - */ - p = utf8; - - outbuf_size = len + 1; /* + 1 for nul in case len == 1 */ - outbytes_remaining = outbuf_size - 1; /* -1 for nul */ - outp = dest = g_malloc (outbuf_size); - - while (!done && !have_error) - { - size_t inbytes_tmp = inbytes_remaining; - err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining); - inbytes_remaining = inbytes_tmp; - - if (err == (size_t) -1) - { - switch (errno) - { - case EINVAL: - g_assert_not_reached(); - break; - case E2BIG: - { - size_t used = outp - dest; - - outbuf_size *= 2; - dest = g_realloc (dest, outbuf_size); - - outp = dest + used; - outbytes_remaining = outbuf_size - used - 1; /* -1 for nul */ - - break; - } - case EILSEQ: - if (save_p) - { - /* Error converting fallback string - fatal - */ - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Cannot convert fallback '%s' to codeset '%s'"), - insert_str, to_codeset); - have_error = TRUE; - break; - } - else - { - if (!fallback) - { - gunichar ch = g_utf8_get_char (p); - insert_str = g_strdup_printf ("\\x{%0*X}", - (ch < 0x10000) ? 4 : 6, - ch); - } - else - insert_str = fallback; - - save_p = g_utf8_next_char (p); - save_inbytes = inbytes_remaining - (save_p - p); - p = insert_str; - inbytes_remaining = strlen (p); - } - break; - default: - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, - _("Error during conversion: %s"), - strerror (errno)); - have_error = TRUE; - break; - } - } - else - { - if (save_p) - { - if (!fallback) - g_free ((gchar *)insert_str); - p = save_p; - inbytes_remaining = save_inbytes; - save_p = NULL; - } - else - done = TRUE; - } - } - - /* Cleanup - */ - *outp = '\0'; - - g_iconv_close (cd); - - if (bytes_written) - *bytes_written = outp - str; /* Doesn't include '\0' */ - - g_free (utf8); - - if (have_error) - { - if (save_p && !fallback) - g_free ((gchar *)insert_str); - g_free (dest); - return NULL; - } - else - return dest; -} - -/* - * g_locale_to_utf8 - * - * - */ - -static gchar * -strdup_len (const gchar *string, - gssize len, - gsize *bytes_written, - gsize *bytes_read) - -{ - gsize real_len; - - if (len < 0) - real_len = strlen (string); - else - { - real_len = 0; - - while (real_len < len && string[real_len]) - real_len++; - } - - if (bytes_read) - *bytes_read = real_len; - if (bytes_written) - *bytes_written = real_len; - - return g_strndup (string, real_len); -} - -/** - * g_locale_to_utf8: - * @opsysstring: a string in the encoding of the current locale - * @len: the length of the string, or -1 if the string is - * NULL-terminated. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. If the error - * G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value - * stored will the byte fofset after the last valid - * input sequence. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Converts a string which is in the encoding used for strings by - * the C runtime (usually the same as that used by the operating - * system) in the current locale into a UTF-8 string. - * - * Return value: The converted string, or %NULL on an error. - **/ -gchar * -g_locale_to_utf8 (const gchar *opsysstring, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ -#ifdef G_PLATFORM_WIN32 - - gint i, clen, total_len, wclen, first; - wchar_t *wcs, wc; - gchar *result, *bp; - const wchar_t *wcp; - - if (len == -1) - len = strlen (opsysstring); - - wcs = g_new (wchar_t, len); - wclen = MultiByteToWideChar (CP_ACP, 0, opsysstring, len, wcs, len); - - wcp = wcs; - total_len = 0; - for (i = 0; i < wclen; i++) - { - wc = *wcp++; - - if (wc < 0x80) - total_len += 1; - else if (wc < 0x800) - total_len += 2; - else if (wc < 0x10000) - total_len += 3; - else if (wc < 0x200000) - total_len += 4; - else if (wc < 0x4000000) - total_len += 5; - else - total_len += 6; - } - - result = g_malloc (total_len + 1); - - wcp = wcs; - bp = result; - for (i = 0; i < wclen; i++) - { - wc = *wcp++; - - if (wc < 0x80) - { - first = 0; - clen = 1; - } - else if (wc < 0x800) - { - first = 0xc0; - clen = 2; - } - else if (wc < 0x10000) - { - first = 0xe0; - clen = 3; - } - else if (wc < 0x200000) - { - first = 0xf0; - clen = 4; - } - else if (wc < 0x4000000) - { - first = 0xf8; - clen = 5; - } - else - { - first = 0xfc; - clen = 6; - } - - /* Woo-hoo! */ - switch (clen) - { - case 6: bp[5] = (wc & 0x3f) | 0x80; wc >>= 6; /* Fall through */ - case 5: bp[4] = (wc & 0x3f) | 0x80; wc >>= 6; /* Fall through */ - case 4: bp[3] = (wc & 0x3f) | 0x80; wc >>= 6; /* Fall through */ - case 3: bp[2] = (wc & 0x3f) | 0x80; wc >>= 6; /* Fall through */ - case 2: bp[1] = (wc & 0x3f) | 0x80; wc >>= 6; /* Fall through */ - case 1: bp[0] = wc | first; - } - - bp += clen; - } - *bp = 0; - - g_free (wcs); - - if (bytes_read) - *bytes_read = len; - if (bytes_written) - *bytes_written = total_len; - - return result; - -#else /* !G_PLATFORM_WIN32 */ - - const char *charset; - - if (g_get_charset (&charset)) - return strdup_len (opsysstring, len, bytes_read, bytes_written); - else - return g_convert (opsysstring, len, - "UTF-8", charset, bytes_read, bytes_written, error); - -#endif /* !G_PLATFORM_WIN32 */ -} - -/** - * g_locale_from_utf8: - * @utf8string: a UTF-8 encoded string - * @len: the length of the string, or -1 if the string is - * NULL-terminated. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. If the error - * G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value - * stored will the byte fofset after the last valid - * input sequence. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Converts a string from UTF-8 to the encoding used for strings by - * the C runtime (usually the same as that used by the operating - * system) in the current locale. - * - * Return value: The converted string, or %NULL on an error. - **/ -gchar * -g_locale_from_utf8 (const gchar *utf8string, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ -#ifdef G_PLATFORM_WIN32 - - gint i, mask, clen, mblen; - wchar_t *wcs, *wcp; - gchar *result; - guchar *cp, *end, c; - gint n; - - if (len == -1) - len = strlen (utf8string); - - /* First convert to wide chars */ - cp = (guchar *) utf8string; - end = cp + len; - n = 0; - wcs = g_new (wchar_t, len + 1); - wcp = wcs; - while (cp != end) - { - mask = 0; - c = *cp; - - if (c < 0x80) - { - clen = 1; - mask = 0x7f; - } - else if ((c & 0xe0) == 0xc0) - { - clen = 2; - mask = 0x1f; - } - else if ((c & 0xf0) == 0xe0) - { - clen = 3; - mask = 0x0f; - } - else if ((c & 0xf8) == 0xf0) - { - clen = 4; - mask = 0x07; - } - else if ((c & 0xfc) == 0xf8) - { - clen = 5; - mask = 0x03; - } - else if ((c & 0xfc) == 0xfc) - { - clen = 6; - mask = 0x01; - } - else - { - g_free (wcs); - return NULL; - } - - if (cp + clen > end) - { - g_free (wcs); - return NULL; - } - - *wcp = (cp[0] & mask); - for (i = 1; i < clen; i++) - { - if ((cp[i] & 0xc0) != 0x80) - { - g_free (wcs); - return NULL; - } - *wcp <<= 6; - *wcp |= (cp[i] & 0x3f); - } - - cp += clen; - wcp++; - n++; - } - if (cp != end) - { - g_free (wcs); - return NULL; - } - - /* n is the number of wide chars constructed */ - - /* Convert to a string in the current ANSI codepage */ - - result = g_new (gchar, 3 * n + 1); - mblen = WideCharToMultiByte (CP_ACP, 0, wcs, n, result, 3*n, NULL, NULL); - result[mblen] = 0; - g_free (wcs); - - if (bytes_read) - *bytes_read = len; - if (bytes_written) - *bytes_written = mblen; - - return result; - -#else /* !G_PLATFORM_WIN32 */ - - const gchar *charset; - - if (g_get_charset (&charset)) - return strdup_len (utf8string, len, bytes_read, bytes_written); - else - return g_convert (utf8string, len, - charset, "UTF-8", bytes_read, bytes_written, error); - -#endif /* !G_PLATFORM_WIN32 */ -} - -/** - * g_filename_to_utf8: - * @opsysstring: a string in the encoding for filenames - * @len: the length of the string, or -1 if the string is - * NULL-terminated. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. If the error - * G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value - * stored will the byte fofset after the last valid - * input sequence. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Converts a string which is in the encoding used for filenames - * into a UTF-8 string. - * - * Return value: The converted string, or %NULL on an error. - **/ -gchar* -g_filename_to_utf8 (const gchar *opsysstring, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ -#ifdef G_PLATFORM_WIN32 - return g_locale_to_utf8 (opsysstring, len, - bytes_read, bytes_written, - error); -#else /* !G_PLATFORM_WIN32 */ - if (getenv ("G_BROKEN_FILENAMES")) - return g_locale_to_utf8 (opsysstring, len, - bytes_read, bytes_written, - error); - else - return strdup_len (opsysstring, len, bytes_read, bytes_written); -#endif /* !G_PLATFORM_WIN32 */ -} - -/** - * g_filename_from_utf8: - * @utf8string: a UTF-8 encoded string - * @len: the length of the string, or -1 if the string is - * NULL-terminated. - * @bytes_read: location to store the number of bytes in the - * input string that were successfully converted, or %NULL. - * Even if the conversion was succesful, this may be - * less than len if there were partial characters - * at the end of the input. If the error - * G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value - * stored will the byte fofset after the last valid - * input sequence. - * @bytes_written: the stored in the output buffer (not including the - * terminating nul. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError may occur. - * - * Converts a string from UTF-8 to the encoding used for filenames. - * - * Return value: The converted string, or %NULL on an error. - **/ -gchar* -g_filename_from_utf8 (const gchar *utf8string, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error) -{ -#ifdef G_PLATFORM_WIN32 - return g_locale_from_utf8 (utf8string, len, - bytes_read, bytes_written, - error); -#else /* !G_PLATFORM_WIN32 */ - if (getenv ("G_BROKEN_FILENAMES")) - return g_locale_from_utf8 (utf8string, len, - bytes_read, bytes_written, - error); - else - return strdup_len (utf8string, len, bytes_read, bytes_written); -#endif /* !G_PLATFORM_WIN32 */ -} diff --git a/gconvert.h b/gconvert.h deleted file mode 100644 index 3166bfa0..00000000 --- a/gconvert.h +++ /dev/null @@ -1,106 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_CONVERT_H__ -#define __G_CONVERT_H__ - -#include /* For size_t */ -#include - -G_BEGIN_DECLS - -typedef enum -{ - G_CONVERT_ERROR_NO_CONVERSION, - G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - G_CONVERT_ERROR_FAILED, - G_CONVERT_ERROR_PARTIAL_INPUT -} GConvertError; - -#define G_CONVERT_ERROR g_convert_error_quark() -GQuark g_convert_error_quark (void); - -/* Thin wrappers around iconv - */ -typedef struct _GIConv *GIConv; - -GIConv g_iconv_open (const gchar *to_codeset, - const gchar *from_codeset); -size_t g_iconv (GIConv converter, - gchar **inbuf, - gsize *inbytes_left, - gchar **outbuf, - gsize *outbytes_left); -gint g_iconv_close (GIConv converter); - - -gchar* g_convert (const gchar *str, - gssize len, - const gchar *to_codeset, - const gchar *from_codeset, - gsize *bytes_read, - gsize *bytes_written, - GError **error); -gchar* g_convert_with_fallback (const gchar *str, - gssize len, - const gchar *to_codeset, - const gchar *from_codeset, - gchar *fallback, - gsize *bytes_read, - gsize *bytes_written, - GError **error); - - -/* Convert between libc's idea of strings and UTF-8. - */ -gchar* g_locale_to_utf8 (const gchar *opsysstring, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error); -gchar* g_locale_from_utf8 (const gchar *utf8string, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error); - -/* Convert between the operating system (or C runtime) - * representation of file names and UTF-8. - */ -gchar* g_filename_to_utf8 (const gchar *opsysstring, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error); -gchar* g_filename_from_utf8 (const gchar *utf8string, - gssize len, - gsize *bytes_read, - gsize *bytes_written, - GError **error); - -G_END_DECLS - -#endif /* __G_CONVERT_H__ */ diff --git a/gdataset.c b/gdataset.c deleted file mode 100644 index 7d8d9afd..00000000 --- a/gdataset.c +++ /dev/null @@ -1,631 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * gdataset.c: Generic dataset mechanism, similar to GtkObject data. - * Copyright (C) 1998 Tim Janik - * - * This 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. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe ; FIXME: might still freeze, watch out, not thoroughly - * looked at yet. - */ - -#include -#include "glib.h" - - - -/* --- defines --- */ -#define G_QUARK_BLOCK_SIZE (512) -#define G_DATA_MEM_CHUNK_PREALLOC (128) -#define G_DATA_CACHE_MAX (512) -#define G_DATASET_MEM_CHUNK_PREALLOC (32) - - -/* --- structures --- */ -typedef struct _GDataset GDataset; -struct _GData -{ - GData *next; - GQuark id; - gpointer data; - GDestroyNotify destroy_func; -}; - -struct _GDataset -{ - gconstpointer location; - GData *datalist; -}; - - -/* --- prototypes --- */ -static inline GDataset* g_dataset_lookup (gconstpointer dataset_location); -static inline void g_datalist_clear_i (GData **datalist); -static void g_dataset_destroy_internal (GDataset *dataset); -static inline gpointer g_data_set_internal (GData **datalist, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func, - GDataset *dataset); -static void g_data_initialize (void); -static inline GQuark g_quark_new (gchar *string); - - -/* --- variables --- */ -G_LOCK_DEFINE_STATIC (g_dataset_global); -static GHashTable *g_dataset_location_ht = NULL; -static GDataset *g_dataset_cached = NULL; /* should this be - threadspecific? */ -static GMemChunk *g_dataset_mem_chunk = NULL; -static GMemChunk *g_data_mem_chunk = NULL; -static GData *g_data_cache = NULL; -static guint g_data_cache_length = 0; - -G_LOCK_DEFINE_STATIC (g_quark_global); -static GHashTable *g_quark_ht = NULL; -static gchar **g_quarks = NULL; -static GQuark g_quark_seq_id = 0; - - -/* --- functions --- */ - -/* HOLDS: g_dataset_global_lock */ -static inline void -g_datalist_clear_i (GData **datalist) -{ - register GData *list; - - /* unlink *all* items before walking their destructors - */ - list = *datalist; - *datalist = NULL; - - while (list) - { - register GData *prev; - - prev = list; - list = prev->next; - - if (prev->destroy_func) - { - G_UNLOCK (g_dataset_global); - prev->destroy_func (prev->data); - G_LOCK (g_dataset_global); - } - - if (g_data_cache_length < G_DATA_CACHE_MAX) - { - prev->next = g_data_cache; - g_data_cache = prev; - g_data_cache_length++; - } - else - g_mem_chunk_free (g_data_mem_chunk, prev); - } -} - -void -g_datalist_clear (GData **datalist) -{ - g_return_if_fail (datalist != NULL); - - G_LOCK (g_dataset_global); - if (!g_dataset_location_ht) - g_data_initialize (); - - while (*datalist) - g_datalist_clear_i (datalist); - G_UNLOCK (g_dataset_global); -} - -/* HOLDS: g_dataset_global_lock */ -static inline GDataset* -g_dataset_lookup (gconstpointer dataset_location) -{ - register GDataset *dataset; - - if (g_dataset_cached && g_dataset_cached->location == dataset_location) - return g_dataset_cached; - - dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location); - if (dataset) - g_dataset_cached = dataset; - - return dataset; -} - -/* HOLDS: g_dataset_global_lock */ -static void -g_dataset_destroy_internal (GDataset *dataset) -{ - register gconstpointer dataset_location; - - dataset_location = dataset->location; - while (dataset) - { - if (!dataset->datalist) - { - if (dataset == g_dataset_cached) - g_dataset_cached = NULL; - g_hash_table_remove (g_dataset_location_ht, dataset_location); - g_mem_chunk_free (g_dataset_mem_chunk, dataset); - break; - } - - g_datalist_clear_i (&dataset->datalist); - dataset = g_dataset_lookup (dataset_location); - } -} - -void -g_dataset_destroy (gconstpointer dataset_location) -{ - g_return_if_fail (dataset_location != NULL); - - G_LOCK (g_dataset_global); - if (g_dataset_location_ht) - { - register GDataset *dataset; - - dataset = g_dataset_lookup (dataset_location); - if (dataset) - g_dataset_destroy_internal (dataset); - } - G_UNLOCK (g_dataset_global); -} - -/* HOLDS: g_dataset_global_lock */ -static inline gpointer -g_data_set_internal (GData **datalist, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func, - GDataset *dataset) -{ - register GData *list; - - list = *datalist; - if (!data) - { - register GData *prev; - - prev = NULL; - while (list) - { - if (list->id == key_id) - { - gpointer ret_data = NULL; - - if (prev) - prev->next = list->next; - else - { - *datalist = list->next; - - /* the dataset destruction *must* be done - * prior to invokation of the data destroy function - */ - if (!*datalist && dataset) - g_dataset_destroy_internal (dataset); - } - - /* the GData struct *must* already be unlinked - * when invoking the destroy function. - * we use (data==NULL && destroy_func!=NULL) as - * a special hint combination to "steal" - * data without destroy notification - */ - if (list->destroy_func && !destroy_func) - { - G_UNLOCK (g_dataset_global); - list->destroy_func (list->data); - G_LOCK (g_dataset_global); - } - else - ret_data = list->data; - - if (g_data_cache_length < G_DATA_CACHE_MAX) - { - list->next = g_data_cache; - g_data_cache = list; - g_data_cache_length++; - } - else - g_mem_chunk_free (g_data_mem_chunk, list); - - return ret_data; - } - - prev = list; - list = list->next; - } - } - else - { - while (list) - { - if (list->id == key_id) - { - if (!list->destroy_func) - { - list->data = data; - list->destroy_func = destroy_func; - } - else - { - register GDestroyNotify dfunc; - register gpointer ddata; - - dfunc = list->destroy_func; - ddata = list->data; - list->data = data; - list->destroy_func = destroy_func; - - /* we need to have updated all structures prior to - * invokation of the destroy function - */ - G_UNLOCK (g_dataset_global); - dfunc (ddata); - G_LOCK (g_dataset_global); - } - - return NULL; - } - - list = list->next; - } - - if (g_data_cache) - { - list = g_data_cache; - g_data_cache = list->next; - g_data_cache_length--; - } - else - list = g_chunk_new (GData, g_data_mem_chunk); - list->next = *datalist; - list->id = key_id; - list->data = data; - list->destroy_func = destroy_func; - *datalist = list; - } - - return NULL; -} - -void -g_dataset_id_set_data_full (gconstpointer dataset_location, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func) -{ - register GDataset *dataset; - - g_return_if_fail (dataset_location != NULL); - if (!data) - g_return_if_fail (destroy_func == NULL); - if (!key_id) - { - if (data) - g_return_if_fail (key_id > 0); - else - return; - } - - G_LOCK (g_dataset_global); - if (!g_dataset_location_ht) - g_data_initialize (); - - dataset = g_dataset_lookup (dataset_location); - if (!dataset) - { - dataset = g_chunk_new (GDataset, g_dataset_mem_chunk); - dataset->location = dataset_location; - g_datalist_init (&dataset->datalist); - g_hash_table_insert (g_dataset_location_ht, - (gpointer) dataset->location, - dataset); - } - - g_data_set_internal (&dataset->datalist, key_id, data, destroy_func, dataset); - G_UNLOCK (g_dataset_global); -} - -void -g_datalist_id_set_data_full (GData **datalist, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func) -{ - g_return_if_fail (datalist != NULL); - if (!data) - g_return_if_fail (destroy_func == NULL); - if (!key_id) - { - if (data) - g_return_if_fail (key_id > 0); - else - return; - } - - G_LOCK (g_dataset_global); - if (!g_dataset_location_ht) - g_data_initialize (); - - g_data_set_internal (datalist, key_id, data, destroy_func, NULL); - G_UNLOCK (g_dataset_global); -} - -gpointer -g_dataset_id_remove_no_notify (gconstpointer dataset_location, - GQuark key_id) -{ - gpointer ret_data = NULL; - - g_return_val_if_fail (dataset_location != NULL, NULL); - - G_LOCK (g_dataset_global); - if (key_id && g_dataset_location_ht) - { - GDataset *dataset; - - dataset = g_dataset_lookup (dataset_location); - if (dataset) - ret_data = g_data_set_internal (&dataset->datalist, key_id, NULL, (GDestroyNotify) 42, dataset); - } - G_UNLOCK (g_dataset_global); - - return ret_data; -} - -gpointer -g_datalist_id_remove_no_notify (GData **datalist, - GQuark key_id) -{ - gpointer ret_data = NULL; - - g_return_val_if_fail (datalist != NULL, NULL); - - G_LOCK (g_dataset_global); - if (key_id && g_dataset_location_ht) - ret_data = g_data_set_internal (datalist, key_id, NULL, (GDestroyNotify) 42, NULL); - G_UNLOCK (g_dataset_global); - - return ret_data; -} - -gpointer -g_dataset_id_get_data (gconstpointer dataset_location, - GQuark key_id) -{ - g_return_val_if_fail (dataset_location != NULL, NULL); - - G_LOCK (g_dataset_global); - if (key_id && g_dataset_location_ht) - { - register GDataset *dataset; - - dataset = g_dataset_lookup (dataset_location); - if (dataset) - { - register GData *list; - - for (list = dataset->datalist; list; list = list->next) - if (list->id == key_id) - { - G_UNLOCK (g_dataset_global); - return list->data; - } - } - } - G_UNLOCK (g_dataset_global); - - return NULL; -} - -gpointer -g_datalist_id_get_data (GData **datalist, - GQuark key_id) -{ - g_return_val_if_fail (datalist != NULL, NULL); - - if (key_id) - { - register GData *list; - - for (list = *datalist; list; list = list->next) - if (list->id == key_id) - return list->data; - } - - return NULL; -} - -void -g_dataset_foreach (gconstpointer dataset_location, - GDataForeachFunc func, - gpointer user_data) -{ - register GDataset *dataset; - - g_return_if_fail (dataset_location != NULL); - g_return_if_fail (func != NULL); - - G_LOCK (g_dataset_global); - if (g_dataset_location_ht) - { - dataset = g_dataset_lookup (dataset_location); - G_UNLOCK (g_dataset_global); - if (dataset) - { - register GData *list, *next; - - for (list = dataset->datalist; list; list = next) - { - next = list->next; - func (list->id, list->data, user_data); - } - } - } - else - { - G_UNLOCK (g_dataset_global); - } -} - -void -g_datalist_foreach (GData **datalist, - GDataForeachFunc func, - gpointer user_data) -{ - register GData *list, *next; - - g_return_if_fail (datalist != NULL); - g_return_if_fail (func != NULL); - - for (list = *datalist; list; list = next) - { - next = list->next; - func (list->id, list->data, user_data); - } -} - -void -g_datalist_init (GData **datalist) -{ - g_return_if_fail (datalist != NULL); - - *datalist = NULL; -} - -/* HOLDS: g_dataset_global_lock */ -static void -g_data_initialize (void) -{ - g_return_if_fail (g_dataset_location_ht == NULL); - - g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL); - g_dataset_cached = NULL; - g_dataset_mem_chunk = - g_mem_chunk_new ("GDataset MemChunk", - sizeof (GDataset), - sizeof (GDataset) * G_DATASET_MEM_CHUNK_PREALLOC, - G_ALLOC_AND_FREE); - g_data_mem_chunk = - g_mem_chunk_new ("GData MemChunk", - sizeof (GData), - sizeof (GData) * G_DATA_MEM_CHUNK_PREALLOC, - G_ALLOC_AND_FREE); -} - -GQuark -g_quark_try_string (const gchar *string) -{ - GQuark quark = 0; - g_return_val_if_fail (string != NULL, 0); - - G_LOCK (g_quark_global); - if (g_quark_ht) - quark = GPOINTER_TO_UINT (g_hash_table_lookup (g_quark_ht, string)); - G_UNLOCK (g_quark_global); - - return quark; -} - -GQuark -g_quark_from_string (const gchar *string) -{ - GQuark quark; - - g_return_val_if_fail (string != NULL, 0); - - G_LOCK (g_quark_global); - if (g_quark_ht) - quark = (gulong) g_hash_table_lookup (g_quark_ht, string); - else - { - g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal); - quark = 0; - } - - if (!quark) - quark = g_quark_new (g_strdup (string)); - G_UNLOCK (g_quark_global); - - return quark; -} - -GQuark -g_quark_from_static_string (const gchar *string) -{ - GQuark quark; - - g_return_val_if_fail (string != NULL, 0); - - G_LOCK (g_quark_global); - if (g_quark_ht) - quark = (gulong) g_hash_table_lookup (g_quark_ht, string); - else - { - g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal); - quark = 0; - } - - if (!quark) - quark = g_quark_new ((gchar*) string); - G_UNLOCK (g_quark_global); - - return quark; -} - -G_CONST_RETURN gchar* -g_quark_to_string (GQuark quark) -{ - gchar* result = NULL; - G_LOCK (g_quark_global); - if (quark > 0 && quark <= g_quark_seq_id) - result = g_quarks[quark - 1]; - G_UNLOCK (g_quark_global); - - return result; -} - -/* HOLDS: g_quark_global_lock */ -static inline GQuark -g_quark_new (gchar *string) -{ - GQuark quark; - - if (g_quark_seq_id % G_QUARK_BLOCK_SIZE == 0) - g_quarks = g_renew (gchar*, g_quarks, g_quark_seq_id + G_QUARK_BLOCK_SIZE); - - g_quarks[g_quark_seq_id] = string; - g_quark_seq_id++; - quark = g_quark_seq_id; - g_hash_table_insert (g_quark_ht, string, GUINT_TO_POINTER (quark)); - - return quark; -} diff --git a/gdataset.h b/gdataset.h deleted file mode 100644 index f9d15b30..00000000 --- a/gdataset.h +++ /dev/null @@ -1,106 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_DATASET_H__ -#define __G_DATASET_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GData GData; - -typedef void (*GDataForeachFunc) (GQuark key_id, - gpointer data, - gpointer user_data); - -/* Keyed Data List - */ -void g_datalist_init (GData **datalist); -void g_datalist_clear (GData **datalist); -gpointer g_datalist_id_get_data (GData **datalist, - GQuark key_id); -void g_datalist_id_set_data_full (GData **datalist, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func); -gpointer g_datalist_id_remove_no_notify (GData **datalist, - GQuark key_id); -void g_datalist_foreach (GData **datalist, - GDataForeachFunc func, - gpointer user_data); -#define g_datalist_id_set_data(dl, q, d) \ - g_datalist_id_set_data_full ((dl), (q), (d), NULL) -#define g_datalist_id_remove_data(dl, q) \ - g_datalist_id_set_data ((dl), (q), NULL) -#define g_datalist_get_data(dl, k) \ - (g_datalist_id_get_data ((dl), g_quark_try_string (k))) -#define g_datalist_set_data_full(dl, k, d, f) \ - g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f)) -#define g_datalist_remove_no_notify(dl, k) \ - g_datalist_id_remove_no_notify ((dl), g_quark_try_string (k)) -#define g_datalist_set_data(dl, k, d) \ - g_datalist_set_data_full ((dl), (k), (d), NULL) -#define g_datalist_remove_data(dl, k) \ - g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL) - - -/* Location Associated Keyed Data - */ -void g_dataset_destroy (gconstpointer dataset_location); -gpointer g_dataset_id_get_data (gconstpointer dataset_location, - GQuark key_id); -void g_dataset_id_set_data_full (gconstpointer dataset_location, - GQuark key_id, - gpointer data, - GDestroyNotify destroy_func); -gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location, - GQuark key_id); -void g_dataset_foreach (gconstpointer dataset_location, - GDataForeachFunc func, - gpointer user_data); -#define g_dataset_id_set_data(l, k, d) \ - g_dataset_id_set_data_full ((l), (k), (d), NULL) -#define g_dataset_id_remove_data(l, k) \ - g_dataset_id_set_data ((l), (k), NULL) -#define g_dataset_get_data(l, k) \ - (g_dataset_id_get_data ((l), g_quark_try_string (k))) -#define g_dataset_set_data_full(l, k, d, f) \ - g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f)) -#define g_dataset_remove_no_notify(l, k) \ - g_dataset_id_remove_no_notify ((l), g_quark_try_string (k)) -#define g_dataset_set_data(l, k, d) \ - g_dataset_set_data_full ((l), (k), (d), NULL) -#define g_dataset_remove_data(l, k) \ - g_dataset_id_set_data ((l), g_quark_try_string (k), NULL) - -G_END_DECLS - -#endif /* __G_DATASET_H__ */ - - - - diff --git a/gdate.c b/gdate.c deleted file mode 100644 index 607e42a3..00000000 --- a/gdate.c +++ /dev/null @@ -1,1353 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#define DEBUG_MSG(x) /* */ -#ifdef G_ENABLE_DEBUG -/* #define DEBUG_MSG(args) g_message args ; */ -#endif - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - -#include -#include -#include -#include -#include - -GDate* -g_date_new () -{ - GDate *d = g_new0 (GDate, 1); /* happily, 0 is the invalid flag for everything. */ - - return d; -} - -GDate* -g_date_new_dmy (GDateDay day, GDateMonth m, GDateYear y) -{ - GDate *d; - g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL); - - d = g_new (GDate, 1); - - d->julian = FALSE; - d->dmy = TRUE; - - d->month = m; - d->day = day; - d->year = y; - - g_assert (g_date_valid (d)); - - return d; -} - -GDate* -g_date_new_julian (guint32 j) -{ - GDate *d; - g_return_val_if_fail (g_date_valid_julian (j), NULL); - - d = g_new (GDate, 1); - - d->julian = TRUE; - d->dmy = FALSE; - - d->julian_days = j; - - g_assert (g_date_valid (d)); - - return d; -} - -void -g_date_free (GDate *d) -{ - g_return_if_fail (d != NULL); - - g_free (d); -} - -gboolean -g_date_valid (const GDate *d) -{ - g_return_val_if_fail (d != NULL, FALSE); - - return (d->julian || d->dmy); -} - -static const guint8 days_in_months[2][13] = -{ /* error, jan feb mar apr may jun jul aug sep oct nov dec */ - { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } /* leap year */ -}; - -static const guint16 days_in_year[2][14] = -{ /* 0, jan feb mar apr may jun jul aug sep oct nov dec */ - { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } -}; - -gboolean -g_date_valid_month (GDateMonth m) -{ - return ( (m > G_DATE_BAD_MONTH) && (m < 13) ); -} - -gboolean -g_date_valid_year (GDateYear y) -{ - return ( y > G_DATE_BAD_YEAR ); -} - -gboolean -g_date_valid_day (GDateDay d) -{ - return ( (d > G_DATE_BAD_DAY) && (d < 32) ); -} - -gboolean -g_date_valid_weekday (GDateWeekday w) -{ - return ( (w > G_DATE_BAD_WEEKDAY) && (w < 8) ); -} - -gboolean -g_date_valid_julian (guint32 j) -{ - return (j > G_DATE_BAD_JULIAN); -} - -gboolean -g_date_valid_dmy (GDateDay d, - GDateMonth m, - GDateYear y) -{ - return ( (m > G_DATE_BAD_MONTH) && - (m < 13) && - (d > G_DATE_BAD_DAY) && - (y > G_DATE_BAD_YEAR) && /* must check before using g_date_is_leap_year */ - (d <= (g_date_is_leap_year (y) ? - days_in_months[1][m] : days_in_months[0][m])) ); -} - - -/* "Julian days" just means an absolute number of days, where Day 1 == - * Jan 1, Year 1 - */ -static void -g_date_update_julian (const GDate *const_d) -{ - GDate *d = (GDate *) const_d; - GDateYear year; - gint index; - - g_return_if_fail (d != NULL); - g_return_if_fail (d->dmy); - g_return_if_fail (!d->julian); - g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year)); - - /* What we actually do is: multiply years * 365 days in the year, - * add the number of years divided by 4, subtract the number of - * years divided by 100 and add the number of years divided by 400, - * which accounts for leap year stuff. Code from Steffen Beyer's - * DateCalc. - */ - - year = d->year - 1; /* we know d->year > 0 since it's valid */ - - d->julian_days = year * 365U; - d->julian_days += (year >>= 2); /* divide by 4 and add */ - d->julian_days -= (year /= 25); /* divides original # years by 100 */ - d->julian_days += year >> 2; /* divides by 4, which divides original by 400 */ - - index = g_date_is_leap_year (d->year) ? 1 : 0; - - d->julian_days += days_in_year[index][d->month] + d->day; - - g_return_if_fail (g_date_valid_julian (d->julian_days)); - - d->julian = TRUE; -} - -static void -g_date_update_dmy (const GDate *const_d) -{ - GDate *d = (GDate *) const_d; - GDateYear y; - GDateMonth m; - GDateDay day; - - guint32 A, B, C, D, E, M; - - g_return_if_fail (d != NULL); - g_return_if_fail (d->julian); - g_return_if_fail (!d->dmy); - g_return_if_fail (g_date_valid_julian (d->julian_days)); - - /* Formula taken from the Calendar FAQ; the formula was for the - * Julian Period which starts on 1 January 4713 BC, so we add - * 1,721,425 to the number of days before doing the formula. - * - * I'm sure this can be simplified for our 1 January 1 AD period - * start, but I can't figure out how to unpack the formula. - */ - - A = d->julian_days + 1721425 + 32045; - B = ( 4 *(A + 36524) )/ 146097 - 1; - C = A - (146097 * B)/4; - D = ( 4 * (C + 365) ) / 1461 - 1; - E = C - ((1461*D) / 4); - M = (5 * (E - 1) + 2)/153; - - m = M + 3 - (12*(M/10)); - day = E - (153*M + 2)/5; - y = 100 * B + D - 4800 + (M/10); - -#ifdef G_ENABLE_DEBUG - if (!g_date_valid_dmy (day, m, y)) - { - g_warning ("\nOOPS julian: %u computed dmy: %u %u %u\n", - d->julian_days, day, m, y); - } -#endif - - d->month = m; - d->day = day; - d->year = y; - - d->dmy = TRUE; -} - -GDateWeekday -g_date_get_weekday (const GDate *d) -{ - g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY); - g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); - - if (!d->julian) - { - g_date_update_julian (d); - } - g_return_val_if_fail (d->julian, G_DATE_BAD_WEEKDAY); - - return ((d->julian_days - 1) % 7) + 1; -} - -GDateMonth -g_date_get_month (const GDate *d) -{ - g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH); - g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, G_DATE_BAD_MONTH); - - return d->month; -} - -GDateYear -g_date_get_year (const GDate *d) -{ - g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR); - g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, G_DATE_BAD_YEAR); - - return d->year; -} - -GDateDay -g_date_get_day (const GDate *d) -{ - g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY); - g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, G_DATE_BAD_DAY); - - return d->day; -} - -guint32 -g_date_get_julian (const GDate *d) -{ - g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN); - g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); - - if (!d->julian) - { - g_date_update_julian (d); - } - g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN); - - return d->julian_days; -} - -guint -g_date_get_day_of_year (const GDate *d) -{ - gint index; - - g_return_val_if_fail (d != NULL, 0); - g_return_val_if_fail (g_date_valid (d), 0); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, 0); - - index = g_date_is_leap_year (d->year) ? 1 : 0; - - return (days_in_year[index][d->month] + d->day); -} - -guint -g_date_get_monday_week_of_year (const GDate *d) -{ - GDateWeekday wd; - guint day; - GDate first; - - g_return_val_if_fail (d != NULL, 0); - g_return_val_if_fail (g_date_valid (d), 0); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, 0); - - g_date_clear (&first, 1); - - g_date_set_dmy (&first, 1, 1, d->year); - - wd = g_date_get_weekday (&first) - 1; /* make Monday day 0 */ - day = g_date_get_day_of_year (d) - 1; - - return ((day + wd)/7U + (wd == 0 ? 1 : 0)); -} - -guint -g_date_get_sunday_week_of_year (const GDate *d) -{ - GDateWeekday wd; - guint day; - GDate first; - - g_return_val_if_fail (d != NULL, 0); - g_return_val_if_fail (g_date_valid (d), 0); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, 0); - - g_date_clear (&first, 1); - - g_date_set_dmy (&first, 1, 1, d->year); - - wd = g_date_get_weekday (&first); - if (wd == 7) wd = 0; /* make Sunday day 0 */ - day = g_date_get_day_of_year (d) - 1; - - return ((day + wd)/7U + (wd == 0 ? 1 : 0)); -} - -gint -g_date_days_between (const GDate *d1, - const GDate *d2) -{ - g_return_val_if_fail (d1 != NULL, 0); - g_return_val_if_fail (d2 != NULL, 0); - - g_return_val_if_fail (g_date_valid (d1), 0); - g_return_val_if_fail (g_date_valid (d2), 0); - - return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1); -} - -void -g_date_clear (GDate *d, guint ndates) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (ndates != 0); - - memset (d, 0x0, ndates*sizeof (GDate)); -} - -G_LOCK_DEFINE_STATIC (g_date_global); - -/* These are for the parser, output to the user should use * - * g_date_strftime () - this creates more never-freed memory to annoy - * all those memory debugger users. :-) - */ - -static gchar *long_month_names[13] = -{ - "Error", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -}; - -static gchar *short_month_names[13] = -{ - "Error", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -}; - -/* This tells us if we need to update the parse info */ -static gchar *current_locale = NULL; - -/* order of these in the current locale */ -static GDateDMY dmy_order[3] = -{ - G_DATE_DAY, G_DATE_MONTH, G_DATE_YEAR -}; - -/* Where to chop two-digit years: i.e., for the 1930 default, numbers - * 29 and below are counted as in the year 2000, numbers 30 and above - * are counted as in the year 1900. - */ - -static GDateYear twodigit_start_year = 1930; - -/* It is impossible to enter a year between 1 AD and 99 AD with this - * in effect. - */ -static gboolean using_twodigit_years = FALSE; - -struct _GDateParseTokens { - gint num_ints; - gint n[3]; - guint month; -}; - -typedef struct _GDateParseTokens GDateParseTokens; - -#define NUM_LEN 10 - -/* HOLDS: g_date_global_lock */ -static void -g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt) -{ - gchar num[4][NUM_LEN+1]; - gint i; - const guchar *s; - - /* We count 4, but store 3; so we can give an error - * if there are 4. - */ - num[0][0] = num[1][0] = num[2][0] = num[3][0] = '\0'; - - s = (const guchar *) str; - pt->num_ints = 0; - while (*s && pt->num_ints < 4) - { - - i = 0; - while (*s && isdigit (*s) && i <= NUM_LEN) - { - num[pt->num_ints][i] = *s; - ++s; - ++i; - } - - if (i > 0) - { - num[pt->num_ints][i] = '\0'; - ++(pt->num_ints); - } - - if (*s == '\0') break; - - ++s; - } - - pt->n[0] = pt->num_ints > 0 ? atoi (num[0]) : 0; - pt->n[1] = pt->num_ints > 1 ? atoi (num[1]) : 0; - pt->n[2] = pt->num_ints > 2 ? atoi (num[2]) : 0; - - pt->month = G_DATE_BAD_MONTH; - - if (pt->num_ints < 3) - { - gchar lcstr[128]; - - strncpy (lcstr, str, 127); - g_strdown (lcstr); - - while (i < 13) - { - if (long_month_names[i] != NULL) - { - const gchar *found = strstr (lcstr, long_month_names[i]); - - if (found != NULL) - { - pt->month = i; - return; - } - } - - if (short_month_names[i] != NULL) - { - const gchar *found = strstr (lcstr, short_month_names[i]); - - if (found != NULL) - { - pt->month = i; - return; - } - } - - ++i; - } - } -} - -/* HOLDS: g_date_global_lock */ -static void -g_date_prepare_to_parse (const gchar *str, GDateParseTokens *pt) -{ - const gchar *locale = setlocale (LC_TIME, NULL); - gboolean recompute_localeinfo = FALSE; - GDate d; - - g_return_if_fail (locale != NULL); /* should not happen */ - - g_date_clear (&d, 1); /* clear for scratch use */ - - if ( (current_locale == NULL) || (strcmp (locale, current_locale) != 0) ) - { - recompute_localeinfo = TRUE; /* Uh, there used to be a reason for the temporary */ - } - - if (recompute_localeinfo) - { - int i = 1; - GDateParseTokens testpt; - gchar buf[128]; - - g_free (current_locale); /* still works if current_locale == NULL */ - - current_locale = g_strdup (locale); - - while (i < 13) - { - g_date_set_dmy (&d, 1, i, 1); - - g_return_if_fail (g_date_valid (&d)); - - g_date_strftime (buf, 127, "%b", &d); - g_free (short_month_names[i]); - g_strdown (buf); - short_month_names[i] = g_strdup (buf); - - - - g_date_strftime (buf, 127, "%B", &d); - g_free (long_month_names[i]); - g_strdown (buf); - long_month_names[i] = g_strdup (buf); - - ++i; - } - - /* Determine DMY order */ - - /* had to pick a random day - don't change this, some strftimes - * are broken on some days, and this one is good so far. */ - g_date_set_dmy (&d, 4, 7, 1976); - - g_date_strftime (buf, 127, "%x", &d); - - g_date_fill_parse_tokens (buf, &testpt); - - i = 0; - while (i < testpt.num_ints) - { - switch (testpt.n[i]) - { - case 7: - dmy_order[i] = G_DATE_MONTH; - break; - case 4: - dmy_order[i] = G_DATE_DAY; - break; - case 76: - using_twodigit_years = TRUE; /* FALL THRU */ - case 1976: - dmy_order[i] = G_DATE_YEAR; - break; - default: - /* leave it unchanged */ - break; - } - ++i; - } - -#ifdef G_ENABLE_DEBUG - DEBUG_MSG (("**GDate prepared a new set of locale-specific parse rules.")); - i = 1; - while (i < 13) - { - DEBUG_MSG ((" %s %s", long_month_names[i], short_month_names[i])); - ++i; - } - if (using_twodigit_years) - DEBUG_MSG (("**Using twodigit years with cutoff year: %u", twodigit_start_year)); - { - gchar *strings[3]; - i = 0; - while (i < 3) - { - switch (dmy_order[i]) - { - case G_DATE_MONTH: - strings[i] = "Month"; - break; - case G_DATE_YEAR: - strings[i] = "Year"; - break; - case G_DATE_DAY: - strings[i] = "Day"; - break; - default: - strings[i] = NULL; - break; - } - ++i; - } - DEBUG_MSG (("**Order: %s, %s, %s", strings[0], strings[1], strings[2])); - DEBUG_MSG (("**Sample date in this locale: `%s'", buf)); - } -#endif - } - - g_date_fill_parse_tokens (str, pt); -} - -void -g_date_set_parse (GDate *d, - const gchar *str) -{ - GDateParseTokens pt; - guint m = G_DATE_BAD_MONTH, day = G_DATE_BAD_DAY, y = G_DATE_BAD_YEAR; - - g_return_if_fail (d != NULL); - - /* set invalid */ - g_date_clear (d, 1); - - G_LOCK (g_date_global); - - g_date_prepare_to_parse (str, &pt); - - DEBUG_MSG (("Found %d ints, `%d' `%d' `%d' and written out month %d", - pt.num_ints, pt.n[0], pt.n[1], pt.n[2], pt.month)); - - - if (pt.num_ints == 4) - { - G_UNLOCK (g_date_global); - return; /* presumably a typo; bail out. */ - } - - if (pt.num_ints > 1) - { - int i = 0; - int j = 0; - - g_assert (pt.num_ints < 4); /* i.e., it is 2 or 3 */ - - while (i < pt.num_ints && j < 3) - { - switch (dmy_order[j]) - { - case G_DATE_MONTH: - { - if (pt.num_ints == 2 && pt.month != G_DATE_BAD_MONTH) - { - m = pt.month; - ++j; /* skip months, but don't skip this number */ - continue; - } - else - m = pt.n[i]; - } - break; - case G_DATE_DAY: - { - if (pt.num_ints == 2 && pt.month == G_DATE_BAD_MONTH) - { - day = 1; - ++j; /* skip days, since we may have month/year */ - continue; - } - day = pt.n[i]; - } - break; - case G_DATE_YEAR: - { - y = pt.n[i]; - - if (using_twodigit_years && y < 100) - { - guint two = twodigit_start_year % 100; - guint century = (twodigit_start_year / 100) * 100; - - if (y < two) - century += 100; - - y += century; - } - } - break; - default: - break; - } - - ++i; - ++j; - } - - - if (pt.num_ints == 3 && !g_date_valid_dmy (day, m, y)) - { - /* Try YYYY MM DD */ - y = pt.n[0]; - m = pt.n[1]; - day = pt.n[2]; - - if (using_twodigit_years && y < 100) - y = G_DATE_BAD_YEAR; /* avoids ambiguity */ - } - else if (pt.num_ints == 2) - { - if (m == G_DATE_BAD_MONTH && pt.month != G_DATE_BAD_MONTH) - { - m = pt.month; - } - } - } - else if (pt.num_ints == 1) - { - if (pt.month != G_DATE_BAD_MONTH) - { - /* Month name and year? */ - m = pt.month; - day = 1; - y = pt.n[0]; - } - else - { - /* Try yyyymmdd and yymmdd */ - - m = (pt.n[0]/100) % 100; - day = pt.n[0] % 100; - y = pt.n[0]/10000; - - /* FIXME move this into a separate function */ - if (using_twodigit_years && y < 100) - { - guint two = twodigit_start_year % 100; - guint century = (twodigit_start_year / 100) * 100; - - if (y < two) - century += 100; - - y += century; - } - } - } - - /* See if we got anything valid out of all this. */ - /* y < 8000 is to catch 19998 style typos; the library is OK up to 65535 or so */ - if (y < 8000 && g_date_valid_dmy (day, m, y)) - { - d->month = m; - d->day = day; - d->year = y; - d->dmy = TRUE; - } -#ifdef G_ENABLE_DEBUG - else - DEBUG_MSG (("Rejected DMY %u %u %u", day, m, y)); -#endif - G_UNLOCK (g_date_global); -} - -void -g_date_set_time (GDate *d, - GTime time) -{ - time_t t = time; - struct tm tm; - - g_return_if_fail (d != NULL); - -#ifdef HAVE_LOCALTIME_R - localtime_r (&t, &tm); -#else - { - struct tm *ptm = localtime (&t); - g_assert (ptm); - memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm)); - } -#endif - - d->julian = FALSE; - - d->month = tm.tm_mon + 1; - d->day = tm.tm_mday; - d->year = tm.tm_year + 1900; - - g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year)); - - d->dmy = TRUE; -} - -void -g_date_set_month (GDate *d, - GDateMonth m) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid_month (m)); - - if (d->julian && !d->dmy) g_date_update_dmy(d); - d->julian = FALSE; - - d->month = m; - - if (g_date_valid_dmy (d->day, d->month, d->year)) - d->dmy = TRUE; - else - d->dmy = FALSE; -} - -void -g_date_set_day (GDate *d, - GDateDay day) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid_day (day)); - - if (d->julian && !d->dmy) g_date_update_dmy(d); - d->julian = FALSE; - - d->day = day; - - if (g_date_valid_dmy (d->day, d->month, d->year)) - d->dmy = TRUE; - else - d->dmy = FALSE; -} - -void -g_date_set_year (GDate *d, - GDateYear y) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid_year (y)); - - if (d->julian && !d->dmy) g_date_update_dmy(d); - d->julian = FALSE; - - d->year = y; - - if (g_date_valid_dmy (d->day, d->month, d->year)) - d->dmy = TRUE; - else - d->dmy = FALSE; -} - -void -g_date_set_dmy (GDate *d, - GDateDay day, - GDateMonth m, - GDateYear y) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid_dmy (day, m, y)); - - d->julian = FALSE; - - d->month = m; - d->day = day; - d->year = y; - - d->dmy = TRUE; -} - -void -g_date_set_julian (GDate *d, guint32 j) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid_julian (j)); - - d->julian_days = j; - d->julian = TRUE; - d->dmy = FALSE; -} - - -gboolean -g_date_is_first_of_month (const GDate *d) -{ - g_return_val_if_fail (d != NULL, FALSE); - g_return_val_if_fail (g_date_valid (d), FALSE); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, FALSE); - - if (d->day == 1) return TRUE; - else return FALSE; -} - -gboolean -g_date_is_last_of_month (const GDate *d) -{ - gint index; - - g_return_val_if_fail (d != NULL, FALSE); - g_return_val_if_fail (g_date_valid (d), FALSE); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_val_if_fail (d->dmy, FALSE); - - index = g_date_is_leap_year (d->year) ? 1 : 0; - - if (d->day == days_in_months[index][d->month]) return TRUE; - else return FALSE; -} - -void -g_date_add_days (GDate *d, guint ndays) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->julian) - { - g_date_update_julian (d); - } - g_return_if_fail (d->julian); - - d->julian_days += ndays; - d->dmy = FALSE; -} - -void -g_date_subtract_days (GDate *d, guint ndays) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->julian) - { - g_date_update_julian (d); - } - g_return_if_fail (d->julian); - g_return_if_fail (d->julian_days > ndays); - - d->julian_days -= ndays; - d->dmy = FALSE; -} - -void -g_date_add_months (GDate *d, - guint nmonths) -{ - guint years, months; - gint index; - - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_if_fail (d->dmy); - - nmonths += d->month - 1; - - years = nmonths/12; - months = nmonths%12; - - d->month = months + 1; - d->year += years; - - index = g_date_is_leap_year (d->year) ? 1 : 0; - - if (d->day > days_in_months[index][d->month]) - d->day = days_in_months[index][d->month]; - - d->julian = FALSE; - - g_return_if_fail (g_date_valid (d)); -} - -void -g_date_subtract_months (GDate *d, - guint nmonths) -{ - guint years, months; - gint index; - - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_if_fail (d->dmy); - - years = nmonths/12; - months = nmonths%12; - - g_return_if_fail (d->year > years); - - d->year -= years; - - if (d->month > months) d->month -= months; - else - { - months -= d->month; - d->month = 12 - months; - d->year -= 1; - } - - index = g_date_is_leap_year (d->year) ? 1 : 0; - - if (d->day > days_in_months[index][d->month]) - d->day = days_in_months[index][d->month]; - - d->julian = FALSE; - - g_return_if_fail (g_date_valid (d)); -} - -void -g_date_add_years (GDate *d, - guint nyears) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_if_fail (d->dmy); - - d->year += nyears; - - if (d->month == 2 && d->day == 29) - { - if (!g_date_is_leap_year (d->year)) - { - d->day = 28; - } - } - - d->julian = FALSE; -} - -void -g_date_subtract_years (GDate *d, - guint nyears) -{ - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_if_fail (d->dmy); - g_return_if_fail (d->year > nyears); - - d->year -= nyears; - - if (d->month == 2 && d->day == 29) - { - if (!g_date_is_leap_year (d->year)) - { - d->day = 28; - } - } - - d->julian = FALSE; -} - - -gboolean -g_date_is_leap_year (GDateYear year) -{ - g_return_val_if_fail (g_date_valid_year (year), FALSE); - - return ( (((year % 4) == 0) && ((year % 100) != 0)) || - (year % 400) == 0 ); -} - -guint8 -g_date_get_days_in_month (GDateMonth month, - GDateYear year) -{ - gint index; - - g_return_val_if_fail (g_date_valid_year (year), 0); - g_return_val_if_fail (g_date_valid_month (month), 0); - - index = g_date_is_leap_year (year) ? 1 : 0; - - return days_in_months[index][month]; -} - -guint8 -g_date_get_monday_weeks_in_year (GDateYear year) -{ - GDate d; - - g_return_val_if_fail (g_date_valid_year (year), 0); - - g_date_clear (&d, 1); - g_date_set_dmy (&d, 1, 1, year); - if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; - g_date_set_dmy (&d, 31, 12, year); - if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; - if (g_date_is_leap_year (year)) - { - g_date_set_dmy (&d, 2, 1, year); - if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; - g_date_set_dmy (&d, 30, 12, year); - if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; - } - return 52; -} - -guint8 -g_date_get_sunday_weeks_in_year (GDateYear year) -{ - GDate d; - - g_return_val_if_fail (g_date_valid_year (year), 0); - - g_date_clear (&d, 1); - g_date_set_dmy (&d, 1, 1, year); - if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; - g_date_set_dmy (&d, 31, 12, year); - if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; - if (g_date_is_leap_year (year)) - { - g_date_set_dmy (&d, 2, 1, year); - if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; - g_date_set_dmy (&d, 30, 12, year); - if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; - } - return 52; -} - -gint -g_date_compare (const GDate *lhs, - const GDate *rhs) -{ - g_return_val_if_fail (lhs != NULL, 0); - g_return_val_if_fail (rhs != NULL, 0); - g_return_val_if_fail (g_date_valid (lhs), 0); - g_return_val_if_fail (g_date_valid (rhs), 0); - - /* Remember the self-comparison case! I think it works right now. */ - - while (TRUE) - { - - if (lhs->julian && rhs->julian) - { - if (lhs->julian_days < rhs->julian_days) return -1; - else if (lhs->julian_days > rhs->julian_days) return 1; - else return 0; - } - else if (lhs->dmy && rhs->dmy) - { - if (lhs->year < rhs->year) return -1; - else if (lhs->year > rhs->year) return 1; - else - { - if (lhs->month < rhs->month) return -1; - else if (lhs->month > rhs->month) return 1; - else - { - if (lhs->day < rhs->day) return -1; - else if (lhs->day > rhs->day) return 1; - else return 0; - } - - } - - } - else - { - if (!lhs->julian) g_date_update_julian (lhs); - if (!rhs->julian) g_date_update_julian (rhs); - g_return_val_if_fail (lhs->julian, 0); - g_return_val_if_fail (rhs->julian, 0); - } - - } - return 0; /* warnings */ -} - - -void -g_date_to_struct_tm (const GDate *d, - struct tm *tm) -{ - GDateWeekday day; - - g_return_if_fail (d != NULL); - g_return_if_fail (g_date_valid (d)); - g_return_if_fail (tm != NULL); - - if (!d->dmy) - { - g_date_update_dmy (d); - } - g_return_if_fail (d->dmy); - - /* zero all the irrelevant fields to be sure they're valid */ - - /* On Linux and maybe other systems, there are weird non-POSIX - * fields on the end of struct tm that choke strftime if they - * contain garbage. So we need to 0 the entire struct, not just the - * fields we know to exist. - */ - - memset (tm, 0x0, sizeof (struct tm)); - - tm->tm_mday = d->day; - tm->tm_mon = d->month - 1; /* 0-11 goes in tm */ - tm->tm_year = ((int)d->year) - 1900; /* X/Open says tm_year can be negative */ - - day = g_date_get_weekday (d); - if (day == 7) day = 0; /* struct tm wants days since Sunday, so Sunday is 0 */ - - tm->tm_wday = (int)day; - - tm->tm_yday = g_date_get_day_of_year (d) - 1; /* 0 to 365 */ - tm->tm_isdst = -1; /* -1 means "information not available" */ -} - -void -g_date_clamp (GDate *date, - const GDate *min_date, - const GDate *max_date) -{ - g_return_if_fail (date); - g_return_if_fail (g_date_valid (date)); - if (min_date != NULL) - g_return_if_fail (g_date_valid (min_date)); - if (max_date != NULL) - g_return_if_fail (g_date_valid (max_date)); - if (min_date != NULL && max_date != NULL) - g_return_if_fail (g_date_compare (min_date, max_date) <= 0); - - if (min_date && g_date_compare (date, min_date) < 0) - *date = *min_date; - - if (max_date && g_date_compare (max_date, date) < 0) - *date = *max_date; -} - -void -g_date_order (GDate *date1, - GDate *date2) -{ - g_return_if_fail (date1 != NULL); - g_return_if_fail (date2 != NULL); - g_return_if_fail (g_date_valid (date1)); - g_return_if_fail (g_date_valid (date2)); - - if (g_date_compare (date1, date2) == 1) { - GDate tmp = *date1; - *date1 = *date2; - *date2 = tmp; - } -} - -gsize -g_date_strftime (gchar *s, - gsize slen, - const gchar *format, - const GDate *d) -{ - struct tm tm; - gsize retval; - - g_return_val_if_fail (d != NULL, 0); - g_return_val_if_fail (g_date_valid (d), 0); - g_return_val_if_fail (slen > 0, 0); - g_return_val_if_fail (format != 0, 0); - g_return_val_if_fail (s != 0, 0); - - g_date_to_struct_tm (d, &tm); - - retval = strftime (s, slen, format, &tm); - if (retval == 0) - { - /* If retval == 0, the contents of s are undefined. We define - * them. - */ - s[0] = '\0'; - } - return retval; -} diff --git a/gdate.h b/gdate.h deleted file mode 100644 index 4cbdd8c0..00000000 --- a/gdate.h +++ /dev/null @@ -1,252 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_DATE_H__ -#define __G_DATE_H__ - -#include - -G_BEGIN_DECLS - -/* GDate - * - * Date calculations (not time for now, to be resolved). These are a - * mutant combination of Steffen Beyer's DateCalc routines - * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's - * date routines (written for in-house software). Written by Havoc - * Pennington - */ - -typedef gint32 GTime; -typedef guint16 GDateYear; -typedef guint8 GDateDay; /* day of the month */ -typedef struct _GDate GDate; -/* make struct tm known without having to include time.h */ -struct tm; - -/* enum used to specify order of appearance in parsed date strings */ -typedef enum -{ - G_DATE_DAY = 0, - G_DATE_MONTH = 1, - G_DATE_YEAR = 2 -} GDateDMY; - -/* actual week and month values */ -typedef enum -{ - G_DATE_BAD_WEEKDAY = 0, - G_DATE_MONDAY = 1, - G_DATE_TUESDAY = 2, - G_DATE_WEDNESDAY = 3, - G_DATE_THURSDAY = 4, - G_DATE_FRIDAY = 5, - G_DATE_SATURDAY = 6, - G_DATE_SUNDAY = 7 -} GDateWeekday; -typedef enum -{ - G_DATE_BAD_MONTH = 0, - G_DATE_JANUARY = 1, - G_DATE_FEBRUARY = 2, - G_DATE_MARCH = 3, - G_DATE_APRIL = 4, - G_DATE_MAY = 5, - G_DATE_JUNE = 6, - G_DATE_JULY = 7, - G_DATE_AUGUST = 8, - G_DATE_SEPTEMBER = 9, - G_DATE_OCTOBER = 10, - G_DATE_NOVEMBER = 11, - G_DATE_DECEMBER = 12 -} GDateMonth; - -#define G_DATE_BAD_JULIAN 0U -#define G_DATE_BAD_DAY 0U -#define G_DATE_BAD_YEAR 0U - -/* Note: directly manipulating structs is generally a bad idea, but - * in this case it's an *incredibly* bad idea, because all or part - * of this struct can be invalid at any given time. Use the functions, - * or you will get hosed, I promise. - */ -struct _GDate -{ - guint julian_days : 32; /* julian days representation - we use a - * bitfield hoping that 64 bit platforms - * will pack this whole struct in one big - * int - */ - - guint julian : 1; /* julian is valid */ - guint dmy : 1; /* dmy is valid */ - - /* DMY representation */ - guint day : 6; - guint month : 4; - guint year : 16; -}; - -/* g_date_new() returns an invalid date, you then have to _set() stuff - * to get a usable object. You can also allocate a GDate statically, - * then call g_date_clear() to initialize. - */ -GDate* g_date_new (void); -GDate* g_date_new_dmy (GDateDay day, - GDateMonth month, - GDateYear year); -GDate* g_date_new_julian (guint32 julian_day); -void g_date_free (GDate *date); - -/* check g_date_valid() after doing an operation that might fail, like - * _parse. Almost all g_date operations are undefined on invalid - * dates (the exceptions are the mutators, since you need those to - * return to validity). - */ -gboolean g_date_valid (const GDate *date); -gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; -gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; -gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; -gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST; -gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST; -gboolean g_date_valid_dmy (GDateDay day, - GDateMonth month, - GDateYear year) G_GNUC_CONST; - -GDateWeekday g_date_get_weekday (const GDate *date); -GDateMonth g_date_get_month (const GDate *date); -GDateYear g_date_get_year (const GDate *date); -GDateDay g_date_get_day (const GDate *date); -guint32 g_date_get_julian (const GDate *date); -guint g_date_get_day_of_year (const GDate *date); -/* First monday/sunday is the start of week 1; if we haven't reached - * that day, return 0. These are not ISO weeks of the year; that - * routine needs to be added. - * these functions return the number of weeks, starting on the - * corrsponding day - */ -guint g_date_get_monday_week_of_year (const GDate *date); -guint g_date_get_sunday_week_of_year (const GDate *date); - -/* If you create a static date struct you need to clear it to get it - * in a sane state before use. You can clear a whole array at - * once with the ndates argument. - */ -void g_date_clear (GDate *date, - guint n_dates); - -/* The parse routine is meant for dates typed in by a user, so it - * permits many formats but tries to catch common typos. If your data - * needs to be strictly validated, it is not an appropriate function. - */ -void g_date_set_parse (GDate *date, - const gchar *str); -void g_date_set_time (GDate *date, - GTime time); -void g_date_set_month (GDate *date, - GDateMonth month); -void g_date_set_day (GDate *date, - GDateDay day); -void g_date_set_year (GDate *date, - GDateYear year); -void g_date_set_dmy (GDate *date, - GDateDay day, - GDateMonth month, - GDateYear y); -void g_date_set_julian (GDate *date, - guint32 julian_date); -gboolean g_date_is_first_of_month (const GDate *date); -gboolean g_date_is_last_of_month (const GDate *date); - -/* To go forward by some number of weeks just go forward weeks*7 days */ -void g_date_add_days (GDate *date, - guint n_days); -void g_date_subtract_days (GDate *date, - guint n_days); - -/* If you add/sub months while day > 28, the day might change */ -void g_date_add_months (GDate *date, - guint n_months); -void g_date_subtract_months (GDate *date, - guint n_months); - -/* If it's feb 29, changing years can move you to the 28th */ -void g_date_add_years (GDate *date, - guint n_years); -void g_date_subtract_years (GDate *date, - guint n_years); -gboolean g_date_is_leap_year (GDateYear year) G_GNUC_CONST; -guint8 g_date_get_days_in_month (GDateMonth month, - GDateYear year) G_GNUC_CONST; -guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST; -guint8 g_date_get_sunday_weeks_in_year (GDateYear year) G_GNUC_CONST; - -/* Returns the number of days between the two dates. If date2 comes - before date1, a negative value is return. */ -gint g_date_days_between (const GDate *date1, - const GDate *date2); - -/* qsort-friendly (with a cast...) */ -gint g_date_compare (const GDate *lhs, - const GDate *rhs); -void g_date_to_struct_tm (const GDate *date, - struct tm *tm); - -void g_date_clamp (GDate *date, - const GDate *min_date, - const GDate *max_date); - -/* Swap date1 and date2's values if date1 > date2. */ -void g_date_order (GDate *date1, GDate *date2); - -/* Just like strftime() except you can only use date-related formats. - * Using a time format is undefined. - */ -gsize g_date_strftime (gchar *s, - gsize slen, - const gchar *format, - const GDate *date); - -#ifndef G_DISABLE_DEPRECATED - -#define g_date_weekday g_date_get_weekday -#define g_date_month g_date_get_month -#define g_date_year g_date_get_year -#define g_date_day g_date_get_day -#define g_date_julian g_date_get_julian -#define g_date_day_of_year g_date_get_day_of_year -#define g_date_monday_week_of_year g_date_get_monday_week_of_year -#define g_date_sunday_week_of_year g_date_get_sunday_week_of_year -#define g_date_days_in_month g_date_get_days_in_month -#define g_date_monday_weeks_in_year g_date_get_monday_weeks_in_year -#define g_date_sunday_weeks_in_year g_date_get_sunday_weeks_in_year - -#endif /* G_DISABLE_DEPRECATED */ - -G_END_DECLS - -#endif /* __G_DATE_H__ */ - diff --git a/gen-unicode-tables.pl b/gen-unicode-tables.pl deleted file mode 100755 index 1a3b9117..00000000 --- a/gen-unicode-tables.pl +++ /dev/null @@ -1,609 +0,0 @@ -#! /usr/bin/perl -w - -# Copyright (C) 1998, 1999 Tom Tromey - -# 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-unicode-tables.pl - Generate tables for libunicode from Unicode data. -# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html -# Usage: gen-unicode-tables.pl [-decomp | -both] UNICODE-VERSION UnicodeData.txt LineBreak.txt -# I consider the output of this program to be unrestricted. Use it as -# you will. - -# FIXME: -# * We could save even more space in the generated table by using -# indexes and not pointers. -# * For decomp table it might make sense to use a shift count other -# 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); - -# 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 line break table -$BREAK_CODE = 0; -$BREAK_PROPERTY = 1; -$BREAK_NAME = 2; - -# Map general category code onto symbolic name. -%mappings = - ( - # Normative. - 'Lu' => "G_UNICODE_UPPERCASE_LETTER", - 'Ll' => "G_UNICODE_LOWERCASE_LETTER", - 'Lt' => "G_UNICODE_TITLECASE_LETTER", - 'Mn' => "G_UNICODE_NON_SPACING_MARK", - 'Mc' => "G_UNICODE_COMBINING_MARK", - 'Me' => "G_UNICODE_ENCLOSING_MARK", - 'Nd' => "G_UNICODE_DECIMAL_NUMBER", - 'Nl' => "G_UNICODE_LETTER_NUMBER", - 'No' => "G_UNICODE_OTHER_NUMBER", - 'Zs' => "G_UNICODE_SPACE_SEPARATOR", - 'Zl' => "G_UNICODE_LINE_SEPARATOR", - 'Zp' => "G_UNICODE_PARAGRAPH_SEPARATOR", - 'Cc' => "G_UNICODE_CONTROL", - 'Cf' => "G_UNICODE_FORMAT", - 'Cs' => "G_UNICODE_SURROGATE", - 'Co' => "G_UNICODE_PRIVATE_USE", - 'Cn' => "G_UNICODE_UNASSIGNED", - - # Informative. - 'Lm' => "G_UNICODE_MODIFIER_LETTER", - 'Lo' => "G_UNICODE_OTHER_LETTER", - 'Pc' => "G_UNICODE_CONNECT_PUNCTUATION", - 'Pd' => "G_UNICODE_DASH_PUNCTUATION", - 'Ps' => "G_UNICODE_OPEN_PUNCTUATION", - 'Pe' => "G_UNICODE_CLOSE_PUNCTUATION", - 'Pi' => "G_UNICODE_INITIAL_PUNCTUATION", - 'Pf' => "G_UNICODE_FINAL_PUNCTUATION", - 'Po' => "G_UNICODE_OTHER_PUNCTUATION", - 'Sm' => "G_UNICODE_MATH_SYMBOL", - 'Sc' => "G_UNICODE_CURRENCY_SYMBOL", - 'Sk' => "G_UNICODE_MODIFIER_SYMBOL", - 'So' => "G_UNICODE_OTHER_SYMBOL" - ); - -%break_mappings = - ( - 'BK' => "G_UNICODE_BREAK_MANDATORY", - 'CR' => "G_UNICODE_BREAK_CARRIAGE_RETURN", - 'LF' => "G_UNICODE_BREAK_LINE_FEED", - 'CM' => "G_UNICODE_BREAK_COMBINING_MARK", - 'SG' => "G_UNICODE_BREAK_SURROGATE", - 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE", - 'IN' => "G_UNICODE_BREAK_INSEPARABLE", - 'GL' => "G_UNICODE_BREAK_NON_BREAKING_GLUE", - 'CB' => "G_UNICODE_BREAK_CONTINGENT", - 'SP' => "G_UNICODE_BREAK_SPACE", - 'BA' => "G_UNICODE_BREAK_AFTER", - 'BB' => "G_UNICODE_BREAK_BEFORE", - 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", - 'HY' => "G_UNICODE_BREAK_HYPHEN", - 'NS' => "G_UNICODE_BREAK_NON_STARTER", - 'OP' => "G_UNICODE_BREAK_OPEN_PUNCTUATION", - 'CL' => "G_UNICODE_BREAK_CLOSE_PUNCTUATION", - 'QU' => "G_UNICODE_BREAK_QUOTATION", - 'EX' => "G_UNICODE_BREAK_EXCLAMATION", - 'ID' => "G_UNICODE_BREAK_IDEOGRAPHIC", - 'NU' => "G_UNICODE_BREAK_NUMERIC", - 'IS' => "G_UNICODE_BREAK_INFIX_SEPARATOR", - 'SY' => "G_UNICODE_BREAK_SYMBOL", - 'AL' => "G_UNICODE_BREAK_ALPHABETIC", - 'PR' => "G_UNICODE_BREAK_PREFIX", - 'PO' => "G_UNICODE_BREAK_POSTFIX", - 'SA' => "G_UNICODE_BREAK_COMPLEX_CONTEXT", - 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", - 'XX' => "G_UNICODE_BREAK_UNKNOWN" - ); - -# Title case mappings. -%title_to_lower = (); -%title_to_upper = (); - -$do_decomp = 0; -$do_props = 1; -if ($ARGV[0] eq '-decomp') -{ - $do_decomp = 1; - $do_props = 0; - shift @ARGV; -} -elsif ($ARGV[0] eq '-both') -{ - $do_decomp = 1; - shift @ARGV; -} - -print "Creating decomp table\n" if ($do_decomp); -print "Creating property table\n" if ($do_props); - -print "Unicode data from $ARGV[1]\n"; - -open (INPUT, "< $ARGV[1]") || exit 1; - -$last_code = -1; -while () -{ - 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; -} - -@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', - '', '', '', ''); -for (++$last_code; $last_code < 0x10000; ++$last_code) -{ - $gfields{$CODE} = sprintf ("%04x", $last_code); - &process_one ($last_code, @gfields); -} ---$last_code; # Want last to be 0xFFFF. - -print "Creating line break table\n"; - -print "Line break data from $ARGV[2]\n"; - -open (INPUT, "< $ARGV[2]") || exit 1; - -$last_code = -1; -while () -{ - chop; - - next if /^#/; - - @fields = split (';', $_, 30); - if ($#fields != 2) - { - 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 - $gap_break_prop = $fields[$BREAK_PROPERTY]; - for (++$last_code; $last_code < $code; ++$last_code) - { - $break_props[$last_code] = $gap_break_prop; - } - } - 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; $last_code < 0x10000; ++$last_code) -{ - if ($type[$last_code] eq 'Cn') - { - $break_props[$last_code] = 'XX'; - } - else - { - $break_props[$last_code] = 'AL'; - } -} ---$last_code; # Want last to be 0xFFFF. - -print STDERR "Last code is not 0xFFFF" if ($last_code != 0xFFFF); - -&print_tables ($last_code) - if $do_props; -&print_decomp ($last_code) - if $do_decomp; - -&print_line_break ($last_code); - -exit 0; - -# Process a single character. -sub process_one -{ - my ($code, @fields) = @_; - - $type[$code] = $fields[$CATEGORY]; - if ($type[$code] eq 'Nd') - { - $value[$code] = int ($fields[$DECIMAL_VALUE]); - } - elsif ($type[$code] eq 'Ll') - { - $value[$code] = hex ($fields[$UPPER]); - } - elsif ($type[$code] eq 'Lu') - { - $value[$code] = hex ($fields[$LOWER]); - } - - if ($type[$code] eq 'Lt') - { - $title_to_lower{$code} = hex ($fields[$LOWER]); - $title_to_upper{$code} = hex ($fields[$UPPER]); - } - - $cclass[$code] = $fields[$COMBINING_CLASSES]; - - # Handle decompositions. - if ($fields[$DECOMPOSITION] ne '' - && $fields[$DECOMPOSITION] !~ /\<.*\>/) - { - $decompositions[$code] = $fields[$DECOMPOSITION]; - } -} - -sub print_tables -{ - my ($last) = @_; - my ($outfile) = "gunichartables.h"; - - local ($bytes_out) = 0; - - print "Writing $outfile...\n"; - - open (OUT, "> $outfile"); - - print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; - print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; - - print OUT "#ifndef CHARTABLES_H\n"; - print OUT "#define CHARTABLES_H\n\n"; - - print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; - - printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; - - for ($count = 0; $count <= $last; $count += 256) - { - $row[$count / 256] = &print_row ($count, '(char *) ', 'char', 1, - 'page', \&fetch_type); - } - - print OUT "static char *type_table[256] = {\n"; - for ($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"; - - - # - # Now print attribute table. - # - - for ($count = 0; $count <= $last; $count += 256) - { - $row[$count / 256] = &print_row ($count, '', 'unsigned short', 2, - 'attrpage', \&fetch_attr); - } - print OUT "static unsigned short *attr_table[256] = {\n"; - for ($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"; - - # FIXME: type. - print OUT "static unsigned short title_table[][3] = {\n"; - my ($item); - my ($first) = 1; - foreach $item (sort keys %title_to_lower) - { - print OUT ",\n" - unless $first; - $first = 0; - printf OUT " { 0x%04x, 0x%04x, 0x%04x }", $item, $title_to_upper{$item}, $title_to_lower{$item}; - $bytes_out += 6; - } - print OUT "\n};\n\n"; - - print OUT "#endif /* CHARTABLES_H */\n"; - - close (OUT); - - printf STDERR "Generated %d bytes in tables\n", $bytes_out; -} - -# A fetch function for the type table. -sub fetch_type -{ - my ($index) = @_; - return $mappings{$type[$index]}; -} - -# A fetch function for the attribute table. -sub fetch_attr -{ - my ($index) = @_; - if (defined $value[$index]) - { - return sprintf ("0x%04x", $value[$index]); - } - else - { - return "0x0000"; - } -} - -# Print a single "row" of a two-level table. -sub print_row -{ - my ($start, $def_pfx, $typname, $typsize, $name, $fetcher) = @_; - - my ($i); - my (@values); - my ($flag) = 1; - my ($off); - - for ($off = 0; $off < 256; ++$off) - { - $values[$off] = $fetcher->($off + $start); - if ($values[$off] ne $values[0]) - { - $flag = 0; - } - } - if ($flag) - { - return $def_pfx . $values[0]; - } - - printf OUT "static %s %s%d[256] = {\n ", $typname, $name, $start / 256; - my ($column) = 2; - for ($i = $start; $i < $start + 256; ++$i) - { - print OUT ", " - if $i > $start; - my ($text) = $values[$i - $start]; - if (length ($text) + $column + 2 > 78) - { - print OUT "\n "; - $column = 2; - } - print OUT $text; - $column += length ($text) + 2; - } - print OUT "\n};\n\n"; - - $bytes_out += 256 * $typsize; - - return sprintf "%s%d", $name, $start / 256; -} - -# Generate the character decomposition header. -sub print_decomp -{ - my ($last) = @_; - my ($outfile) = "gunidecomp.h"; - - local ($bytes_out) = 0; - - print "Writing $outfile...\n"; - - open (OUT, "> $outfile") || exit 1; - - print OUT "/* This file is automatically generated. DO NOT EDIT! */\n\n"; - print OUT "#ifndef DECOMP_H\n"; - print OUT "#define DECOMP_H\n\n"; - - printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; - - my ($count, @row); - for ($count = 0; $count <= $last; $count += 256) - { - $row[$count / 256] = &print_row ($count, '(unsigned char *) ', - 'unsigned char', 1, 'cclass', - \&fetch_cclass); - } - - print OUT "static unsigned char *combining_class_table[256] = {\n"; - for ($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"; - - print OUT "typedef struct\n{\n"; - # FIXME: type. - print OUT " unsigned short ch;\n"; - print OUT " unsigned char *expansion;\n"; - print OUT "} decomposition;\n\n"; - - print OUT "static decomposition decomp_table[] =\n{\n"; - my ($iter); - my ($first) = 1; - for ($count = 0; $count <= $last; ++$count) - { - if (defined $decompositions[$count]) - { - print OUT ",\n" - if ! $first; - $first = 0; - printf OUT " { 0x%04x, \"", $count; - $bytes_out += 2; - foreach $iter (&expand_decomp ($count)) - { - printf OUT "\\x%02x\\x%02x", $iter / 256, $iter & 0xff; - $bytes_out += 2; - } - # Only a single terminator because one is implied in the string. - print OUT "\\0\" }"; - $bytes_out += 2; - } - } - print OUT "\n};\n\n"; - - print OUT "#endif /* DECOMP_H */\n"; - - printf STDERR "Generated %d bytes in decomp tables\n", $bytes_out; -} - -sub print_line_break -{ - my ($last) = @_; - my ($outfile) = "gunibreak.h"; - - local ($bytes_out) = 0; - - print "Writing $outfile...\n"; - - open (OUT, "> $outfile"); - - print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; - print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; - - print OUT "#ifndef BREAKTABLES_H\n"; - print OUT "#define BREAKTABLES_H\n\n"; - - print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; - - printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; - - for ($count = 0; $count <= $last; $count += 256) - { - $row[$count / 256] = &print_row ($count, '(char *) ', 'char', 1, - 'page', - \&fetch_break_type); - } - - print OUT "static char *break_property_table[256] = {\n"; - for ($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"; - - print OUT "#endif /* BREAKTABLES_H */\n"; - - close (OUT); - - printf STDERR "Generated %d bytes in break tables\n", $bytes_out; -} - - -# A fetch function for the break properties table. -sub fetch_break_type -{ - my ($index) = @_; - return $break_mappings{$break_props[$index]}; -} - -# Fetcher for combining class. -sub fetch_cclass -{ - my ($i) = @_; - return $cclass[$i]; -} - -# Expand a character decomposition recursively. -sub expand_decomp -{ - my ($code) = @_; - - my ($iter, $val); - my (@result) = (); - foreach $iter (split (' ', $decompositions[$code])) - { - $val = hex ($iter); - if (defined $decompositions[$val]) - { - push (@result, &expand_decomp ($val)); - } - else - { - push (@result, $val); - } - } - - return @result; -} diff --git a/gerror.c b/gerror.c deleted file mode 100644 index eff62588..00000000 --- a/gerror.c +++ /dev/null @@ -1,254 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "glib.h" - -static GError* -g_error_new_valist(GQuark domain, - gint code, - const gchar *format, - va_list args) -{ - GError *error; - - error = g_new (GError, 1); - - error->domain = domain; - error->code = code; - error->message = g_strdup_vprintf (format, args); - - return error; -} - -/** - * g_error_new: - * @domain: error domain - * @code: error code - * @format: printf()-style format for error message - * @Varargs: parameters for message format - * - * Creates a new #GError with the given @domain and @code, - * and a message formatted with @format. - * - * Return value: a new #GError - **/ -GError* -g_error_new (GQuark domain, - gint code, - const gchar *format, - ...) -{ - GError* error; - va_list args; - - g_return_val_if_fail (format != NULL, NULL); - g_return_val_if_fail (domain != 0, NULL); - - va_start (args, format); - error = g_error_new_valist (domain, code, format, args); - va_end (args); - - return error; -} - -/** - * g_error_new_literal: - * @domain: error domain - * @code: error code - * @message: error message - * - * Creates a new #GError; unlike g_error_new(), @message is not - * a printf()-style format string. Use this function if @message - * contains text you don't have control over, that could include - * printf() escape sequences. - * - * Return value: a new #GError - **/ -GError* -g_error_new_literal (GQuark domain, - gint code, - const gchar *message) -{ - GError* err; - - g_return_val_if_fail (message != NULL, NULL); - g_return_val_if_fail (domain != 0, NULL); - - err = g_new (GError, 1); - - err->domain = domain; - err->code = code; - err->message = g_strdup (message); - - return err; -} - -/** - * g_error_free: - * @error: a #GError - * - * Frees a #GError and associated resources. - * - **/ -void -g_error_free (GError *error) -{ - g_return_if_fail (error != NULL); - - g_free (error->message); - - g_free (error); -} - -/** - * g_error_copy: - * @error: a #GError - * - * Makes a copy of @error. - * - * Return value: a new #GError - **/ -GError* -g_error_copy (const GError *error) -{ - GError *copy; - - g_return_val_if_fail (error != NULL, NULL); - - copy = g_new (GError, 1); - - *copy = *error; - - copy->message = g_strdup (error->message); - - return copy; -} - -/** - * g_error_matches: - * @error: a #GError - * @domain: an error domain - * @code: an error code - * - * Returns TRUE if @error matches @domain and @code, FALSE - * otherwise. - * - * Return value: whether @error has @domain and @code - **/ -gboolean -g_error_matches (const GError *error, - GQuark domain, - gint code) -{ - return error && - error->domain == domain && - error->code == code; -} - -#define ERROR_OVERWRITTEN_WARNING "GError set over the top of a previous GError or uninitialized memory.\n" \ - "This indicates a bug in someone's code. You must ensure an error is NULL before it's set.\n" \ - "The overwriting error message was: %s" - -/** - * g_set_error: - * @err: a return location for a #GError, or NULL - * @domain: error domain - * @code: error code - * @format: printf()-style format - * @Varargs: args for @format - * - * Does nothing if @err is NULL; if @err is non-NULL, then *@err must - * be NULL. A new #GError is created and assigned to *@err. - **/ -void -g_set_error (GError **err, - GQuark domain, - gint code, - const gchar *format, - ...) -{ - GError *new; - - va_list args; - - if (err == NULL) - return; - - va_start (args, format); - new = g_error_new_valist (domain, code, format, args); - va_end (args); - - if (*err == NULL) - *err = new; - else - g_warning (ERROR_OVERWRITTEN_WARNING, new->message); -} - -/** - * g_propagate_error: - * @dest: error return location - * @src: error to move into the return location - * - * If @dest is NULL, free @src; otherwise, - * moves @src into *@dest. *@dest must be NULL. - **/ -void -g_propagate_error (GError **dest, - GError *src) -{ - g_return_if_fail (src != NULL); - - if (dest == NULL) - { - if (src) - g_error_free (src); - return; - } - else - { - if (*dest != NULL) - g_warning (ERROR_OVERWRITTEN_WARNING, src->message); - else - *dest = src; - } -} - -/** - * g_clear_error: - * @err: a #GError return location - * - * If @err is NULL, does nothing. If @err is non-NULL, - * calls g_error_free() on *@err and sets *@err to NULL. - **/ -void -g_clear_error (GError **err) -{ - if (err && *err) - { - g_error_free (*err); - *err = NULL; - } -} diff --git a/gerror.h b/gerror.h deleted file mode 100644 index a7eb8fda..00000000 --- a/gerror.h +++ /dev/null @@ -1,74 +0,0 @@ -/* gerror.h - Error reporting system - * - * Copyright 2000 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. - */ - -#ifndef __G_ERROR_H__ -#define __G_ERROR_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GError GError; - -struct _GError -{ - GQuark domain; - gint code; - gchar *message; -}; - -GError* g_error_new (GQuark domain, - gint code, - const gchar *format, - ...) G_GNUC_PRINTF (3, 4); - -GError* g_error_new_literal (GQuark domain, - gint code, - const gchar *message); - -void g_error_free (GError *error); -GError* g_error_copy (const GError *error); - -gboolean g_error_matches (const GError *error, - GQuark domain, - gint code); - -/* if (err) *err = g_error_new(domain, code, format, ...), also has - * some sanity checks. - */ -void g_set_error (GError **err, - GQuark domain, - gint code, - const gchar *format, - ...) G_GNUC_PRINTF (4, 5); - -/* if (dest) *dest = src; also has some sanity checks. - */ -void g_propagate_error (GError **dest, - GError *src); - -/* if (err && *err) { g_error_free(*err); *err = NULL; } */ -void g_clear_error (GError **err); - - -G_END_DECLS - -#endif /* __G_ERROR_H__ */ - diff --git a/gfileutils.c b/gfileutils.c deleted file mode 100644 index 9936867c..00000000 --- a/gfileutils.c +++ /dev/null @@ -1,698 +0,0 @@ -/* gfileutils.c - File utility functions - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; 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 "config.h" - -#include "glib.h" - -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef G_OS_WIN32 -#include -#ifndef F_OK -#define F_OK 0 -#define X_OK 1 -#define W_OK 2 -#define R_OK 4 -#endif /* !F_OK */ - -#ifndef S_ISREG -#define S_ISREG(mode) ((mode)&_S_IFREG) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(mode) ((mode)&_S_IFDIR) -#endif - -#endif /* G_OS_WIN32 */ - -#ifndef S_ISLNK -#define S_ISLNK(x) 0 -#endif - -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#include "glibintl.h" - -/** - * g_file_test: - * @filename: a filename to test - * @test: bitfield of #GFileTest flags - * - * Returns TRUE if any of the tests in the bitfield @test are - * TRUE. For example, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) - * will return TRUE if the file exists; the check whether it's - * a directory doesn't matter since the existence test is TRUE. - * With the current set of available tests, there's no point - * passing in more than one test at a time. - * - * Return value: whether a test was TRUE - **/ -gboolean -g_file_test (const gchar *filename, - GFileTest test) -{ - if (test & G_FILE_TEST_EXISTS) - return (access (filename, F_OK) == 0); - else if (test & G_FILE_TEST_IS_EXECUTABLE) - return (access (filename, X_OK) == 0); - else - { - struct stat s; - - if (stat (filename, &s) < 0) - return FALSE; - - if ((test & G_FILE_TEST_IS_REGULAR) && - S_ISREG (s.st_mode)) - return TRUE; - else if ((test & G_FILE_TEST_IS_DIR) && - S_ISDIR (s.st_mode)) - return TRUE; - else if ((test & G_FILE_TEST_IS_SYMLINK) && - S_ISLNK (s.st_mode)) - return TRUE; - else - return FALSE; - } -} - -GQuark -g_file_error_quark (void) -{ - static GQuark q = 0; - if (q == 0) - q = g_quark_from_static_string ("g-file-error-quark"); - - return q; -} - -/** - * g_file_error_from_errno: - * @err_no: an "errno" value - * - * Gets a #GFileError constant based on the passed-in errno. - * For example, if you pass in EEXIST this function returns - * #G_FILE_ERROR_EXIST. Unlike errno values, you can portably - * assume that all #GFileError values will exist. - * - * Normally a #GFileError value goes into a #GError returned - * from a function that manipulates files. So you would use - * g_file_error_from_errno() when constructing a #GError. - * - * Return value: #GFileError corresponding to the given errno - **/ -GFileError -g_file_error_from_errno (gint err_no) -{ - switch (err_no) - { -#ifdef EEXIST - case EEXIST: - return G_FILE_ERROR_EXIST; - break; -#endif - -#ifdef EISDIR - case EISDIR: - return G_FILE_ERROR_ISDIR; - break; -#endif - -#ifdef EACCES - case EACCES: - return G_FILE_ERROR_ACCES; - break; -#endif - -#ifdef ENAMETOOLONG - case ENAMETOOLONG: - return G_FILE_ERROR_NAMETOOLONG; - break; -#endif - -#ifdef ENOENT - case ENOENT: - return G_FILE_ERROR_NOENT; - break; -#endif - -#ifdef ENOTDIR - case ENOTDIR: - return G_FILE_ERROR_NOTDIR; - break; -#endif - -#ifdef ENXIO - case ENXIO: - return G_FILE_ERROR_NXIO; - break; -#endif - -#ifdef ENODEV - case ENODEV: - return G_FILE_ERROR_NODEV; - break; -#endif - -#ifdef EROFS - case EROFS: - return G_FILE_ERROR_ROFS; - break; -#endif - -#ifdef ETXTBSY - case ETXTBSY: - return G_FILE_ERROR_TXTBSY; - break; -#endif - -#ifdef EFAULT - case EFAULT: - return G_FILE_ERROR_FAULT; - break; -#endif - -#ifdef ELOOP - case ELOOP: - return G_FILE_ERROR_LOOP; - break; -#endif - -#ifdef ENOSPC - case ENOSPC: - return G_FILE_ERROR_NOSPC; - break; -#endif - -#ifdef ENOMEM - case ENOMEM: - return G_FILE_ERROR_NOMEM; - break; -#endif - -#ifdef EMFILE - case EMFILE: - return G_FILE_ERROR_MFILE; - break; -#endif - -#ifdef ENFILE - case ENFILE: - return G_FILE_ERROR_NFILE; - break; -#endif - -#ifdef EBADF - case EBADF: - return G_FILE_ERROR_BADF; - break; -#endif - -#ifdef EINVAL - case EINVAL: - return G_FILE_ERROR_INVAL; - break; -#endif - -#ifdef EPIPE - case EPIPE: - return G_FILE_ERROR_PIPE; - break; -#endif - -#ifdef EAGAIN - case EAGAIN: - return G_FILE_ERROR_AGAIN; - break; -#endif - -#ifdef EINTR - case EINTR: - return G_FILE_ERROR_INTR; - break; -#endif - -#ifdef EIO - case EIO: - return G_FILE_ERROR_IO; - break; -#endif - -#ifdef EPERM - case EPERM: - return G_FILE_ERROR_PERM; - break; -#endif - - default: - return G_FILE_ERROR_FAILED; - break; - } -} - -static gboolean -get_contents_stdio (const gchar *filename, - FILE *f, - gchar **contents, - gsize *length, - GError **error) -{ - gchar buf[2048]; - size_t bytes; - GString *str; - - g_assert (f != NULL); - - str = g_string_new (""); - - while (!feof (f)) - { - bytes = fread (buf, 1, 2048, f); - - if (ferror (f)) - { - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Error reading file '%s': %s"), - filename, strerror (errno)); - - g_string_free (str, TRUE); - - return FALSE; - } - - g_string_append_len (str, buf, bytes); - } - - fclose (f); - - if (length) - *length = str->len; - - *contents = g_string_free (str, FALSE); - - return TRUE; -} - -#ifndef G_OS_WIN32 - -static gboolean -get_contents_regfile (const gchar *filename, - struct stat *stat_buf, - gint fd, - gchar **contents, - gsize *length, - GError **error) -{ - gchar *buf; - size_t bytes_read; - size_t size; - - size = stat_buf->st_size; - - buf = g_new (gchar, size + 1); - - bytes_read = 0; - while (bytes_read < size) - { - gssize rc; - - rc = read (fd, buf + bytes_read, size - bytes_read); - - if (rc < 0) - { - if (errno != EINTR) - { - close (fd); - - g_free (buf); - - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to read from file '%s': %s"), - filename, strerror (errno)); - - return FALSE; - } - } - else if (rc == 0) - break; - else - bytes_read += rc; - } - - buf[bytes_read] = '\0'; - - if (length) - *length = bytes_read; - - *contents = buf; - - return TRUE; -} - -static gboolean -get_contents_posix (const gchar *filename, - gchar **contents, - gsize *length, - GError **error) -{ - struct stat stat_buf; - gint fd; - - /* O_BINARY useful on Cygwin */ - fd = open (filename, O_RDONLY|O_BINARY); - - if (fd < 0) - { - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to open file '%s': %s"), - filename, strerror (errno)); - - return FALSE; - } - - /* I don't think this will ever fail, aside from ENOMEM, but. */ - if (fstat (fd, &stat_buf) < 0) - { - close (fd); - - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to get attributes of file '%s': fstat() failed: %s"), - filename, strerror (errno)); - - return FALSE; - } - - if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode)) - { - return get_contents_regfile (filename, - &stat_buf, - fd, - contents, - length, - error); - } - else - { - FILE *f; - - f = fdopen (fd, "r"); - - if (f == NULL) - { - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to open file '%s': fdopen() failed: %s"), - filename, strerror (errno)); - - return FALSE; - } - - return get_contents_stdio (filename, f, contents, length, error); - } -} - -#else /* G_OS_WIN32 */ - -static gboolean -get_contents_win32 (const gchar *filename, - gchar **contents, - gsize *length, - GError **error) -{ - FILE *f; - - /* I guess you want binary mode; maybe you want text sometimes? */ - f = fopen (filename, "rb"); - - if (f == NULL) - { - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to open file '%s': %s"), - filename, strerror (errno)); - - return FALSE; - } - - return get_contents_stdio (filename, f, contents, length, error); -} - -#endif - -/** - * g_file_get_contents: - * @filename: a file to read contents from - * @contents: location to store an allocated string - * @length: location to store length in bytes of the contents - * @error: return location for a #GError - * - * Reads an entire file into allocated memory, with good error - * checking. If @error is set, FALSE is returned, and @contents is set - * to NULL. If TRUE is returned, @error will not be set, and @contents - * will be set to the file contents. The string stored in @contents - * will be nul-terminated, so for text files you can pass NULL for the - * @length argument. The error domain is #G_FILE_ERROR. Possible - * error codes are those in the #GFileError enumeration. - * - * FIXME currently crashes if the file is too big to fit in memory; - * should probably use g_try_malloc() when we have that function. - * - * Return value: TRUE on success, FALSE if error is set - **/ -gboolean -g_file_get_contents (const gchar *filename, - gchar **contents, - gsize *length, - GError **error) -{ - g_return_val_if_fail (filename != NULL, FALSE); - g_return_val_if_fail (contents != NULL, FALSE); - - *contents = NULL; - if (length) - *length = 0; - -#ifdef G_OS_WIN32 - return get_contents_win32 (filename, contents, length, error); -#else - return get_contents_posix (filename, contents, length, error); -#endif -} - -/* - * mkstemp() implementation is from the GNU C library. - * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. - */ -/** - * g_mkstemp: - * @tmpl: template filename - * - * Open a temporary file. See "man mkstemp" on most UNIX-like systems. - * This is a portability wrapper, which simply calls mkstemp() on systems - * that have it, and implements it in GLib otherwise. - * - * The parameter is a string that should match the rules for mktemp, i.e. - * end in "XXXXXX". The X string will be modified to form the name - * of a file that didn't exist. - * - * Return value: A file handle (as from open()) to the file - * opened for reading and writing. The file is opened in binary mode - * on platforms where there is a difference. The file handle should be - * closed with close(). In case of errors, -1 is returned. - */ -int -g_mkstemp (char *tmpl) -{ -#ifdef HAVE_MKSTEMP - return mkstemp (tmpl); -#else - int len; - char *XXXXXX; - int count, fd; - static const char letters[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - static const int NLETTERS = sizeof (letters) - 1; - glong value; - GTimeVal tv; - static int counter = 0; - - len = strlen (tmpl); - if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) - return -1; - - /* This is where the Xs start. */ - XXXXXX = &tmpl[len - 6]; - - /* Get some more or less random data. */ - g_get_current_time (&tv); - value = (tv.tv_usec ^ tv.tv_sec) + counter++; - - for (count = 0; count < 100; value += 7777, ++count) - { - glong v = value; - - /* Fill in the random bits. */ - XXXXXX[0] = letters[v % NLETTERS]; - v /= NLETTERS; - XXXXXX[1] = letters[v % NLETTERS]; - v /= NLETTERS; - XXXXXX[2] = letters[v % NLETTERS]; - v /= NLETTERS; - XXXXXX[3] = letters[v % NLETTERS]; - v /= NLETTERS; - XXXXXX[4] = letters[v % NLETTERS]; - v /= NLETTERS; - XXXXXX[5] = letters[v % NLETTERS]; - - fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); - - if (fd >= 0) - return fd; - else if (errno != EEXIST) - /* Any other error will apply also to other names we might - * try, and there are 2^32 or so of them, so give up now. - */ - return -1; - } - - /* We got out of the loop because we ran out of combinations to try. */ - return -1; -#endif -} - -/** - * g_file_open_tmp: - * @tmpl: Template for file name, as in g_mkstemp, basename only - * @name_used: location to store actual name used - * @error: return location for a #GError - * - * Opens a file for writing in the preferred directory for temporary - * files (as returned by g_get_tmp_dir()). - * - * @tmpl should be a string ending with six 'X' characters, as the - * parameter to g_mkstemp() (or mkstemp()). However, unlike these - * functions, the template should only be a basename, no directory - * components are allowed. If template is NULL, a default template is - * used. - * - * Note that in contrast to g_mkstemp() (and mkstemp()) @tmpl is not - * modified, and might thus be a read-only literal string. - * - * The actual name used is returned in @name_used if non-NULL. This - * string should be freed with g_free when not needed any longer. - * - * Return value: A file handle (as from open()) to the file - * opened for reading and writing. The file is opened in binary mode - * on platforms where there is a difference. The file handle should be - * closed with close(). In case of errors, -1 is returned and - * @error will be set. - **/ -int -g_file_open_tmp (const char *tmpl, - char **name_used, - GError **error) -{ - int retval; - const char *tmpdir; - char *sep; - char *fulltemplate; - - if (tmpl == NULL) - tmpl = ".XXXXXX"; - - if (strchr (tmpl, G_DIR_SEPARATOR) -#ifdef G_OS_WIN32 - || strchr (tmpl, '/') -#endif - ) - { - g_set_error (error, - G_FILE_ERROR, - G_FILE_ERROR_FAILED, - _("Template '%s' illegal, should not contain a '%s'"), - tmpl, G_DIR_SEPARATOR_S); - - return -1; - } - - if (strlen (tmpl) < 6 || - strcmp (tmpl + strlen (tmpl) - 6, "XXXXXX") != 0) - { - g_set_error (error, - G_FILE_ERROR, - G_FILE_ERROR_FAILED, - _("Template '%s' doesn't end with XXXXXX"), - tmpl); - return -1; - } - - tmpdir = g_get_tmp_dir (); - - if (tmpdir [strlen (tmpdir) - 1] == G_DIR_SEPARATOR) - sep = ""; - else - sep = G_DIR_SEPARATOR_S; - - fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL); - - retval = g_mkstemp (fulltemplate); - - if (retval == -1) - { - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Failed to create file '%s': %s"), - fulltemplate, strerror (errno)); - g_free (fulltemplate); - return -1; - } - - if (name_used) - *name_used = fulltemplate; - else - g_free (fulltemplate); - - return retval; -} diff --git a/gfileutils.h b/gfileutils.h deleted file mode 100644 index 717fa63e..00000000 --- a/gfileutils.h +++ /dev/null @@ -1,95 +0,0 @@ -/* gfileutils.h - File utility functions - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __G_FILEUTILS_H__ -#define __G_FILEUTILS_H__ - -#include - -G_BEGIN_DECLS - -#define G_FILE_ERROR g_file_error_quark () - -typedef enum -{ - G_FILE_ERROR_EXIST, - G_FILE_ERROR_ISDIR, - G_FILE_ERROR_ACCES, - G_FILE_ERROR_NAMETOOLONG, - G_FILE_ERROR_NOENT, - G_FILE_ERROR_NOTDIR, - G_FILE_ERROR_NXIO, - G_FILE_ERROR_NODEV, - G_FILE_ERROR_ROFS, - G_FILE_ERROR_TXTBSY, - G_FILE_ERROR_FAULT, - G_FILE_ERROR_LOOP, - G_FILE_ERROR_NOSPC, - G_FILE_ERROR_NOMEM, - G_FILE_ERROR_MFILE, - G_FILE_ERROR_NFILE, - G_FILE_ERROR_BADF, - G_FILE_ERROR_INVAL, - G_FILE_ERROR_PIPE, - G_FILE_ERROR_AGAIN, - G_FILE_ERROR_INTR, - G_FILE_ERROR_IO, - G_FILE_ERROR_PERM, - G_FILE_ERROR_FAILED -} GFileError; - -/* For backward-compat reasons, these are synced to an old - * anonymous enum in libgnome. But don't use that enum - * in new code. - */ -typedef enum -{ - G_FILE_TEST_IS_REGULAR = 1 << 0, - G_FILE_TEST_IS_SYMLINK = 1 << 1, - G_FILE_TEST_IS_DIR = 1 << 2, - G_FILE_TEST_IS_EXECUTABLE = 1 << 3, - G_FILE_TEST_EXISTS = 1 << 4 -} GFileTest; - -GQuark g_file_error_quark (void); -/* So other code can generate a GFileError */ -GFileError g_file_error_from_errno (gint err_no); - -gboolean g_file_test (const gchar *filename, - GFileTest test); -gboolean g_file_get_contents (const gchar *filename, - gchar **contents, - gsize *length, - GError **error); - - -/* Wrapper / workalike for mkstemp() */ -int g_mkstemp (char *tmpl); - -/* Wrapper for g_mkstemp */ -int g_file_open_tmp (const char *tmpl, - char **name_used, - GError **error); - -G_END_DECLS - -#endif /* __G_FILEUTILS_H__ */ - - diff --git a/ghash.c b/ghash.c deleted file mode 100644 index 62f4b959..00000000 --- a/ghash.c +++ /dev/null @@ -1,695 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - - -#define HASH_TABLE_MIN_SIZE 11 -#define HASH_TABLE_MAX_SIZE 13845163 - - -typedef struct _GHashNode GHashNode; - -struct _GHashNode -{ - gpointer key; - gpointer value; - GHashNode *next; -}; - -struct _GHashTable -{ - gint size; - gint nnodes; - GHashNode **nodes; - GHashFunc hash_func; - GEqualFunc key_equal_func; - GDestroyNotify key_destroy_func; - GDestroyNotify value_destroy_func; -}; - - -static void g_hash_table_resize (GHashTable *hash_table); -static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table, - gconstpointer key); -static GHashNode* g_hash_node_new (gpointer key, - gpointer value); -static void g_hash_node_destroy (GHashNode *hash_node, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func); -static void g_hash_nodes_destroy (GHashNode *hash_node, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func); -static guint g_hash_table_foreach_remove_or_steal (GHashTable *hash_table, - GHRFunc func, - gpointer user_data, - gboolean notify); - - -G_LOCK_DEFINE_STATIC (g_hash_global); - -static GMemChunk *node_mem_chunk = NULL; -static GHashNode *node_free_list = NULL; - -/** - * g_hash_table_new: - * @hash_func: a function to create a hash value from a key. - * Hash values are used to determine where keys are stored within the - * #GHashTable data structure. The g_direct_hash(), g_int_hash() and - * g_str_hash() functions are provided for some common types of keys. - * If hash_func is NULL, g_direct_hash() is used. - * @key_equal_func: a function to check two keys for equality. This is - * used when looking up keys in the #GHashTable. The g_direct_equal(), - * g_int_equal() and g_str_equal() functions are provided for the most - * common types of keys. If @key_equal_func is NULL, keys are compared - * directly in a similar fashion to g_direct_equal(), but without the - * overhead of a function call. - * - * Creates a new #GHashTable. - * - * Return value: a new #GHashTable. - **/ -GHashTable* -g_hash_table_new (GHashFunc hash_func, - GEqualFunc key_equal_func) -{ - return g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL); -} - - -/** - * g_hash_table_new_full: - * @hash_func: a function to create a hash value from a key. - * @key_equal_func: a function to check two keys for equality. - * @key_destroy_func: a function to free the memory allocated for the key - * used when removing the entry from the #GHashTable or #NULL if you - * don't want to supply such a function. - * @value_destroy_func: a function to free the memory allocated for the - * value used when removing the entry from the #GHashTable or #NULL if - * you don't want to supply such a function. - * - * Creates a new #GHashTable like g_hash_table_new() and allows to specify - * functions to free the memory allocated for the key and value that get - * called when removing the entry from the #GHashTable. - * - * Return value: a new #GHashTable. - **/ -GHashTable* -g_hash_table_new_full (GHashFunc hash_func, - GEqualFunc key_equal_func, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func) -{ - GHashTable *hash_table; - guint i; - - hash_table = g_new (GHashTable, 1); - hash_table->size = HASH_TABLE_MIN_SIZE; - hash_table->nnodes = 0; - hash_table->hash_func = hash_func ? hash_func : g_direct_hash; - hash_table->key_equal_func = key_equal_func; - hash_table->key_destroy_func = key_destroy_func; - hash_table->value_destroy_func = value_destroy_func; - hash_table->nodes = g_new (GHashNode*, hash_table->size); - - for (i = 0; i < hash_table->size; i++) - hash_table->nodes[i] = NULL; - - return hash_table; -} - -/** - * g_hash_table_destroy: - * @hash_table: a #GHashTable. - * - * Destroys the #GHashTable. If keys and/or values are dynamically - * allocated, you should either free them first or create the #GHashTable - * using g_hash_table_new_full(). In the latter case the destroy functions - * you supplied will be called on all keys and values before destroying - * the #GHashTable. - **/ -void -g_hash_table_destroy (GHashTable *hash_table) -{ - guint i; - - g_return_if_fail (hash_table != NULL); - - for (i = 0; i < hash_table->size; i++) - g_hash_nodes_destroy (hash_table->nodes[i], - hash_table->key_destroy_func, - hash_table->value_destroy_func); - - g_free (hash_table->nodes); - g_free (hash_table); -} - -static inline GHashNode** -g_hash_table_lookup_node (GHashTable *hash_table, - gconstpointer key) -{ - GHashNode **node; - - node = &hash_table->nodes - [(* hash_table->hash_func) (key) % hash_table->size]; - - /* Hash table lookup needs to be fast. - * We therefore remove the extra conditional of testing - * whether to call the key_equal_func or not from - * the inner loop. - */ - if (hash_table->key_equal_func) - while (*node && !(*hash_table->key_equal_func) ((*node)->key, key)) - node = &(*node)->next; - else - while (*node && (*node)->key != key) - node = &(*node)->next; - - return node; -} - -/** - * g_hash_table_lookup: - * @hash_table: a #GHashTable. - * @key: the key to look up. - * - * Looks up a key in a #GHashTable. - * - * Return value: the associated value, or NULL if the key is not found. - **/ -gpointer -g_hash_table_lookup (GHashTable *hash_table, - gconstpointer key) -{ - GHashNode *node; - - g_return_val_if_fail (hash_table != NULL, NULL); - - node = *g_hash_table_lookup_node (hash_table, key); - - return node ? node->value : NULL; -} - -/** - * g_hash_table_lookup_extended: - * @hash_table: a #GHashTable. - * @lookup_key: the key to look up. - * @orig_key: returns the original key. - * @value: returns the value associated with the key. - * - * Looks up a key in the #GHashTable, returning the original key and the - * associated value and a gboolean which is TRUE if the key was found. This - * is useful if you need to free the memory allocated for the original key, - * for example before calling g_hash_table_remove(). - * - * Return value: #TRUE if the key was found in the #GHashTable. - **/ -gboolean -g_hash_table_lookup_extended (GHashTable *hash_table, - gconstpointer lookup_key, - gpointer *orig_key, - gpointer *value) -{ - GHashNode *node; - - g_return_val_if_fail (hash_table != NULL, FALSE); - - node = *g_hash_table_lookup_node (hash_table, lookup_key); - - if (node) - { - if (orig_key) - *orig_key = node->key; - if (value) - *value = node->value; - return TRUE; - } - else - return FALSE; -} - -/** - * g_hash_table_insert: - * @hash_table: a #GHashTable. - * @key: a key to insert. - * @value: the value to associate with the key. - * - * Inserts a new key and value into a #GHashTable. - * - * If the key already exists in the #GHashTable its current value is replaced - * with the new value. If you supplied a value_destroy_func when creating the - * #GHashTable, the old value is freed using that function. If you supplied - * a key_destroy_func when creating the #GHashTable, the passed key is freed - * using that function. - **/ -void -g_hash_table_insert (GHashTable *hash_table, - gpointer key, - gpointer value) -{ - GHashNode **node; - - g_return_if_fail (hash_table != NULL); - - node = g_hash_table_lookup_node (hash_table, key); - - if (*node) - { - /* do not reset node->key in this place, keeping - * the old key is the intended behaviour. - * g_hash_table_replace() can be used instead. - */ - - /* free the passed key */ - if (hash_table->key_destroy_func) - hash_table->key_destroy_func (key); - - if (hash_table->value_destroy_func) - hash_table->value_destroy_func ((*node)->value); - - (*node)->value = value; - } - else - { - *node = g_hash_node_new (key, value); - hash_table->nnodes++; - g_hash_table_resize (hash_table); - } -} - -/** - * g_hash_table_replace: - * @hash_table: a #GHashTable. - * @key: a key to insert. - * @value: the value to associate with the key. - * - * Inserts a new key and value into a #GHashTable similar to - * g_hash_table_insert(). The difference is that if the key already exists - * in the #GHashTable, it gets replaced by the new key. If you supplied a - * value_destroy_func when creating the #GHashTable, the old value is freed - * using that function. If you supplied a key_destroy_func when creating the - * #GHashTable, the old key is freed using that function. - **/ -void -g_hash_table_replace (GHashTable *hash_table, - gpointer key, - gpointer value) -{ - GHashNode **node; - - g_return_if_fail (hash_table != NULL); - - node = g_hash_table_lookup_node (hash_table, key); - - if (*node) - { - if (hash_table->key_destroy_func) - hash_table->key_destroy_func ((*node)->key); - - if (hash_table->value_destroy_func) - hash_table->value_destroy_func ((*node)->value); - - (*node)->key = key; - (*node)->value = value; - } - else - { - *node = g_hash_node_new (key, value); - hash_table->nnodes++; - g_hash_table_resize (hash_table); - } -} - -/** - * g_hash_table_remove: - * @hash_table: a #GHashTable. - * @key: the key to remove. - * - * Removes a key and its associated value from a #GHashTable. - * - * If the #GHashTable was created using g_hash_table_new_full(), the - * key and value are freed using the supplied destroy_functions, otherwise - * you have to make sure that any dynamically allocated values are freed - * yourself. - * - * Return value: #TRUE if the key was found and removed from the #GHashTable. - **/ -gboolean -g_hash_table_remove (GHashTable *hash_table, - gconstpointer key) -{ - GHashNode **node, *dest; - - g_return_val_if_fail (hash_table != NULL, FALSE); - - node = g_hash_table_lookup_node (hash_table, key); - if (*node) - { - dest = *node; - (*node) = dest->next; - g_hash_node_destroy (dest, - hash_table->key_destroy_func, - hash_table->value_destroy_func); - hash_table->nnodes--; - - g_hash_table_resize (hash_table); - - return TRUE; - } - - return FALSE; -} - -/** - * g_hash_table_steal: - * @hash_table: a #GHashTable. - * @key: the key to remove. - * - * Removes a key and its associated value from a #GHashTable without - * calling the key and value destroy functions. - * - * Return value: #TRUE if the key was found and removed from the #GHashTable. - **/ -gboolean -g_hash_table_steal (GHashTable *hash_table, - gconstpointer key) -{ - GHashNode **node, *dest; - - g_return_val_if_fail (hash_table != NULL, FALSE); - - node = g_hash_table_lookup_node (hash_table, key); - if (*node) - { - dest = *node; - (*node) = dest->next; - g_hash_node_destroy (dest, NULL, NULL); - hash_table->nnodes--; - - g_hash_table_resize (hash_table); - - return TRUE; - } - - return FALSE; -} - -/** - * g_hash_table_foreach_remove: - * @hash_table: a #GHashTable. - * @func: the function to call for each key/value pair. - * @user_data: user data to pass to the function. - * - * Calls the given function for each key/value pair in the #GHashTable. - * If the function returns TRUE, then the key/value pair is removed from the - * #GHashTable. If you supplied key or value destroy functions when creating - * the #GHashTable, they are used to free the memory allocated for the removed - * keys and values. - * - * Return value: the number of key/value pairs removed. - **/ -guint -g_hash_table_foreach_remove (GHashTable *hash_table, - GHRFunc func, - gpointer user_data) -{ - g_return_val_if_fail (hash_table != NULL, 0); - g_return_val_if_fail (func != NULL, 0); - - return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, TRUE); -} - -/** - * g_hash_table_foreach_steal: - * @hash_table: a #GHashTable. - * @func: the function to call for each key/value pair. - * @user_data: user data to pass to the function. - * - * Calls the given function for each key/value pair in the #GHashTable. - * If the function returns TRUE, then the key/value pair is removed from the - * #GHashTable, but no key or value destroy functions are called. - * - * Return value: the number of key/value pairs removed. - **/ -guint -g_hash_table_foreach_steal (GHashTable *hash_table, - GHRFunc func, - gpointer user_data) -{ - g_return_val_if_fail (hash_table != NULL, 0); - g_return_val_if_fail (func != NULL, 0); - - return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, FALSE); -} - -static guint -g_hash_table_foreach_remove_or_steal (GHashTable *hash_table, - GHRFunc func, - gpointer user_data, - gboolean notify) -{ - GHashNode *node, *prev; - guint i; - guint deleted = 0; - - for (i = 0; i < hash_table->size; i++) - { - restart: - - prev = NULL; - - for (node = hash_table->nodes[i]; node; prev = node, node = node->next) - { - if ((* func) (node->key, node->value, user_data)) - { - deleted += 1; - - hash_table->nnodes -= 1; - - if (prev) - { - prev->next = node->next; - g_hash_node_destroy (node, - notify ? hash_table->value_destroy_func : NULL, - notify ? hash_table->key_destroy_func : NULL); - node = prev; - } - else - { - hash_table->nodes[i] = node->next; - g_hash_node_destroy (node, - notify ? hash_table->value_destroy_func : NULL, - notify ? hash_table->key_destroy_func : NULL); - goto restart; - } - } - } - } - - g_hash_table_resize (hash_table); - - return deleted; -} - -/** - * g_hash_table_foreach: - * @hash_table: a #GHashTable. - * @func: the function to call for each key/value pair. - * @user_data: user data to pass to the function. - * - * Calls the given function for each of the key/value pairs in the #GHashTable. - * The function is passed the key and value of each pair, and the given - * @user_data parameter. - **/ -void -g_hash_table_foreach (GHashTable *hash_table, - GHFunc func, - gpointer user_data) -{ - GHashNode *node; - gint i; - - g_return_if_fail (hash_table != NULL); - g_return_if_fail (func != NULL); - - for (i = 0; i < hash_table->size; i++) - for (node = hash_table->nodes[i]; node; node = node->next) - (* func) (node->key, node->value, user_data); -} - -/** - * g_hash_table_size: - * @hash_table: a #GHashTable. - * - * Returns the number of elements contained in the #GHashTable. - * - * Return value: the number of key/value pairs in the #GHashTable. - **/ -guint -g_hash_table_size (GHashTable *hash_table) -{ - g_return_val_if_fail (hash_table != NULL, 0); - - return hash_table->nnodes; -} - -static void -g_hash_table_resize (GHashTable *hash_table) -{ - GHashNode **new_nodes; - GHashNode *node; - GHashNode *next; - gfloat nodes_per_list; - guint hash_val; - gint new_size; - gint i; - - nodes_per_list = (gfloat) hash_table->nnodes / (gfloat) hash_table->size; - - if ((nodes_per_list > 0.3 || hash_table->size <= HASH_TABLE_MIN_SIZE) && - (nodes_per_list < 3.0 || hash_table->size >= HASH_TABLE_MAX_SIZE)) - return; - - new_size = CLAMP(g_spaced_primes_closest (hash_table->nnodes), - HASH_TABLE_MIN_SIZE, - HASH_TABLE_MAX_SIZE); - new_nodes = g_new0 (GHashNode*, new_size); - - for (i = 0; i < hash_table->size; i++) - for (node = hash_table->nodes[i]; node; node = next) - { - next = node->next; - - hash_val = (* hash_table->hash_func) (node->key) % new_size; - - node->next = new_nodes[hash_val]; - new_nodes[hash_val] = node; - } - - g_free (hash_table->nodes); - hash_table->nodes = new_nodes; - hash_table->size = new_size; -} - -static GHashNode* -g_hash_node_new (gpointer key, - gpointer value) -{ - GHashNode *hash_node; - - G_LOCK (g_hash_global); - if (node_free_list) - { - hash_node = node_free_list; - node_free_list = node_free_list->next; - } - else - { - if (!node_mem_chunk) - node_mem_chunk = g_mem_chunk_new ("hash node mem chunk", - sizeof (GHashNode), - 1024, G_ALLOC_ONLY); - - hash_node = g_chunk_new (GHashNode, node_mem_chunk); - } - G_UNLOCK (g_hash_global); - - hash_node->key = key; - hash_node->value = value; - hash_node->next = NULL; - - return hash_node; -} - -static void -g_hash_node_destroy (GHashNode *hash_node, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func) -{ - if (key_destroy_func) - key_destroy_func (hash_node->key); - if (value_destroy_func) - value_destroy_func (hash_node->value); - -#ifdef ENABLE_GC_FRIENDLY - hash_node->key = NULL; - hash_node->value = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (g_hash_global); - hash_node->next = node_free_list; - node_free_list = hash_node; - G_UNLOCK (g_hash_global); -} - -static void -g_hash_nodes_destroy (GHashNode *hash_node, - GFreeFunc key_destroy_func, - GFreeFunc value_destroy_func) -{ - if (hash_node) - { - GHashNode *node = hash_node; - - while (node->next) - { - if (key_destroy_func) - key_destroy_func (node->key); - if (value_destroy_func) - value_destroy_func (node->value); - -#ifdef ENABLE_GC_FRIENDLY - node->key = NULL; - node->value = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - node = node->next; - } - - if (key_destroy_func) - key_destroy_func (node->key); - if (value_destroy_func) - value_destroy_func (node->value); - -#ifdef ENABLE_GC_FRIENDLY - node->key = NULL; - node->value = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (g_hash_global); - node->next = node_free_list; - node_free_list = hash_node; - G_UNLOCK (g_hash_global); - } -} diff --git a/ghash.h b/ghash.h deleted file mode 100644 index a9af5dc7..00000000 --- a/ghash.h +++ /dev/null @@ -1,108 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_HASH_H__ -#define __G_HASH_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GHashTable GHashTable; - -typedef gboolean (*GHRFunc) (gpointer key, - gpointer value, - gpointer user_data); - -/* Hash tables - */ -GHashTable* g_hash_table_new (GHashFunc hash_func, - GEqualFunc key_equal_func); -GHashTable* g_hash_table_new_full (GHashFunc hash_func, - GEqualFunc key_equal_func, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func); -void g_hash_table_destroy (GHashTable *hash_table); -void g_hash_table_insert (GHashTable *hash_table, - gpointer key, - gpointer value); -void g_hash_table_replace (GHashTable *hash_table, - gpointer key, - gpointer value); -gboolean g_hash_table_remove (GHashTable *hash_table, - gconstpointer key); -gboolean g_hash_table_steal (GHashTable *hash_table, - gconstpointer key); -gpointer g_hash_table_lookup (GHashTable *hash_table, - gconstpointer key); -gboolean g_hash_table_lookup_extended (GHashTable *hash_table, - gconstpointer lookup_key, - gpointer *orig_key, - gpointer *value); -void g_hash_table_foreach (GHashTable *hash_table, - GHFunc func, - gpointer user_data); -guint g_hash_table_foreach_remove (GHashTable *hash_table, - GHRFunc func, - gpointer user_data); -guint g_hash_table_foreach_steal (GHashTable *hash_table, - GHRFunc func, - gpointer user_data); -guint g_hash_table_size (GHashTable *hash_table); - -#ifndef G_DISABLE_DEPRECATED - -/* The following two functions are deprecated and will be removed in - * the next major release. They do no good. */ -#define g_hash_table_freeze(hash_table) ((void)0) -#define g_hash_table_thaw(hash_table) ((void)0) - -#endif /* G_DISABLE_DEPRECATED */ - -/* Hash Functions - */ -gboolean g_str_equal (gconstpointer v, - gconstpointer v2); -guint g_str_hash (gconstpointer v); - -gboolean g_int_equal (gconstpointer v, - gconstpointer v2) G_GNUC_CONST; -guint g_int_hash (gconstpointer v) G_GNUC_CONST; - -/* This "hash" function will just return the key's adress as an - * unsigned integer. Useful for hashing on plain adresses or - * simple integer values. - * passing NULL into g_hash_table_new() as GHashFunc has the - * same effect as passing g_direct_hash(). - */ -guint g_direct_hash (gconstpointer v) G_GNUC_CONST; -gboolean g_direct_equal (gconstpointer v, - gconstpointer v2) G_GNUC_CONST; - -G_END_DECLS - -#endif /* __G_HASH_H__ */ - diff --git a/ghook.c b/ghook.c deleted file mode 100644 index d04162fa..00000000 --- a/ghook.c +++ /dev/null @@ -1,640 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GHook: Callback maintenance functions - * Copyright (C) 1998 Tim Janik - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" - - -/* --- defines --- */ -#define G_HOOKS_PREALLOC (16) - - -/* --- functions --- */ -static void -default_finalize_hook (GHookList *hook_list, - GHook *hook) -{ - GDestroyNotify destroy = hook->destroy; - - if (destroy) - { - hook->destroy = NULL; - destroy (hook->data); - } -} - -void -g_hook_list_init (GHookList *hook_list, - guint hook_size) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_size >= sizeof (GHook)); - g_return_if_fail (hook_size < 65536); - - hook_list->seq_id = 1; - hook_list->hook_size = hook_size; - hook_list->is_setup = TRUE; - hook_list->hooks = NULL; - hook_list->hook_memchunk = g_mem_chunk_new ("GHook Memchunk", - hook_size, - hook_size * G_HOOKS_PREALLOC, - G_ALLOC_AND_FREE); - hook_list->finalize_hook = default_finalize_hook; -} - -void -g_hook_list_clear (GHookList *hook_list) -{ - g_return_if_fail (hook_list != NULL); - - if (hook_list->is_setup) - { - GHook *hook; - - hook_list->is_setup = FALSE; - - hook = hook_list->hooks; - if (!hook) - { - g_mem_chunk_destroy (hook_list->hook_memchunk); - hook_list->hook_memchunk = NULL; - } - else - do - { - GHook *tmp; - - g_hook_ref (hook_list, hook); - g_hook_destroy_link (hook_list, hook); - tmp = hook->next; - g_hook_unref (hook_list, hook); - hook = tmp; - } - while (hook); - if (hook_list->hook_memchunk) - g_warning (G_STRLOC ": failed to clear hooklist, unconsolidated references on hooks left"); - } -} - -GHook* -g_hook_alloc (GHookList *hook_list) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - g_return_val_if_fail (hook_list->is_setup, NULL); - - hook = g_chunk_new0 (GHook, hook_list->hook_memchunk); - hook->data = NULL; - hook->next = NULL; - hook->prev = NULL; - hook->flags = G_HOOK_FLAG_ACTIVE; - hook->ref_count = 0; - hook->hook_id = 0; - hook->func = NULL; - hook->destroy = NULL; - - return hook; -} - -void -g_hook_free (GHookList *hook_list, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - g_return_if_fail (hook != NULL); - g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); - g_return_if_fail (!G_HOOK_IN_CALL (hook)); - - hook_list->finalize_hook (hook_list, hook); - g_chunk_free (hook, hook_list->hook_memchunk); -} - -void -g_hook_destroy_link (GHookList *hook_list, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook != NULL); - - hook->flags &= ~G_HOOK_FLAG_ACTIVE; - if (hook->hook_id) - { - hook->hook_id = 0; - g_hook_unref (hook_list, hook); /* counterpart to g_hook_insert_before */ - } -} - -gboolean -g_hook_destroy (GHookList *hook_list, - gulong hook_id) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, FALSE); - g_return_val_if_fail (hook_id > 0, FALSE); - - hook = g_hook_get (hook_list, hook_id); - if (hook) - { - g_hook_destroy_link (hook_list, hook); - return TRUE; - } - - return FALSE; -} - -void -g_hook_unref (GHookList *hook_list, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->hook_memchunk != NULL); - g_return_if_fail (hook != NULL); - g_return_if_fail (hook->ref_count > 0); - - hook->ref_count--; - if (!hook->ref_count) - { - g_return_if_fail (hook->hook_id == 0); - g_return_if_fail (!G_HOOK_IN_CALL (hook)); - - if (hook->prev) - hook->prev->next = hook->next; - else - hook_list->hooks = hook->next; - if (hook->next) - { - hook->next->prev = hook->prev; - hook->next = NULL; - } - hook->prev = NULL; - - if (!hook_list->is_setup) - { - hook_list->is_setup = TRUE; - g_hook_free (hook_list, hook); - hook_list->is_setup = FALSE; - - if (!hook_list->hooks) - { - g_mem_chunk_destroy (hook_list->hook_memchunk); - hook_list->hook_memchunk = NULL; - } - } - else - g_hook_free (hook_list, hook); - } -} - -void -g_hook_ref (GHookList *hook_list, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook != NULL); - g_return_if_fail (hook->ref_count > 0); - - hook->ref_count++; -} - -void -g_hook_prepend (GHookList *hook_list, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - - g_hook_insert_before (hook_list, hook_list->hooks, hook); -} - -void -g_hook_insert_before (GHookList *hook_list, - GHook *sibling, - GHook *hook) -{ - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - g_return_if_fail (hook != NULL); - g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); - g_return_if_fail (hook->ref_count == 0); - - hook->hook_id = hook_list->seq_id++; - hook->ref_count = 1; /* counterpart to g_hook_destroy_link */ - - if (sibling) - { - if (sibling->prev) - { - hook->prev = sibling->prev; - hook->prev->next = hook; - hook->next = sibling; - sibling->prev = hook; - } - else - { - hook_list->hooks = hook; - hook->next = sibling; - sibling->prev = hook; - } - } - else - { - if (hook_list->hooks) - { - sibling = hook_list->hooks; - while (sibling->next) - sibling = sibling->next; - hook->prev = sibling; - sibling->next = hook; - } - else - hook_list->hooks = hook; - } -} - -void -g_hook_list_invoke (GHookList *hook_list, - gboolean may_recurse) -{ - GHook *hook; - - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - - hook = g_hook_first_valid (hook_list, may_recurse); - while (hook) - { - GHookFunc func; - gboolean was_in_call; - - func = (GHookFunc) hook->func; - - was_in_call = G_HOOK_IN_CALL (hook); - hook->flags |= G_HOOK_FLAG_IN_CALL; - func (hook->data); - if (!was_in_call) - hook->flags &= ~G_HOOK_FLAG_IN_CALL; - - hook = g_hook_next_valid (hook_list, hook, may_recurse); - } -} - -void -g_hook_list_invoke_check (GHookList *hook_list, - gboolean may_recurse) -{ - GHook *hook; - - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - - hook = g_hook_first_valid (hook_list, may_recurse); - while (hook) - { - GHookCheckFunc func; - gboolean was_in_call; - gboolean need_destroy; - - func = (GHookCheckFunc) hook->func; - - was_in_call = G_HOOK_IN_CALL (hook); - hook->flags |= G_HOOK_FLAG_IN_CALL; - need_destroy = !func (hook->data); - if (!was_in_call) - hook->flags &= ~G_HOOK_FLAG_IN_CALL; - if (need_destroy) - g_hook_destroy_link (hook_list, hook); - - hook = g_hook_next_valid (hook_list, hook, may_recurse); - } -} - -void -g_hook_list_marshal_check (GHookList *hook_list, - gboolean may_recurse, - GHookCheckMarshaller marshaller, - gpointer data) -{ - GHook *hook; - - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - g_return_if_fail (marshaller != NULL); - - hook = g_hook_first_valid (hook_list, may_recurse); - while (hook) - { - gboolean was_in_call; - gboolean need_destroy; - - was_in_call = G_HOOK_IN_CALL (hook); - hook->flags |= G_HOOK_FLAG_IN_CALL; - need_destroy = !marshaller (hook, data); - if (!was_in_call) - hook->flags &= ~G_HOOK_FLAG_IN_CALL; - if (need_destroy) - g_hook_destroy_link (hook_list, hook); - - hook = g_hook_next_valid (hook_list, hook, may_recurse); - } -} - -void -g_hook_list_marshal (GHookList *hook_list, - gboolean may_recurse, - GHookMarshaller marshaller, - gpointer data) -{ - GHook *hook; - - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - g_return_if_fail (marshaller != NULL); - - hook = g_hook_first_valid (hook_list, may_recurse); - while (hook) - { - gboolean was_in_call; - - was_in_call = G_HOOK_IN_CALL (hook); - hook->flags |= G_HOOK_FLAG_IN_CALL; - marshaller (hook, data); - if (!was_in_call) - hook->flags &= ~G_HOOK_FLAG_IN_CALL; - - hook = g_hook_next_valid (hook_list, hook, may_recurse); - } -} - -GHook* -g_hook_first_valid (GHookList *hook_list, - gboolean may_be_in_call) -{ - g_return_val_if_fail (hook_list != NULL, NULL); - - if (hook_list->is_setup) - { - GHook *hook; - - hook = hook_list->hooks; - if (hook) - { - g_hook_ref (hook_list, hook); - if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) - return hook; - else - return g_hook_next_valid (hook_list, hook, may_be_in_call); - } - } - - return NULL; -} - -GHook* -g_hook_next_valid (GHookList *hook_list, - GHook *hook, - gboolean may_be_in_call) -{ - GHook *ohook = hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - - if (!hook) - return NULL; - - hook = hook->next; - while (hook) - { - if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) - { - g_hook_ref (hook_list, hook); - g_hook_unref (hook_list, ohook); - - return hook; - } - hook = hook->next; - } - g_hook_unref (hook_list, ohook); - - return NULL; -} - -GHook* -g_hook_get (GHookList *hook_list, - gulong hook_id) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - g_return_val_if_fail (hook_id > 0, NULL); - - hook = hook_list->hooks; - while (hook) - { - if (hook->hook_id == hook_id) - return hook; - hook = hook->next; - } - - return NULL; -} - -GHook* -g_hook_find (GHookList *hook_list, - gboolean need_valids, - GHookFindFunc func, - gpointer data) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - hook = hook_list->hooks; - while (hook) - { - GHook *tmp; - - /* test only non-destroyed hooks */ - if (!hook->hook_id) - { - hook = hook->next; - continue; - } - - g_hook_ref (hook_list, hook); - - if (func (hook, data) && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) - { - g_hook_unref (hook_list, hook); - - return hook; - } - - tmp = hook->next; - g_hook_unref (hook_list, hook); - hook = tmp; - } - - return NULL; -} - -GHook* -g_hook_find_data (GHookList *hook_list, - gboolean need_valids, - gpointer data) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - - hook = hook_list->hooks; - while (hook) - { - /* test only non-destroyed hooks */ - if (hook->data == data && - hook->hook_id && - (!need_valids || G_HOOK_ACTIVE (hook))) - return hook; - - hook = hook->next; - } - - return NULL; -} - -GHook* -g_hook_find_func (GHookList *hook_list, - gboolean need_valids, - gpointer func) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - hook = hook_list->hooks; - while (hook) - { - /* test only non-destroyed hooks */ - if (hook->func == func && - hook->hook_id && - (!need_valids || G_HOOK_ACTIVE (hook))) - return hook; - - hook = hook->next; - } - - return NULL; -} - -GHook* -g_hook_find_func_data (GHookList *hook_list, - gboolean need_valids, - gpointer func, - gpointer data) -{ - GHook *hook; - - g_return_val_if_fail (hook_list != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - hook = hook_list->hooks; - while (hook) - { - /* test only non-destroyed hooks */ - if (hook->data == data && - hook->func == func && - hook->hook_id && - (!need_valids || G_HOOK_ACTIVE (hook))) - return hook; - - hook = hook->next; - } - - return NULL; -} - -void -g_hook_insert_sorted (GHookList *hook_list, - GHook *hook, - GHookCompareFunc func) -{ - GHook *sibling; - - g_return_if_fail (hook_list != NULL); - g_return_if_fail (hook_list->is_setup); - g_return_if_fail (hook != NULL); - g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); - g_return_if_fail (hook->func != NULL); - g_return_if_fail (func != NULL); - - /* first non-destroyed hook */ - sibling = hook_list->hooks; - while (sibling && !sibling->hook_id) - sibling = sibling->next; - - while (sibling) - { - GHook *tmp; - - g_hook_ref (hook_list, sibling); - if (func (hook, sibling) <= 0 && sibling->hook_id) - { - g_hook_unref (hook_list, sibling); - break; - } - - /* next non-destroyed hook */ - tmp = sibling->next; - while (tmp && !tmp->hook_id) - tmp = tmp->next; - - g_hook_unref (hook_list, sibling); - sibling = tmp; - } - - g_hook_insert_before (hook_list, sibling, hook); -} - -gint -g_hook_compare_ids (GHook *new_hook, - GHook *sibling) -{ - if (new_hook->hook_id < sibling->hook_id) - return -1; - else if (new_hook->hook_id > sibling->hook_id) - return 1; - - return 0; -} diff --git a/ghook.h b/ghook.h deleted file mode 100644 index 8942e5ad..00000000 --- a/ghook.h +++ /dev/null @@ -1,177 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_HOOK_H__ -#define __G_HOOK_H__ - -#include - -G_BEGIN_DECLS - - -/* --- typedefs --- */ -typedef struct _GHook GHook; -typedef struct _GHookList GHookList; - -typedef gint (*GHookCompareFunc) (GHook *new_hook, - GHook *sibling); -typedef gboolean (*GHookFindFunc) (GHook *hook, - gpointer data); -typedef void (*GHookMarshaller) (GHook *hook, - gpointer marshal_data); -typedef gboolean (*GHookCheckMarshaller) (GHook *hook, - gpointer marshal_data); -typedef void (*GHookFunc) (gpointer data); -typedef gboolean (*GHookCheckFunc) (gpointer data); -typedef void (*GHookFinalizeFunc) (GHookList *hook_list, - GHook *hook); -typedef enum -{ - G_HOOK_FLAG_ACTIVE = 1 << 0, - G_HOOK_FLAG_IN_CALL = 1 << 1, - G_HOOK_FLAG_MASK = 0x0f -} GHookFlagMask; -#define G_HOOK_FLAG_USER_SHIFT (4) - - -/* --- structures --- */ -struct _GHookList -{ - gulong seq_id; - guint hook_size : 16; - guint is_setup : 1; - GHook *hooks; - GMemChunk *hook_memchunk; - GHookFinalizeFunc finalize_hook; -}; -struct _GHook -{ - gpointer data; - GHook *next; - GHook *prev; - guint ref_count; - gulong hook_id; - guint flags; - gpointer func; - GDestroyNotify destroy; -}; - - -/* --- macros --- */ -#define G_HOOK(hook) ((GHook*) (hook)) -#define G_HOOK_FLAGS(hook) (G_HOOK (hook)->flags) -#define G_HOOK_ACTIVE(hook) ((G_HOOK_FLAGS (hook) & \ - G_HOOK_FLAG_ACTIVE) != 0) -#define G_HOOK_IN_CALL(hook) ((G_HOOK_FLAGS (hook) & \ - G_HOOK_FLAG_IN_CALL) != 0) -#define G_HOOK_IS_VALID(hook) (G_HOOK (hook)->hook_id != 0 && \ - (G_HOOK_FLAGS (hook) & \ - G_HOOK_FLAG_ACTIVE)) -#define G_HOOK_IS_UNLINKED(hook) (G_HOOK (hook)->next == NULL && \ - G_HOOK (hook)->prev == NULL && \ - G_HOOK (hook)->hook_id == 0 && \ - G_HOOK (hook)->ref_count == 0) - - -/* --- prototypes --- */ -/* callback mainenance functions */ -void g_hook_list_init (GHookList *hook_list, - guint hook_size); -void g_hook_list_clear (GHookList *hook_list); -GHook* g_hook_alloc (GHookList *hook_list); -void g_hook_free (GHookList *hook_list, - GHook *hook); -void g_hook_ref (GHookList *hook_list, - GHook *hook); -void g_hook_unref (GHookList *hook_list, - GHook *hook); -gboolean g_hook_destroy (GHookList *hook_list, - gulong hook_id); -void g_hook_destroy_link (GHookList *hook_list, - GHook *hook); -void g_hook_prepend (GHookList *hook_list, - GHook *hook); -void g_hook_insert_before (GHookList *hook_list, - GHook *sibling, - GHook *hook); -void g_hook_insert_sorted (GHookList *hook_list, - GHook *hook, - GHookCompareFunc func); -GHook* g_hook_get (GHookList *hook_list, - gulong hook_id); -GHook* g_hook_find (GHookList *hook_list, - gboolean need_valids, - GHookFindFunc func, - gpointer data); -GHook* g_hook_find_data (GHookList *hook_list, - gboolean need_valids, - gpointer data); -GHook* g_hook_find_func (GHookList *hook_list, - gboolean need_valids, - gpointer func); -GHook* g_hook_find_func_data (GHookList *hook_list, - gboolean need_valids, - gpointer func, - gpointer data); -/* return the first valid hook, and increment its reference count */ -GHook* g_hook_first_valid (GHookList *hook_list, - gboolean may_be_in_call); -/* return the next valid hook with incremented reference count, and - * decrement the reference count of the original hook - */ -GHook* g_hook_next_valid (GHookList *hook_list, - GHook *hook, - gboolean may_be_in_call); -/* GHookCompareFunc implementation to insert hooks sorted by their id */ -gint g_hook_compare_ids (GHook *new_hook, - GHook *sibling); -/* convenience macros */ -#define g_hook_append( hook_list, hook ) \ - g_hook_insert_before ((hook_list), NULL, (hook)) -/* invoke all valid hooks with the (*GHookFunc) signature. - */ -void g_hook_list_invoke (GHookList *hook_list, - gboolean may_recurse); -/* invoke all valid hooks with the (*GHookCheckFunc) signature, - * and destroy the hook if FALSE is returned. - */ -void g_hook_list_invoke_check (GHookList *hook_list, - gboolean may_recurse); -/* invoke a marshaller on all valid hooks. - */ -void g_hook_list_marshal (GHookList *hook_list, - gboolean may_recurse, - GHookMarshaller marshaller, - gpointer marshal_data); -void g_hook_list_marshal_check (GHookList *hook_list, - gboolean may_recurse, - GHookCheckMarshaller marshaller, - gpointer marshal_data); - -G_END_DECLS - -#endif /* __G_HOOK_H__ */ - diff --git a/giochannel.c b/giochannel.c deleted file mode 100644 index a4d09b74..00000000 --- a/giochannel.c +++ /dev/null @@ -1,148 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * giochannel.c: IO Channel abstraction - * Copyright 1998 Owen Taylor - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "config.h" - -#include "glib.h" -#ifdef HAVE_UNISTD_H -#include -#endif - -void -g_io_channel_init (GIOChannel *channel) -{ - channel->channel_flags = 0; - channel->ref_count = 1; -} - - -void -g_io_channel_ref (GIOChannel *channel) -{ - g_return_if_fail (channel != NULL); - - channel->ref_count++; -} - -void -g_io_channel_unref (GIOChannel *channel) -{ - g_return_if_fail (channel != NULL); - - channel->ref_count--; - if (channel->ref_count == 0) - channel->funcs->io_free (channel); -} - -GIOError -g_io_channel_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) -{ - g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); - - return channel->funcs->io_read (channel, buf, count, bytes_read); -} - -GIOError -g_io_channel_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) -{ - g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); - - return channel->funcs->io_write (channel, buf, count, bytes_written); -} - -GIOError -g_io_channel_seek (GIOChannel *channel, - gint offset, - GSeekType type) -{ - g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); - - return channel->funcs->io_seek (channel, offset, type); -} - -void -g_io_channel_close (GIOChannel *channel) -{ - g_return_if_fail (channel != NULL); - - channel->funcs->io_close (channel); -} - -GSource * -g_io_create_watch (GIOChannel *channel, - GIOCondition condition) -{ - g_return_val_if_fail (channel != NULL, NULL); - - return channel->funcs->io_create_watch (channel, condition); -} - -guint -g_io_add_watch_full (GIOChannel *channel, - gint priority, - GIOCondition condition, - GIOFunc func, - gpointer user_data, - GDestroyNotify notify) -{ - GSource *source; - guint id; - - g_return_val_if_fail (channel != NULL, 0); - - source = g_io_create_watch (channel, condition); - - if (priority != G_PRIORITY_DEFAULT) - g_source_set_priority (source, priority); - g_source_set_callback (source, (GSourceFunc)func, user_data, notify); - - id = g_source_attach (source, NULL); - g_source_unref (source); - - return id; -} - -guint -g_io_add_watch (GIOChannel *channel, - GIOCondition condition, - GIOFunc func, - gpointer user_data) -{ - return g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition, func, user_data, NULL); -} diff --git a/giochannel.h b/giochannel.h deleted file mode 100644 index ed9c7c8c..00000000 --- a/giochannel.h +++ /dev/null @@ -1,197 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_IOCHANNEL_H__ -#define __G_IOCHANNEL_H__ - -#include -#include - -G_BEGIN_DECLS - -/* GIOChannel - */ - -typedef struct _GIOChannel GIOChannel; -typedef struct _GIOFuncs GIOFuncs; -typedef enum -{ - G_IO_ERROR_NONE, - G_IO_ERROR_AGAIN, - G_IO_ERROR_INVAL, - G_IO_ERROR_UNKNOWN -} GIOError; -typedef enum -{ - G_SEEK_CUR, - G_SEEK_SET, - G_SEEK_END -} GSeekType; -typedef enum -{ - G_IO_IN GLIB_SYSDEF_POLLIN, - G_IO_OUT GLIB_SYSDEF_POLLOUT, - G_IO_PRI GLIB_SYSDEF_POLLPRI, - G_IO_ERR GLIB_SYSDEF_POLLERR, - G_IO_HUP GLIB_SYSDEF_POLLHUP, - G_IO_NVAL GLIB_SYSDEF_POLLNVAL -} GIOCondition; - -struct _GIOChannel -{ - guint channel_flags; - guint ref_count; - GIOFuncs *funcs; -}; - -typedef gboolean (*GIOFunc) (GIOChannel *source, - GIOCondition condition, - gpointer data); -struct _GIOFuncs -{ - GIOError (*io_read) (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read); - GIOError (*io_write) (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written); - GIOError (*io_seek) (GIOChannel *channel, - gint offset, - GSeekType type); - void (*io_close) (GIOChannel *channel); - GSource * (*io_create_watch) (GIOChannel *channel, - GIOCondition condition); - void (*io_free) (GIOChannel *channel); -}; - -void g_io_channel_init (GIOChannel *channel); -void g_io_channel_ref (GIOChannel *channel); -void g_io_channel_unref (GIOChannel *channel); -GIOError g_io_channel_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read); -GIOError g_io_channel_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written); -GIOError g_io_channel_seek (GIOChannel *channel, - gint offset, - GSeekType type); -void g_io_channel_close (GIOChannel *channel); -guint g_io_add_watch_full (GIOChannel *channel, - gint priority, - GIOCondition condition, - GIOFunc func, - gpointer user_data, - GDestroyNotify notify); -GSource *g_io_create_watch (GIOChannel *channel, - GIOCondition condition); -guint g_io_add_watch (GIOChannel *channel, - GIOCondition condition, - GIOFunc func, - gpointer user_data); - -/* On Unix, IO channels created with this function for any file - * descriptor or socket. - * - * On Win32, this can be used either for files opened with the MSVCRT - * (the Microsoft run-time C library) _open() or _pipe, including file - * descriptors 0, 1 and 2 (corresponding to stdin, stdout and stderr), - * or for Winsock SOCKETs. If the parameter is a legal file - * descriptor, it is assumed to be such, otherwise it should be a - * SOCKET. This relies on SOCKETs and file descriptors not - * overlapping. If you want to be certain, call either - * g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket() - * instead as appropriate. - * - * The term file descriptor as used in the context of Win32 refers to - * the emulated Unix-like file descriptors MSVCRT provides. The native - * corresponding concept is file HANDLE. There isn't as of yet a way to - * get GIOChannels for Win32 file HANDLEs. - */ -GIOChannel* g_io_channel_unix_new (int fd); -gint g_io_channel_unix_get_fd (GIOChannel *channel); - -#ifdef G_OS_WIN32 - -#define G_WIN32_MSG_HANDLE 19981206 - -/* Use this to get a GPollFD from a GIOChannel, so that you can call - * g_io_channel_win32_poll(). After calling this you should only use - * g_io_channel_read() to read from the GIOChannel, i.e. never read() - * from the underlying file descriptor. For SOCKETs, it is possible to call - * recv(). - */ -void g_io_channel_win32_make_pollfd (GIOChannel *channel, - GIOCondition condition, - GPollFD *fd); - -/* This can be used to wait a until at least one of the channels is readable. - * On Unix you would do a select() on the file descriptors of the channels. - */ -gint g_io_channel_win32_poll (GPollFD *fds, - gint n_fds, - gint timeout); - -/* This is used to add polling for Windows messages. GDK (GTk+) programs - * should *not* use this. - */ -void g_main_poll_win32_msg_add (gint priority, - GPollFD *fd, - guint hwnd); - -/* Create an IO channel for Windows messages for window handle hwnd. */ -GIOChannel *g_io_channel_win32_new_messages (guint hwnd); - -/* Create an IO channel for C runtime (emulated Unix-like) file - * descriptors. After calling g_io_add_watch() on a IO channel - * returned by this function, you shouldn't call read() on the file - * descriptor. This is because adding polling for a file descriptor is - * implemented on Win32 by starting a thread that sits blocked in a - * read() from the file descriptor most of the time. All reads from - * the file descriptor should be done by this internal GLib - * thread. Your code should call only g_io_channel_read(). - */ -GIOChannel* g_io_channel_win32_new_fd (int fd); - -/* Get the C runtime file descriptor of a channel. */ -gint g_io_channel_win32_get_fd (GIOChannel *channel); - -/* Create an IO channel for a winsock socket. The parameter should be - * a SOCKET. Contrary to IO channels for file descriptors (on *Win32), - * you can use normal recv() or recvfrom() on sockets even if GLib - * is polling them. - */ -GIOChannel *g_io_channel_win32_new_socket (gint socket); - -#endif - -G_END_DECLS - -#endif /* __G_IOCHANNEL_H__ */ diff --git a/giounix.c b/giounix.c deleted file mode 100644 index ca98e0c8..00000000 --- a/giounix.c +++ /dev/null @@ -1,312 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * giounix.c: IO Channels using unix file descriptors - * Copyright 1998 Owen Taylor - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" -#include -#include -#include - -/* - * Unix IO Channels - */ - -typedef struct _GIOUnixChannel GIOUnixChannel; -typedef struct _GIOUnixWatch GIOUnixWatch; - -struct _GIOUnixChannel -{ - GIOChannel channel; - gint fd; -}; - -struct _GIOUnixWatch -{ - GSource source; - GPollFD pollfd; - GIOChannel *channel; - GIOCondition condition; - GIOFunc callback; -}; - - -static GIOError g_io_unix_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written); -static GIOError g_io_unix_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written); -static GIOError g_io_unix_seek (GIOChannel *channel, - gint offset, - GSeekType type); -static void g_io_unix_close (GIOChannel *channel); -static void g_io_unix_free (GIOChannel *channel); -static GSource *g_io_unix_create_watch (GIOChannel *channel, - GIOCondition condition); - -static gboolean g_io_unix_prepare (GSource *source, - gint *timeout); -static gboolean g_io_unix_check (GSource *source); -static gboolean g_io_unix_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data); -static void g_io_unix_destroy (GSource *source); - -GSourceFuncs unix_watch_funcs = { - g_io_unix_prepare, - g_io_unix_check, - g_io_unix_dispatch, - g_io_unix_destroy -}; - -GIOFuncs unix_channel_funcs = { - g_io_unix_read, - g_io_unix_write, - g_io_unix_seek, - g_io_unix_close, - g_io_unix_create_watch, - g_io_unix_free, -}; - -static gboolean -g_io_unix_prepare (GSource *source, - gint *timeout) -{ - *timeout = -1; - return FALSE; -} - -static gboolean -g_io_unix_check (GSource *source) -{ - GIOUnixWatch *watch = (GIOUnixWatch *)source; - - return (watch->pollfd.revents & watch->condition); -} - -static gboolean -g_io_unix_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) - -{ - GIOFunc func = (GIOFunc)callback; - GIOUnixWatch *watch = (GIOUnixWatch *)source; - - if (!func) - { - g_warning ("IO watch dispatched without callback\n" - "You must call g_source_connect()."); - return FALSE; - } - - return (*func) (watch->channel, - watch->pollfd.revents & watch->condition, - user_data); -} - -static void -g_io_unix_destroy (GSource *source) -{ - GIOUnixWatch *watch = (GIOUnixWatch *)source; - - g_io_channel_unref (watch->channel); -} - -static GIOError -g_io_unix_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - gint result; - - result = read (unix_channel->fd, buf, count); - - if (result < 0) - { - *bytes_read = 0; - switch (errno) - { - case EINVAL: - return G_IO_ERROR_INVAL; - case EAGAIN: - case EINTR: - return G_IO_ERROR_AGAIN; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - { - *bytes_read = result; - return G_IO_ERROR_NONE; - } -} - -static GIOError -g_io_unix_write(GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - gint result; - - result = write (unix_channel->fd, buf, count); - - if (result < 0) - { - *bytes_written = 0; - switch (errno) - { - case EINVAL: - return G_IO_ERROR_INVAL; - case EAGAIN: - case EINTR: - return G_IO_ERROR_AGAIN; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - { - *bytes_written = result; - return G_IO_ERROR_NONE; - } -} - -static GIOError -g_io_unix_seek (GIOChannel *channel, - gint offset, - GSeekType type) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - int whence; - off_t result; - - switch (type) - { - case G_SEEK_SET: - whence = SEEK_SET; - break; - case G_SEEK_CUR: - whence = SEEK_CUR; - break; - case G_SEEK_END: - whence = SEEK_END; - break; - default: - g_warning ("g_io_unix_seek: unknown seek type"); - return G_IO_ERROR_UNKNOWN; - } - - result = lseek (unix_channel->fd, offset, whence); - - if (result < 0) - { - switch (errno) - { - case EINVAL: - return G_IO_ERROR_INVAL; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - return G_IO_ERROR_NONE; -} - - -static void -g_io_unix_close (GIOChannel *channel) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - - close (unix_channel->fd); -} - -static void -g_io_unix_free (GIOChannel *channel) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - - g_free (unix_channel); -} - -static GSource * -g_io_unix_create_watch (GIOChannel *channel, - GIOCondition condition) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - GSource *source; - GIOUnixWatch *watch; - - - source = g_source_new (&unix_watch_funcs, sizeof (GIOUnixWatch)); - watch = (GIOUnixWatch *)source; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->condition = condition; - - watch->pollfd.fd = unix_channel->fd; - watch->pollfd.events = condition; - - g_source_add_poll (source, &watch->pollfd); - - return source; -} - -GIOChannel * -g_io_channel_unix_new (gint fd) -{ - GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1); - GIOChannel *channel = (GIOChannel *)unix_channel; - - g_io_channel_init (channel); - channel->funcs = &unix_channel_funcs; - - unix_channel->fd = fd; - return channel; -} - -gint -g_io_channel_unix_get_fd (GIOChannel *channel) -{ - GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; - return unix_channel->fd; -} diff --git a/giowin32.c b/giowin32.c deleted file mode 100644 index 30507fd5..00000000 --- a/giowin32.c +++ /dev/null @@ -1,1179 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * giowin32.c: IO Channels for Win32. - * Copyright 1998 Owen Taylor and Tor Lillqvist - * Copyright 1999-2000 Tor Lillqvist and Craig Setera - * Copyright 2001 Andrew Lanoix - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* Define this to get (very) verbose logging of all channels */ -/* #define G_IO_WIN32_DEBUG */ - -#include "glib.h" - -#include -#include -#include /* Not everybody has winsock2 */ -#include -#include -#include -#include -#include - -typedef struct _GIOWin32Channel GIOWin32Channel; -typedef struct _GIOWin32Watch GIOWin32Watch; - -#define BUFFER_SIZE 4096 - -typedef enum { - G_IO_WIN32_WINDOWS_MESSAGES, /* Windows messages */ - G_IO_WIN32_FILE_DESC, /* Unix-like file descriptors from - * _open() or _pipe(). Read with read(). - * Have to create separate thread to read. - */ - G_IO_WIN32_SOCKET /* Sockets. A separate thread is blocked - * in select() most of the time. - */ -} GIOWin32ChannelType; - -struct _GIOWin32Channel { - GIOChannel channel; - gint fd; /* Either a Unix-like file handle as provided - * by the Microsoft C runtime, or a SOCKET - * as provided by WinSock. - */ - GIOWin32ChannelType type; - - gboolean debug; - - CRITICAL_SECTION mutex; - - /* This is used by G_IO_WIN32_WINDOWS_MESSAGES channels */ - HWND hwnd; /* handle of window, or NULL */ - - /* Following fields are used by both fd and socket channels. */ - gboolean running; /* Is reader thread running. FALSE if - * EOF has been reached. - */ - gboolean needs_close; /* If the channel has been closed while - * the reader thread was still running. - */ - guint thread_id; /* If non-NULL has a reader thread, or has - * had.*/ - HANDLE thread_handle; - HANDLE data_avail_event; - - gushort revents; - - /* Following fields used by fd channels for input */ - - /* Data is kept in a circular buffer. To be able to distinguish between - * empty and full buffer, we cannot fill it completely, but have to - * leave a one character gap. - * - * Data available is between indexes rdp and wrp-1 (modulo BUFFER_SIZE). - * - * Empty: wrp == rdp - * Full: (wrp + 1) % BUFFER_SIZE == rdp - * Partial: otherwise - */ - guchar *buffer; /* (Circular) buffer */ - gint wrp, rdp; /* Buffer indices for writing and reading */ - HANDLE space_avail_event; - - /* Following fields used by socket channels */ - GSList *watches; - HANDLE data_avail_noticed_event; -}; - -#define LOCK(mutex) EnterCriticalSection (&mutex) -#define UNLOCK(mutex) LeaveCriticalSection (&mutex) - -struct _GIOWin32Watch { - GSource source; - GPollFD pollfd; - GIOChannel *channel; - GIOCondition condition; - GIOFunc callback; -}; - -static void -g_io_channel_win32_init (GIOWin32Channel *channel) -{ -#ifdef G_IO_WIN32_DEBUG - channel->debug = TRUE; -#else - if (getenv ("G_IO_WIN32_DEBUG") != NULL) - channel->debug = TRUE; - else - channel->debug = FALSE; -#endif - channel->buffer = NULL; - channel->running = FALSE; - channel->needs_close = FALSE; - channel->thread_id = 0; - channel->data_avail_event = NULL; - channel->revents = 0; - channel->space_avail_event = NULL; - channel->data_avail_noticed_event = NULL; - channel->watches = NULL; - InitializeCriticalSection (&channel->mutex); -} - -static void -create_events (GIOWin32Channel *channel) -{ - SECURITY_ATTRIBUTES sec_attrs; - - sec_attrs.nLength = sizeof(SECURITY_ATTRIBUTES); - sec_attrs.lpSecurityDescriptor = NULL; - sec_attrs.bInheritHandle = FALSE; - - /* The data available event is manual reset, the space available event - * is automatic reset. - */ - if (!(channel->data_avail_event = CreateEvent (&sec_attrs, TRUE, FALSE, NULL)) - || !(channel->space_avail_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL)) - || !(channel->data_avail_noticed_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL))) - { - gchar *msg = g_win32_error_message (GetLastError ()); - g_error ("Error creating event: %s", msg); - } -} - -static unsigned __stdcall -read_thread (void *parameter) -{ - GIOWin32Channel *channel = parameter; - GSList *tmp; - guchar *buffer; - guint nbytes; - - g_io_channel_ref ((GIOChannel *)channel); - - if (channel->debug) - g_print ("read_thread %#x: start fd:%d, data_avail:%#x, space_avail:%#x\n", - channel->thread_id, - channel->fd, - (guint) channel->data_avail_event, - (guint) channel->space_avail_event); - - channel->buffer = g_malloc (BUFFER_SIZE); - channel->rdp = channel->wrp = 0; - channel->running = TRUE; - - SetEvent (channel->space_avail_event); - - while (channel->running) - { - LOCK (channel->mutex); - if (channel->debug) - g_print ("read_thread %#x: rdp=%d, wrp=%d\n", - channel->thread_id, channel->rdp, channel->wrp); - if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) - { - /* Buffer is full */ - if (channel->debug) - g_print ("read_thread %#x: resetting space_avail\n", - channel->thread_id); - ResetEvent (channel->space_avail_event); - if (channel->debug) - g_print ("read_thread %#x: waiting for space\n", - channel->thread_id); - UNLOCK (channel->mutex); - WaitForSingleObject (channel->space_avail_event, INFINITE); - LOCK (channel->mutex); - if (channel->debug) - g_print ("read_thread %#x: rdp=%d, wrp=%d\n", - channel->thread_id, channel->rdp, channel->wrp); - } - - buffer = channel->buffer + channel->wrp; - - /* Always leave at least one byte unused gap to be able to - * distinguish between the full and empty condition... - */ - nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE, - BUFFER_SIZE - channel->wrp); - - if (channel->debug) - g_print ("read_thread %#x: calling read() for %d bytes\n", - channel->thread_id, nbytes); - - UNLOCK (channel->mutex); - - nbytes = read (channel->fd, buffer, nbytes); - - LOCK (channel->mutex); - - channel->revents = G_IO_IN; - if (nbytes == 0) - channel->revents |= G_IO_HUP; - else if (nbytes < 0) - channel->revents |= G_IO_ERR; - - if (channel->debug) - g_print ("read_thread %#x: read() returned %d, rdp=%d, wrp=%d\n", - channel->thread_id, nbytes, channel->rdp, channel->wrp); - - if (nbytes <= 0) - break; - - channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE; - if (channel->debug) - g_print ("read_thread %#x: rdp=%d, wrp=%d, setting data_avail\n", - channel->thread_id, channel->rdp, channel->wrp); - SetEvent (channel->data_avail_event); - UNLOCK (channel->mutex); - } - - channel->running = FALSE; - if (channel->needs_close) - { - if (channel->debug) - g_print ("read_thread %#x: channel fd %d needs closing\n", - channel->thread_id, channel->fd); - close (channel->fd); - channel->fd = -1; - } - - if (channel->debug) - g_print ("read_thread %#x: EOF, rdp=%d, wrp=%d, setting data_avail\n", - channel->thread_id, channel->rdp, channel->wrp); - SetEvent (channel->data_avail_event); - UNLOCK (channel->mutex); - - g_io_channel_unref((GIOChannel *)channel); - - /* No need to call _endthreadex(), the actual thread starter routine - * in MSVCRT (see crt/src/threadex.c:_threadstartex) calls - * _endthreadex() for us. - */ - - CloseHandle (channel->thread_handle); - - return 0; -} - -static void -create_thread (GIOWin32Channel *channel, - GIOCondition condition, - unsigned (__stdcall *thread) (void *parameter)) -{ - channel->thread_handle = - (HANDLE) _beginthreadex (NULL, 0, thread, channel, 0, - &channel->thread_id); - if (channel->thread_handle == 0) - g_warning (G_STRLOC ": Error creating reader thread: %s", - strerror (errno)); - WaitForSingleObject (channel->space_avail_event, INFINITE); -} - -static int -buffer_read (GIOWin32Channel *channel, - guchar *dest, - guint count, - GIOError *error) -{ - guint nbytes; - guint left = count; - - LOCK (channel->mutex); - if (channel->debug) - g_print ("reading from thread %#x %d bytes, rdp=%d, wrp=%d\n", - channel->thread_id, count, channel->rdp, channel->wrp); - - if (channel->wrp == channel->rdp) - { - UNLOCK (channel->mutex); - if (channel->debug) - g_print ("waiting for data from thread %#x\n", channel->thread_id); - WaitForSingleObject (channel->data_avail_event, INFINITE); - if (channel->debug) - g_print ("done waiting for data from thread %#x\n", channel->thread_id); - LOCK (channel->mutex); - if (channel->wrp == channel->rdp && !channel->running) - { - UNLOCK (channel->mutex); - return 0; - } - } - - if (channel->rdp < channel->wrp) - nbytes = channel->wrp - channel->rdp; - else - nbytes = BUFFER_SIZE - channel->rdp; - UNLOCK (channel->mutex); - nbytes = MIN (left, nbytes); - if (channel->debug) - g_print ("moving %d bytes from thread %#x\n", - nbytes, channel->thread_id); - memcpy (dest, channel->buffer + channel->rdp, nbytes); - dest += nbytes; - left -= nbytes; - LOCK (channel->mutex); - channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE; - if (channel->debug) - g_print ("setting space_avail for thread %#x\n", channel->thread_id); - SetEvent (channel->space_avail_event); - if (channel->debug) - g_print ("for thread %#x: rdp=%d, wrp=%d\n", - channel->thread_id, channel->rdp, channel->wrp); - if (channel->running && channel->wrp == channel->rdp) - { - if (channel->debug) - g_print ("resetting data_avail of thread %#x\n", - channel->thread_id); - ResetEvent (channel->data_avail_event); - }; - UNLOCK (channel->mutex); - - /* We have no way to indicate any errors form the actual - * read() or recv() call in the reader thread. Should we have? - */ - *error = G_IO_ERROR_NONE; - return count - left; -} - -static unsigned __stdcall -select_thread (void *parameter) -{ - GIOWin32Channel *channel = parameter; - fd_set read_fds, write_fds, except_fds; - GSList *tmp; - int n; - - g_io_channel_ref ((GIOChannel *)channel); - - if (channel->debug) - g_print ("select_thread %#x: start fd:%d,\n\tdata_avail:%#x, data_avail_noticed:%#x\n", - channel->thread_id, - channel->fd, - (guint) channel->data_avail_event, - (guint) channel->data_avail_noticed_event); - - channel->rdp = channel->wrp = 0; - channel->running = TRUE; - - SetEvent (channel->space_avail_event); - - while (channel->running) - { - FD_ZERO (&read_fds); - FD_ZERO (&write_fds); - FD_ZERO (&except_fds); - - tmp = channel->watches; - while (tmp) - { - GIOWin32Watch *watch = (GIOWin32Watch *)tmp->data; - - if (watch->condition & (G_IO_IN | G_IO_HUP)) - FD_SET (channel->fd, &read_fds); - if (watch->condition & G_IO_OUT) - FD_SET (channel->fd, &write_fds); - if (watch->condition & G_IO_ERR) - FD_SET (channel->fd, &except_fds); - - tmp = tmp->next; - } - if (channel->debug) - g_print ("select_thread %#x: calling select() for%s%s%s\n", - channel->thread_id, - (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""), - (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""), - (FD_ISSET (channel->fd, &except_fds) ? " ERR" : "")); - - n = select (1, &read_fds, &write_fds, &except_fds, NULL); - - if (n == SOCKET_ERROR) - { - if (channel->debug) - g_print ("select_thread %#x: select returned SOCKET_ERROR\n", - channel->thread_id); - break; - } - - if (channel->debug) - g_print ("select_thread %#x: got%s%s%s\n", - channel->thread_id, - (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""), - (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""), - (FD_ISSET (channel->fd, &except_fds) ? " ERR" : "")); - - if (FD_ISSET (channel->fd, &read_fds)) - channel->revents |= G_IO_IN; - if (FD_ISSET (channel->fd, &write_fds)) - channel->revents |= G_IO_OUT; - if (FD_ISSET (channel->fd, &except_fds)) - channel->revents |= G_IO_ERR; - - if (channel->debug) - g_print ("select_thread %#x: resetting data_avail_noticed,\n" - "\tsetting data_avail\n", - channel->thread_id); - ResetEvent (channel->data_avail_noticed_event); - SetEvent (channel->data_avail_event); - - LOCK (channel->mutex); - if (channel->needs_close) - { - UNLOCK (channel->mutex); - break; - } - UNLOCK (channel->mutex); - - if (channel->debug) - g_print ("select_thread %#x: waiting for data_avail_noticed\n", - channel->thread_id); - - WaitForSingleObject (channel->data_avail_noticed_event, INFINITE); - if (channel->debug) - g_print ("select_thread %#x: got data_avail_noticed\n", - channel->thread_id); - } - - channel->running = FALSE; - LOCK (channel->mutex); - if (channel->fd != -1) - { - if (channel->debug) - g_print ("select_thread %#x: channel fd %d needs closing\n", - channel->thread_id, channel->fd); - closesocket (channel->fd); - channel->fd = -1; - } - - if (channel->debug) - g_print ("select_thread %#x: got error, setting data_avail\n", - channel->thread_id); - SetEvent (channel->data_avail_event); - UNLOCK (channel->mutex); - - g_io_channel_unref((GIOChannel *)channel); - - /* No need to call _endthreadex(), the actual thread starter routine - * in MSVCRT (see crt/src/threadex.c:_threadstartex) calls - * _endthreadex() for us. - */ - - CloseHandle (channel->thread_handle); - - return 0; -} - -static gboolean -g_io_win32_prepare (GSource *source, - gint *timeout) -{ - GIOWin32Watch *watch = (GIOWin32Watch *)source; - GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; - - *timeout = -1; - - if (channel->type == G_IO_WIN32_FILE_DESC) - { - LOCK (channel->mutex); - if (channel->running && channel->wrp == channel->rdp) - channel->revents = 0; - UNLOCK (channel->mutex); - } - else if (channel->type == G_IO_WIN32_SOCKET) - { - channel->revents = 0; - - if (channel->debug) - g_print ("g_io_win32_prepare: thread %#x, setting data_avail_noticed\n", - channel->thread_id); - SetEvent (channel->data_avail_noticed_event); - if (channel->debug) - g_print ("g_io_win32_prepare: thread %#x, there.\n", - channel->thread_id); - } - - return FALSE; -} - -static gboolean -g_io_win32_check (GSource *source) -{ - MSG msg; - GIOWin32Watch *watch = (GIOWin32Watch *)source; - GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; - - if (channel->debug) - g_print ("g_io_win32_check: for thread %#x:\n" - "\twatch->pollfd.events:%#x, watch->pollfd.revents:%#x, channel->revents:%#x\n", - channel->thread_id, - watch->pollfd.events, watch->pollfd.revents, channel->revents); - - if (channel->type != G_IO_WIN32_WINDOWS_MESSAGES) - { - watch->pollfd.revents = (watch->pollfd.events & channel->revents); - } - else - { - return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE)); - } - - if (channel->type == G_IO_WIN32_SOCKET) - { - if (channel->debug) - g_print ("g_io_win32_check: thread %#x, resetting data_avail\n", - channel->thread_id); - ResetEvent (channel->data_avail_event); - if (channel->debug) - g_print ("g_io_win32_check: thread %#x, there.\n", - channel->thread_id); - } - - return (watch->pollfd.revents & watch->condition); -} - -static gboolean -g_io_win32_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) -{ - GIOFunc func = (GIOFunc)callback; - GIOWin32Watch *watch = (GIOWin32Watch *)source; - - if (!func) - { - g_warning (G_STRLOC ": GIOWin32Watch dispatched without callback\n" - "You must call g_source_connect()."); - return FALSE; - } - - return (*func) (watch->channel, - watch->pollfd.revents & watch->condition, - user_data); -} - -static void -g_io_win32_destroy (GSource *source) -{ - GIOWin32Watch *watch = (GIOWin32Watch *)source; - GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; - - if (channel->debug) - g_print ("g_io_win32_destroy: channel with thread %#x\n", - channel->thread_id); - - channel->watches = g_slist_remove (channel->watches, watch); - - SetEvent (channel->data_avail_noticed_event); - g_io_channel_unref (watch->channel); -} - -static GSourceFuncs win32_watch_funcs = { - g_io_win32_prepare, - g_io_win32_check, - g_io_win32_dispatch, - g_io_win32_destroy -}; - -static GSource * -g_io_win32_create_watch (GIOChannel *channel, - GIOCondition condition, - unsigned (__stdcall *thread) (void *parameter)) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - GIOWin32Watch *watch; - GSource *source; - - source = g_source_new (&win32_watch_funcs, sizeof (GIOWin32Watch)); - watch = (GIOWin32Watch *)source; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->condition = condition; - - if (win32_channel->data_avail_event == NULL) - create_events (win32_channel); - - watch->pollfd.fd = (gint) win32_channel->data_avail_event; - watch->pollfd.events = condition; - - if (win32_channel->debug) - g_print ("g_io_win32_create_watch: fd:%d condition:%#x handle:%#x\n", - win32_channel->fd, condition, watch->pollfd.fd); - - win32_channel->watches = g_slist_append (win32_channel->watches, watch); - - if (win32_channel->thread_id == 0) - create_thread (win32_channel, condition, thread); - - g_source_add_poll (source, &watch->pollfd); - - return source; -} - -static GIOError -g_io_win32_msg_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - MSG msg; /* In case of alignment problems */ - - if (count < sizeof (MSG)) - return G_IO_ERROR_INVAL; - - if (win32_channel->debug) - g_print ("g_io_win32_msg_read: for %#x\n", - win32_channel->hwnd); - if (!PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_REMOVE)) - return G_IO_ERROR_AGAIN; - - memmove (buf, &msg, sizeof (MSG)); - *bytes_read = sizeof (MSG); - return G_IO_ERROR_NONE; -} - -static GIOError -g_io_win32_msg_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - MSG msg; - - if (count != sizeof (MSG)) - return G_IO_ERROR_INVAL; - - /* In case of alignment problems */ - memmove (&msg, buf, sizeof (MSG)); - if (!PostMessage (win32_channel->hwnd, msg.message, msg.wParam, msg.lParam)) - return G_IO_ERROR_UNKNOWN; - - *bytes_written = sizeof (MSG); - return G_IO_ERROR_NONE; -} - -static GIOError -g_io_win32_no_seek (GIOChannel *channel, - gint offset, - GSeekType type) -{ - return G_IO_ERROR_UNKNOWN; -} - -static void -g_io_win32_msg_close (GIOChannel *channel) -{ - /* Nothing to be done. Or should we set hwnd to some invalid value? */ -} - -static void -g_io_win32_free (GIOChannel *channel) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - if (win32_channel->debug) - g_print ("thread %#x: freeing channel, fd: %d\n", - win32_channel->thread_id, - win32_channel->fd); - - if (win32_channel->data_avail_event) - CloseHandle (win32_channel->data_avail_event); - if (win32_channel->space_avail_event) - CloseHandle (win32_channel->space_avail_event); - if (win32_channel->data_avail_noticed_event) - CloseHandle (win32_channel->data_avail_noticed_event); - DeleteCriticalSection (&win32_channel->mutex); - - g_free (win32_channel->buffer); - g_slist_free (win32_channel->watches); - g_free (win32_channel); -} - -static GSource * -g_io_win32_msg_create_watch (GIOChannel *channel, - GIOCondition condition) -{ - GIOWin32Watch *watch; - GSource *source; - - source = g_source_new (&win32_watch_funcs, sizeof (GIOWin32Watch)); - watch = (GIOWin32Watch *)source; - - watch->channel = channel; - g_io_channel_ref (channel); - - watch->condition = condition; - - watch->pollfd.fd = G_WIN32_MSG_HANDLE; - watch->pollfd.events = condition; - - g_source_add_poll (source, &watch->pollfd); - - return source; -} - -static GIOError -g_io_win32_fd_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - gint result; - GIOError error; - - if (win32_channel->debug) - g_print ("g_io_win32_fd_read: fd:%d count:%d\n", - win32_channel->fd, count); - - if (win32_channel->thread_id) - { - result = buffer_read (win32_channel, buf, count, &error); - if (result < 0) - { - *bytes_read = 0; - return error; - } - else - { - *bytes_read = result; - return G_IO_ERROR_NONE; - } - } - - result = read (win32_channel->fd, buf, count); - - if (result < 0) - { - *bytes_read = 0; - if (errno == EINVAL) - return G_IO_ERROR_INVAL; - else - return G_IO_ERROR_UNKNOWN; - } - else - { - *bytes_read = result; - return G_IO_ERROR_NONE; - } -} - -static GIOError -g_io_win32_fd_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - gint result; - - result = write (win32_channel->fd, buf, count); - if (win32_channel->debug) - g_print ("g_io_win32_fd_write: fd:%d count:%d = %d\n", - win32_channel->fd, count, result); - - if (result < 0) - { - *bytes_written = 0; - switch (errno) - { - case EINVAL: - return G_IO_ERROR_INVAL; - case EAGAIN: - return G_IO_ERROR_AGAIN; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - { - *bytes_written = result; - return G_IO_ERROR_NONE; - } -} - -static GIOError -g_io_win32_fd_seek (GIOChannel *channel, - gint offset, - GSeekType type) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - int whence; - off_t result; - - switch (type) - { - case G_SEEK_SET: - whence = SEEK_SET; - break; - case G_SEEK_CUR: - whence = SEEK_CUR; - break; - case G_SEEK_END: - whence = SEEK_END; - break; - default: - g_warning (G_STRLOC ": Unknown seek type %d", (int) type); - return G_IO_ERROR_UNKNOWN; - } - - result = lseek (win32_channel->fd, offset, whence); - - if (result < 0) - { - switch (errno) - { - case EINVAL: - return G_IO_ERROR_INVAL; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - return G_IO_ERROR_NONE; -} - -static void -g_io_win32_fd_close (GIOChannel *channel) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - if (win32_channel->debug) - g_print ("thread %#x: closing fd %d\n", - win32_channel->thread_id, - win32_channel->fd); - LOCK (win32_channel->mutex); - if (win32_channel->running) - { - if (win32_channel->debug) - g_print ("thread %#x: running, marking fd %d for later close\n", - win32_channel->thread_id, win32_channel->fd); - win32_channel->running = FALSE; - win32_channel->needs_close = TRUE; - SetEvent (win32_channel->data_avail_event); - } - else - { - if (win32_channel->debug) - g_print ("closing fd %d\n", win32_channel->fd); - close (win32_channel->fd); - if (win32_channel->debug) - g_print ("closed fd %d, setting to -1\n", - win32_channel->fd); - win32_channel->fd = -1; - } - UNLOCK (win32_channel->mutex); -} - -static GSource * -g_io_win32_fd_create_watch (GIOChannel *channel, - GIOCondition condition) -{ - return g_io_win32_create_watch (channel, condition, read_thread); -} - -static GIOError -g_io_win32_sock_read (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_read) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - gint result; - GIOError error; - - if (win32_channel->debug) - g_print ("g_io_win32_sock_read: sockfd:%d count:%d\n", - win32_channel->fd, count); - - result = recv (win32_channel->fd, buf, count, 0); - - if (win32_channel->debug) - g_print ("g_io_win32_sock_read: recv:%d\n", result); - - if (result == SOCKET_ERROR) - { - *bytes_read = 0; - switch (WSAGetLastError ()) - { - case WSAEINVAL: - return G_IO_ERROR_INVAL; - case WSAEWOULDBLOCK: - case WSAEINTR: - return G_IO_ERROR_AGAIN; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - { - *bytes_read = result; - return G_IO_ERROR_NONE; - } -} - -static GIOError -g_io_win32_sock_write (GIOChannel *channel, - gchar *buf, - guint count, - guint *bytes_written) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - gint result; - - if (win32_channel->debug) - g_print ("g_io_win32_sock_write: sockfd:%d count:%d\n", - win32_channel->fd, count); - - result = send (win32_channel->fd, buf, count, 0); - - if (win32_channel->debug) - g_print ("g_io_win32_sock_write: send:%d\n", result); - - if (result == SOCKET_ERROR) - { - *bytes_written = 0; - switch (WSAGetLastError ()) - { - case WSAEINVAL: - return G_IO_ERROR_INVAL; - case WSAEWOULDBLOCK: - case WSAEINTR: - return G_IO_ERROR_AGAIN; - default: - return G_IO_ERROR_UNKNOWN; - } - } - else - { - *bytes_written = result; - return G_IO_ERROR_NONE; - } -} - -static void -g_io_win32_sock_close (GIOChannel *channel) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - LOCK(win32_channel->mutex); - if (win32_channel->running) - { - if (win32_channel->debug) - g_print ("thread %#x: running, marking for later close\n", - win32_channel->thread_id); - win32_channel->running = FALSE; - win32_channel->needs_close = TRUE; - SetEvent(win32_channel->data_avail_noticed_event); - } - if (win32_channel->fd != -1) - { - if (win32_channel->debug) - g_print ("thread %#x: closing socket %d\n", - win32_channel->thread_id, - win32_channel->fd); - - closesocket (win32_channel->fd); - win32_channel->fd = -1; - } - UNLOCK(win32_channel->mutex); -} - -static GSource * -g_io_win32_sock_create_watch (GIOChannel *channel, - GIOCondition condition) -{ - return g_io_win32_create_watch (channel, condition, select_thread); -} - -static GIOFuncs win32_channel_msg_funcs = { - g_io_win32_msg_read, - g_io_win32_msg_write, - g_io_win32_no_seek, - g_io_win32_msg_close, - g_io_win32_msg_create_watch, - g_io_win32_free -}; - -static GIOFuncs win32_channel_fd_funcs = { - g_io_win32_fd_read, - g_io_win32_fd_write, - g_io_win32_fd_seek, - g_io_win32_fd_close, - g_io_win32_fd_create_watch, - g_io_win32_free -}; - -static GIOFuncs win32_channel_sock_funcs = { - g_io_win32_sock_read, - g_io_win32_sock_write, - g_io_win32_no_seek, - g_io_win32_sock_close, - g_io_win32_sock_create_watch, - g_io_win32_free -}; - -GIOChannel * -g_io_channel_win32_new_messages (guint hwnd) -{ - GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); - GIOChannel *channel = (GIOChannel *)win32_channel; - - g_io_channel_init (channel); - g_io_channel_win32_init (win32_channel); - if (win32_channel->debug) - g_print ("g_io_channel_win32_new_messages: hwnd = %ud\n", hwnd); - channel->funcs = &win32_channel_msg_funcs; - win32_channel->type = G_IO_WIN32_WINDOWS_MESSAGES; - win32_channel->hwnd = (HWND) hwnd; - - return channel; -} - -GIOChannel * -g_io_channel_win32_new_fd (gint fd) -{ - GIOWin32Channel *win32_channel; - GIOChannel *channel; - struct stat st; - - if (fstat (fd, &st) == -1) - { - g_warning (G_STRLOC ": %d isn't a (emulated) file descriptor", fd); - return NULL; - } - - win32_channel = g_new (GIOWin32Channel, 1); - channel = (GIOChannel *)win32_channel; - - g_io_channel_init (channel); - g_io_channel_win32_init (win32_channel); - if (win32_channel->debug) - g_print ("g_io_channel_win32_new_fd: fd = %d\n", fd); - channel->funcs = &win32_channel_fd_funcs; - win32_channel->type = G_IO_WIN32_FILE_DESC; - win32_channel->fd = fd; - - return channel; -} - -gint -g_io_channel_win32_get_fd (GIOChannel *channel) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - return win32_channel->fd; -} - -GIOChannel * -g_io_channel_win32_new_socket (int socket) -{ - GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); - GIOChannel *channel = (GIOChannel *)win32_channel; - - g_io_channel_init (channel); - g_io_channel_win32_init (win32_channel); - if (win32_channel->debug) - g_print ("g_io_channel_win32_new_socket: sockfd:%d\n", socket); - channel->funcs = &win32_channel_sock_funcs; - win32_channel->type = G_IO_WIN32_SOCKET; - win32_channel->fd = socket; - - return channel; -} - -GIOChannel * -g_io_channel_unix_new (gint fd) -{ - struct stat st; - - if (fstat (fd, &st) == 0) - return g_io_channel_win32_new_fd (fd); - - if (getsockopt (fd, SOL_SOCKET, SO_TYPE, NULL, NULL) != SO_ERROR) - return g_io_channel_win32_new_socket(fd); - - g_warning (G_STRLOC ": %d is neither a file descriptor or a socket", fd); - return NULL; -} - -gint -g_io_channel_unix_get_fd (GIOChannel *channel) -{ - return g_io_channel_win32_get_fd (channel); -} - -void -g_io_channel_win32_set_debug (GIOChannel *channel, - gboolean flag) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - win32_channel->debug = flag; -} - -gint -g_io_channel_win32_poll (GPollFD *fds, - gint n_fds, - gint timeout) -{ - int result; - - g_return_val_if_fail (n_fds >= 0, 0); - - result = (*g_main_context_get_poll_func (NULL)) (fds, n_fds, timeout); - - return result; -} - -void -g_io_channel_win32_make_pollfd (GIOChannel *channel, - GIOCondition condition, - GPollFD *fd) -{ - GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; - - if (win32_channel->data_avail_event == NULL) - create_events (win32_channel); - - fd->fd = (gint) win32_channel->data_avail_event; - fd->events = condition; - - if (win32_channel->thread_id == 0) - if ((condition & G_IO_IN) && win32_channel->type == G_IO_WIN32_FILE_DESC) - create_thread (win32_channel, condition, read_thread); - else if (win32_channel->type == G_IO_WIN32_SOCKET) - create_thread (win32_channel, condition, select_thread); -} - -/* Binary compatibility */ -GIOChannel * -g_io_channel_win32_new_stream_socket (int socket) -{ - return g_io_channel_win32_new_socket (socket); -} diff --git a/glib-object.h b/glib-object.h deleted file mode 100644 index 98e3dfeb..00000000 --- a/glib-object.h +++ /dev/null @@ -1,38 +0,0 @@ -/* GObject - GLib Type, Object, Parameter and Signal Library - * Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc. - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __GLIB_GOBJECT_H__ -#define __GLIB_GOBJECT_H__ - -/* topmost include file for GObject header files */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#endif /* __GLIB_GOBJECT_H__ */ diff --git a/glib.h b/glib.h deleted file mode 100644 index 8b32accc..00000000 --- a/glib.h +++ /dev/null @@ -1,75 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_LIB_H__ -#define __G_LIB_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef G_PLATFORM_WIN32 -#include -#endif - -#endif /* __G_LIB_H__ */ diff --git a/glib/.cvsignore b/glib/.cvsignore new file mode 100644 index 00000000..b26fb902 --- /dev/null +++ b/glib/.cvsignore @@ -0,0 +1,10 @@ +Makefile +Makefile.in +libglib-1.3.la +*.lo +*.obj +*.lib +*.dll +*.exe +.deps +.libs diff --git a/glib/Makefile.am b/glib/Makefile.am index 11b4e82d..c2559004 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -1,46 +1,11 @@ ## Process this file with automake to produce Makefile.in -AUTOMAKE_OPTIONS = 1.4 - -SUBDIRS = . m4macros gobject gmodule gthread docs tests build - INCLUDES = -DG_LOG_DOMAIN=g_log_domain_glib @GLIB_DEBUG_FLAGS@ \ -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION EXTRA_DIST = \ - ChangeLog.pre-1-2 \ - glib.spec.in \ - NEWS.pre-1-3 \ - acglib.m4 \ - sanity_check \ - README.win32 \ - TODO.xml \ - glib.def \ - makefile.msc.in \ - makefile.mingw.in \ - glibconfig.h.win32.in \ - config.h.win32.in \ - build-dll \ - glib.rc.in \ - glib-2.0.pc.in \ - gobject-2.0.pc.in \ - gmodule-2.0.pc.in \ - gthread-2.0.pc.in \ - glib-2.0-uninstalled.pc.in \ - gobject-2.0-uninstalled.pc.in \ - gmodule-2.0-uninstalled.pc.in \ - gthread-2.0-uninstalled.pc.in \ gen-unicode-tables.pl -# These may be in the builddir too -BUILT_EXTRA_DIST = \ - makefile.msc \ - makefile.mingw \ - glibconfig.h.win32 \ - config.h.win32 \ - glib.rc \ - glib.spec - lib_LTLIBRARIES = libglib-1.3.la libglib_1_3_la_SOURCES = \ @@ -97,6 +62,11 @@ EXTRA_libglib_1_3_la_SOURCES = \ glibincludedir=$(includedir)/glib-2.0 glibinclude_HEADERS = \ + glib-object.h \ + glib.h + +glibsubincludedir=$(includedir)/glib-2.0/glib +glibsubinclude_HEADERS = \ galloca.h \ garray.h \ gasyncqueue.h \ @@ -111,8 +81,6 @@ glibinclude_HEADERS = \ ghash.h \ ghook.h \ giochannel.h \ - glib.h \ - glib-object.h \ glist.h \ gmacros.h \ gmain.h \ @@ -142,24 +110,12 @@ glibinclude_HEADERS = \ gutils.h \ gwin32.h -configexecincludedir = $(libdir)/glib-2.0/include -#configexecinclude_DATA = glibconfig.h - -install-exec-local: glibconfig.h - $(mkinstalldirs) $(DESTDIR)$(configexecincludedir) - file=$(DESTDIR)$(configexecincludedir)/glibconfig.h; \ - if test -r $$file && cmp -s glibconfig.h $$file; then :; \ - else $(INSTALL_DATA) glibconfig.h $$file; fi - -CONFIGURE_DEPENDENCIES = acglib.m4 - -BUILT_SOURCES = stamp-gc-h #note: not glibconfig.h -glibconfig.h: stamp-gc-h - @if test -f glibconfig.h; then :; \ - else rm -f stamp-gc-h; $(MAKE) stamp-gc-h; fi -stamp-gc-h: config.status - CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status - echo timestamp > stamp-gc-h +install-data-local: + @if test -f $(glibincludedir)/glist.h ; then \ + echo "*** Old headers found in $(glibincludedir). You should remove the" ; \ + echo "*** contents of this directory and type 'make install' again." ; \ + false ; \ + fi libglib_1_3_la_LIBADD = @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ libglib_1_3_la_DEPENDENCIES = @GIO@ @GSPAWN@ @PLATFORMDEP@ @@ -181,63 +137,4 @@ if OS_WIN32 bin_PROGRAMS = gspawn-win32-helper gspawn_win32_helper_LDADD = libglib-1.3.la endif -if ENABLE_TIMELOOP -timeloop = timeloop -endif -noinst_PROGRAMS = testglib testgdate testgdateparser $(timeloop) -testglib_LDADD = libglib-1.3.la -testgdate_LDADD = libglib-1.3.la -testgdateparser_LDADD = libglib-1.3.la -if ENABLE_TIMELOOP -timeloop_LDADD = libglib-1.3.la -endif - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = glib-2.0.pc gobject-2.0.pc gmodule-2.0.pc gthread-2.0.pc - -glibconfig.h.win32: $(top_builddir)/config.status $(top_srcdir)/glibconfig.h.win32.in - cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -config.h.win32: $(top_builddir)/config.status $(top_srcdir)/config.h.win32.in - cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -makefile.msc: $(top_builddir)/config.status $(top_srcdir)/makefile.msc.in - cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -makefile.mingw: $(top_builddir)/config.status $(top_srcdir)/makefile.mingw.in - cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -glib.rc: $(top_builddir)/config.status $(top_srcdir)/glib.rc.in - cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -bin_SCRIPTS=glib-config-2.0 -BUILT_SOURCES=glib-config-2.0 -glib-config-2.0: glib-config-2.0.in - -.PHONY: files release sanity snapshot - -files: - @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ - echo $$p; \ - done - -release: - rm -rf .deps */.deps - cd docs && make glib.html - $(MAKE) distcheck - -sanity: - ./sanity_check $(VERSION) - -snapshot: - $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` - -snapcheck: - $(MAKE) distcheck distdir=$(PACKAGE)-snap`date +"%Y%m%d"` -dist-hook: $(BUILT_EXTRA_DIST) - cd $(top_builddir) && CONFIG_FILES="INSTALL README" CONFIG_HEADERS= $(SHELL) ./config.status - files='$(BUILT_EXTRA_DIST) INSTALL README'; \ - for f in $$files; do \ - if test -f $$f; then d=.; else d=$(srcdir); fi; \ - rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done diff --git a/glib/galloca.h b/glib/galloca.h index b4194d4a..7bc0a5fa 100644 --- a/glib/galloca.h +++ b/glib/galloca.h @@ -27,7 +27,7 @@ #ifndef __G_ALLOCA_H__ #define __G_ALLOCA_H__ -#include +#include #ifdef __GNUC__ /* GCC does the right thing */ diff --git a/glib/garray.h b/glib/garray.h index 766da77d..56b3937f 100644 --- a/glib/garray.h +++ b/glib/garray.h @@ -27,7 +27,7 @@ #ifndef __G_ARRAY_H__ #define __G_ARRAY_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gasyncqueue.h b/glib/gasyncqueue.h index 6e87425f..0f1a80db 100644 --- a/glib/gasyncqueue.h +++ b/glib/gasyncqueue.h @@ -27,7 +27,7 @@ #ifndef __G_ASYNCQUEUE_H__ #define __G_ASYNCQUEUE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gbacktrace.h b/glib/gbacktrace.h index 25d2f998..93b51749 100644 --- a/glib/gbacktrace.h +++ b/glib/gbacktrace.h @@ -27,7 +27,7 @@ #ifndef __G_BACKTRACE_H__ #define __G_BACKTRACE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gcache.h b/glib/gcache.h index 74ef5b65..a9128b65 100644 --- a/glib/gcache.h +++ b/glib/gcache.h @@ -27,7 +27,7 @@ #ifndef __G_CACHE_H__ #define __G_CACHE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gcompletion.h b/glib/gcompletion.h index 3aade532..eab0699b 100644 --- a/glib/gcompletion.h +++ b/glib/gcompletion.h @@ -27,7 +27,7 @@ #ifndef __G_COMPLETION_H__ #define __G_COMPLETION_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gconvert.h b/glib/gconvert.h index 3166bfa0..63e08353 100644 --- a/glib/gconvert.h +++ b/glib/gconvert.h @@ -28,7 +28,7 @@ #define __G_CONVERT_H__ #include /* For size_t */ -#include +#include G_BEGIN_DECLS diff --git a/glib/gdataset.h b/glib/gdataset.h index f9d15b30..e04a706c 100644 --- a/glib/gdataset.h +++ b/glib/gdataset.h @@ -27,7 +27,7 @@ #ifndef __G_DATASET_H__ #define __G_DATASET_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gdate.h b/glib/gdate.h index 4cbdd8c0..96d827f6 100644 --- a/glib/gdate.h +++ b/glib/gdate.h @@ -27,7 +27,7 @@ #ifndef __G_DATE_H__ #define __G_DATE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gerror.h b/glib/gerror.h index a7eb8fda..ea0d25aa 100644 --- a/glib/gerror.h +++ b/glib/gerror.h @@ -21,7 +21,7 @@ #ifndef __G_ERROR_H__ #define __G_ERROR_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gfileutils.h b/glib/gfileutils.h index 717fa63e..161a131a 100644 --- a/glib/gfileutils.h +++ b/glib/gfileutils.h @@ -21,7 +21,7 @@ #ifndef __G_FILEUTILS_H__ #define __G_FILEUTILS_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/ghash.h b/glib/ghash.h index a9af5dc7..acc2d176 100644 --- a/glib/ghash.h +++ b/glib/ghash.h @@ -27,7 +27,7 @@ #ifndef __G_HASH_H__ #define __G_HASH_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/ghook.h b/glib/ghook.h index 8942e5ad..e6bfb461 100644 --- a/glib/ghook.h +++ b/glib/ghook.h @@ -27,7 +27,7 @@ #ifndef __G_HOOK_H__ #define __G_HOOK_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/giochannel.h b/glib/giochannel.h index ed9c7c8c..51b870a7 100644 --- a/glib/giochannel.h +++ b/glib/giochannel.h @@ -27,8 +27,8 @@ #ifndef __G_IOCHANNEL_H__ #define __G_IOCHANNEL_H__ -#include -#include +#include +#include G_BEGIN_DECLS diff --git a/glib/glib.h b/glib/glib.h index 8b32accc..0febae39 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -27,49 +27,49 @@ #ifndef __G_LIB_H__ #define __G_LIB_H__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef G_PLATFORM_WIN32 -#include +#include #endif #endif /* __G_LIB_H__ */ diff --git a/glib/glist.h b/glib/glist.h index 81ec9b3a..bd165d41 100644 --- a/glib/glist.h +++ b/glib/glist.h @@ -27,7 +27,7 @@ #ifndef __G_LIST_H__ #define __G_LIST_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gmain.h b/glib/gmain.h index 70a64de1..a8ce3e2a 100644 --- a/glib/gmain.h +++ b/glib/gmain.h @@ -20,8 +20,8 @@ #ifndef __G_MAIN_H__ #define __G_MAIN_H__ -#include -#include +#include +#include G_BEGIN_DECLS diff --git a/glib/gmarkup.h b/glib/gmarkup.h index 32de22c2..3fba0d67 100644 --- a/glib/gmarkup.h +++ b/glib/gmarkup.h @@ -21,7 +21,7 @@ #ifndef __G_MARKUP_H__ #define __G_MARKUP_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gmem.h b/glib/gmem.h index 014326c6..392a06cd 100644 --- a/glib/gmem.h +++ b/glib/gmem.h @@ -27,7 +27,7 @@ #ifndef __G_MEM_H__ #define __G_MEM_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gmessages.h b/glib/gmessages.h index 5657604c..b937b495 100644 --- a/glib/gmessages.h +++ b/glib/gmessages.h @@ -28,7 +28,7 @@ #define __G_MESSAGES_H__ #include -#include +#include G_BEGIN_DECLS diff --git a/glib/gnode.h b/glib/gnode.h index c4a9c5f6..6d79ab0a 100644 --- a/glib/gnode.h +++ b/glib/gnode.h @@ -27,7 +27,7 @@ #ifndef __G_NODE_H__ #define __G_NODE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gpattern.h b/glib/gpattern.h index add239c6..bd29ad7a 100644 --- a/glib/gpattern.h +++ b/glib/gpattern.h @@ -19,7 +19,7 @@ #ifndef __G_PATTERN_H__ #define __G_PATTERN_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gprimes.h b/glib/gprimes.h index daa1598c..0f1740cb 100644 --- a/glib/gprimes.h +++ b/glib/gprimes.h @@ -27,7 +27,7 @@ #ifndef __G_PRIMES_H__ #define __G_PRIMES_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gqsort.h b/glib/gqsort.h index d946e80c..12e7a05b 100644 --- a/glib/gqsort.h +++ b/glib/gqsort.h @@ -28,7 +28,7 @@ #ifndef __G_QSORT_H__ #define __G_QSORT_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gquark.h b/glib/gquark.h index e8756ef6..6b96dcf6 100644 --- a/glib/gquark.h +++ b/glib/gquark.h @@ -27,7 +27,7 @@ #ifndef __G_QUARK_H__ #define __G_QUARK_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gqueue.h b/glib/gqueue.h index b71b6d61..64fd6928 100644 --- a/glib/gqueue.h +++ b/glib/gqueue.h @@ -27,7 +27,7 @@ #ifndef __G_QUEUE_H__ #define __G_QUEUE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/grand.h b/glib/grand.h index 5accc1ae..d743953f 100644 --- a/glib/grand.h +++ b/glib/grand.h @@ -27,7 +27,7 @@ #ifndef __G_RAND_H__ #define __G_RAND_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/grel.h b/glib/grel.h index fcf8eab4..562bd136 100644 --- a/glib/grel.h +++ b/glib/grel.h @@ -27,7 +27,7 @@ #ifndef __G_REL_H__ #define __G_REL_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gscanner.h b/glib/gscanner.h index d71bbdea..cbcc48c2 100644 --- a/glib/gscanner.h +++ b/glib/gscanner.h @@ -27,7 +27,7 @@ #ifndef __G_SCANNER_H__ #define __G_SCANNER_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gshell.h b/glib/gshell.h index c433cbae..b3f9d914 100644 --- a/glib/gshell.h +++ b/glib/gshell.h @@ -21,7 +21,7 @@ #ifndef __G_SHELL_H__ #define __G_SHELL_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gslist.h b/glib/gslist.h index 00d3fc33..32a3b245 100644 --- a/glib/gslist.h +++ b/glib/gslist.h @@ -27,7 +27,7 @@ #ifndef __G_SLIST_H__ #define __G_SLIST_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gspawn.h b/glib/gspawn.h index dcebc3a8..795bb3ce 100644 --- a/glib/gspawn.h +++ b/glib/gspawn.h @@ -21,7 +21,7 @@ #ifndef __G_SPAWN_H__ #define __G_SPAWN_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h index 1c6ba9bd..628b3b16 100644 --- a/glib/gstrfuncs.h +++ b/glib/gstrfuncs.h @@ -28,7 +28,7 @@ #define __G_STRFUNCS_H__ #include -#include +#include G_BEGIN_DECLS diff --git a/glib/gstring.h b/glib/gstring.h index 6c2360db..ed01fa95 100644 --- a/glib/gstring.h +++ b/glib/gstring.h @@ -27,7 +27,7 @@ #ifndef __G_STRING_H__ #define __G_STRING_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gthread.h b/glib/gthread.h index 4656270b..58043bf0 100644 --- a/glib/gthread.h +++ b/glib/gthread.h @@ -27,8 +27,8 @@ #ifndef __G_THREAD_H__ #define __G_THREAD_H__ -#include -#include +#include +#include G_BEGIN_DECLS diff --git a/glib/gthreadpool.h b/glib/gthreadpool.h index d2c54fb0..ed1e81ba 100644 --- a/glib/gthreadpool.h +++ b/glib/gthreadpool.h @@ -27,7 +27,7 @@ #ifndef __G_THREADPOOL_H__ #define __G_THREADPOOL_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gtimer.h b/glib/gtimer.h index 823d6344..3a9b2650 100644 --- a/glib/gtimer.h +++ b/glib/gtimer.h @@ -27,7 +27,7 @@ #ifndef __G_TIMER_H__ #define __G_TIMER_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gtree.h b/glib/gtree.h index 401120bb..6742c4a1 100644 --- a/glib/gtree.h +++ b/glib/gtree.h @@ -27,7 +27,7 @@ #ifndef __G_TREE_H__ #define __G_TREE_H__ -#include +#include G_BEGIN_DECLS diff --git a/glib/gunicode.h b/glib/gunicode.h index 2136005a..c139781c 100644 --- a/glib/gunicode.h +++ b/glib/gunicode.h @@ -22,8 +22,8 @@ #ifndef __G_UNICODE_H__ #define __G_UNICODE_H__ -#include -#include +#include +#include G_BEGIN_DECLS diff --git a/glib/gutils.h b/glib/gutils.h index 3e3d30fe..65929e6c 100644 --- a/glib/gutils.h +++ b/glib/gutils.h @@ -27,7 +27,7 @@ #ifndef __G_UTILS_H__ #define __G_UTILS_H__ -#include +#include #include G_BEGIN_DECLS diff --git a/glib/gwin32.h b/glib/gwin32.h index d3592490..a71d7744 100644 --- a/glib/gwin32.h +++ b/glib/gwin32.h @@ -27,7 +27,7 @@ #ifndef __G_WIN32_H__ #define __G_WIN32_H__ -#include +#include #ifdef G_PLATFORM_WIN32 diff --git a/glibintl.h b/glibintl.h deleted file mode 100644 index c7a1b6ac..00000000 --- a/glibintl.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __GLIBINTL_H__ -#define __GLIBINTL_H__ - -#include "config.h" - -#ifdef ENABLE_NLS - -gchar *_glib_gettext (const gchar *str); - -#include -#define _(String) _glib_gettext(String) - -#ifdef gettext_noop -#define N_(String) gettext_noop(String) -#else -#define N_(String) (String) -#endif -#else /* NLS is disabled */ -#define _(String) (String) -#define N_(String) (String) -#define textdomain(String) (String) -#define gettext(String) (String) -#define dgettext(Domain,String) (String) -#define dcgettext(Domain,String,Type) (String) -#define bindtextdomain(Domain,Directory) (Domain) -#endif - -#endif /* __GLIBINTL_H__ */ diff --git a/glist.c b/glist.c deleted file mode 100644 index 7c59697c..00000000 --- a/glist.c +++ /dev/null @@ -1,826 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - - -#ifndef DISABLE_MEM_POOLS -struct _GAllocator /* from gmem.c */ -{ - gchar *name; - guint16 n_preallocs; - guint is_unused : 1; - guint type : 4; - GAllocator *last; - GMemChunk *mem_chunk; - GList *free_lists; /* implementation specific */ -}; - -static GAllocator *current_allocator = NULL; -G_LOCK_DEFINE_STATIC (current_allocator); - -/* HOLDS: current_allocator_lock */ -static void -g_list_validate_allocator (GAllocator *allocator) -{ - g_return_if_fail (allocator != NULL); - g_return_if_fail (allocator->is_unused == TRUE); - - if (allocator->type != G_ALLOCATOR_LIST) - { - allocator->type = G_ALLOCATOR_LIST; - if (allocator->mem_chunk) - { - g_mem_chunk_destroy (allocator->mem_chunk); - allocator->mem_chunk = NULL; - } - } - - if (!allocator->mem_chunk) - { - allocator->mem_chunk = g_mem_chunk_new (allocator->name, - sizeof (GList), - sizeof (GList) * allocator->n_preallocs, - G_ALLOC_ONLY); - allocator->free_lists = NULL; - } - - allocator->is_unused = FALSE; -} - -void -g_list_push_allocator(GAllocator *allocator) -{ - G_LOCK (current_allocator); - g_list_validate_allocator (allocator); - allocator->last = current_allocator; - current_allocator = allocator; - G_UNLOCK (current_allocator); -} - -void -g_list_pop_allocator (void) -{ - G_LOCK (current_allocator); - if (current_allocator) - { - GAllocator *allocator; - - allocator = current_allocator; - current_allocator = allocator->last; - allocator->last = NULL; - allocator->is_unused = TRUE; - } - G_UNLOCK (current_allocator); -} - -static inline GList* -_g_list_alloc (void) -{ - GList *list; - - G_LOCK (current_allocator); - if (!current_allocator) - { - GAllocator *allocator = g_allocator_new ("GLib default GList allocator", - 128); - g_list_validate_allocator (allocator); - allocator->last = NULL; - current_allocator = allocator; - } - if (!current_allocator->free_lists) - { - list = g_chunk_new (GList, current_allocator->mem_chunk); - list->data = NULL; - } - else - { - if (current_allocator->free_lists->data) - { - list = current_allocator->free_lists->data; - current_allocator->free_lists->data = list->next; - list->data = NULL; - } - else - { - list = current_allocator->free_lists; - current_allocator->free_lists = list->next; - } - } - G_UNLOCK (current_allocator); - list->next = NULL; - list->prev = NULL; - - return list; -} - -GList* -g_list_alloc (void) -{ - return _g_list_alloc (); -} - -void -g_list_free (GList *list) -{ - if (list) - { - GList *last_node = list; - -#ifdef ENABLE_GC_FRIENDLY - while (last_node->next) - { - last_node->data = NULL; - last_node->prev = NULL; - last_node = last_node->next; - } - last_node->data = NULL; - last_node->prev = NULL; -#else /* !ENABLE_GC_FRIENDLY */ - list->data = list->next; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (current_allocator); - last_node->next = current_allocator->free_lists; - current_allocator->free_lists = list; - G_UNLOCK (current_allocator); - } -} - -static inline void -_g_list_free_1 (GList *list) -{ - if (list) - { - list->data = NULL; - -#ifdef ENABLE_GC_FRIENDLY - list->prev = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (current_allocator); - list->next = current_allocator->free_lists; - current_allocator->free_lists = list; - G_UNLOCK (current_allocator); - } -} - -void -g_list_free_1 (GList *list) -{ - _g_list_free_1 (list); -} - -#else /* DISABLE_MEM_POOLS */ - -#define _g_list_alloc g_list_alloc -GList* -g_list_alloc (void) -{ - GList *list; - - list = g_new0 (GList, 1); - - return list; -} - -void -g_list_free (GList *list) -{ - GList *last; - - while (list) - { - last = list; - list = list->next; - g_free (last); - } -} - -#define _g_list_free_1 g_list_free_1 -void -g_list_free_1 (GList *list) -{ - g_free (list); -} - -#endif - -GList* -g_list_append (GList *list, - gpointer data) -{ - GList *new_list; - GList *last; - - new_list = _g_list_alloc (); - new_list->data = data; - - if (list) - { - last = g_list_last (list); - /* g_assert (last != NULL); */ - last->next = new_list; - new_list->prev = last; - - return list; - } - else - return new_list; -} - -GList* -g_list_prepend (GList *list, - gpointer data) -{ - GList *new_list; - - new_list = _g_list_alloc (); - new_list->data = data; - - if (list) - { - if (list->prev) - { - list->prev->next = new_list; - new_list->prev = list->prev; - } - list->prev = new_list; - new_list->next = list; - } - - return new_list; -} - -GList* -g_list_insert (GList *list, - gpointer data, - gint position) -{ - GList *new_list; - GList *tmp_list; - - if (position < 0) - return g_list_append (list, data); - else if (position == 0) - return g_list_prepend (list, data); - - tmp_list = g_list_nth (list, position); - if (!tmp_list) - return g_list_append (list, data); - - new_list = _g_list_alloc (); - new_list->data = data; - - if (tmp_list->prev) - { - tmp_list->prev->next = new_list; - new_list->prev = tmp_list->prev; - } - new_list->next = tmp_list; - tmp_list->prev = new_list; - - if (tmp_list == list) - return new_list; - else - return list; -} - -GList * -g_list_concat (GList *list1, GList *list2) -{ - GList *tmp_list; - - if (list2) - { - tmp_list = g_list_last (list1); - if (tmp_list) - tmp_list->next = list2; - else - list1 = list2; - list2->prev = tmp_list; - } - - return list1; -} - -GList* -g_list_remove (GList *list, - gconstpointer data) -{ - GList *tmp; - - tmp = list; - while (tmp) - { - if (tmp->data != data) - tmp = tmp->next; - else - { - if (tmp->prev) - tmp->prev->next = tmp->next; - if (tmp->next) - tmp->next->prev = tmp->prev; - - if (list == tmp) - list = list->next; - - _g_list_free_1 (tmp); - - break; - } - } - return list; -} - -GList* -g_list_remove_all (GList *list, - gconstpointer data) -{ - GList *tmp = list; - - while (tmp) - { - if (tmp->data != data) - tmp = tmp->next; - else - { - GList *next = tmp->next; - - if (tmp->prev) - tmp->prev->next = next; - else - list = next; - if (next) - next->prev = tmp->prev; - - _g_list_free_1 (tmp); - tmp = next; - } - } - return list; -} - -static inline GList* -_g_list_remove_link (GList *list, - GList *link) -{ - if (link) - { - if (link->prev) - link->prev->next = link->next; - if (link->next) - link->next->prev = link->prev; - - if (link == list) - list = list->next; - - link->next = NULL; - link->prev = NULL; - } - - return list; -} - -GList* -g_list_remove_link (GList *list, - GList *link) -{ - return _g_list_remove_link (list, link); -} - -GList* -g_list_delete_link (GList *list, - GList *link) -{ - list = _g_list_remove_link (list, link); - _g_list_free_1 (link); - - return list; -} - -GList* -g_list_copy (GList *list) -{ - GList *new_list = NULL; - - if (list) - { - GList *last; - - new_list = _g_list_alloc (); - new_list->data = list->data; - last = new_list; - list = list->next; - while (list) - { - last->next = _g_list_alloc (); - last->next->prev = last; - last = last->next; - last->data = list->data; - list = list->next; - } - } - - return new_list; -} - -GList* -g_list_reverse (GList *list) -{ - GList *last; - - last = NULL; - while (list) - { - last = list; - list = last->next; - last->next = last->prev; - last->prev = list; - } - - return last; -} - -GList* -g_list_nth (GList *list, - guint n) -{ - while ((n-- > 0) && list) - list = list->next; - - return list; -} - -GList* -g_list_nth_prev (GList *list, - guint n) -{ - while ((n-- > 0) && list) - list = list->prev; - - return list; -} - -gpointer -g_list_nth_data (GList *list, - guint n) -{ - while ((n-- > 0) && list) - list = list->next; - - return list ? list->data : NULL; -} - -GList* -g_list_find (GList *list, - gconstpointer data) -{ - while (list) - { - if (list->data == data) - break; - list = list->next; - } - - return list; -} - -GList* -g_list_find_custom (GList *list, - gconstpointer data, - GCompareFunc func) -{ - g_return_val_if_fail (func != NULL, list); - - while (list) - { - if (! func (list->data, data)) - return list; - list = list->next; - } - - return NULL; -} - - -gint -g_list_position (GList *list, - GList *link) -{ - gint i; - - i = 0; - while (list) - { - if (list == link) - return i; - i++; - list = list->next; - } - - return -1; -} - -gint -g_list_index (GList *list, - gconstpointer data) -{ - gint i; - - i = 0; - while (list) - { - if (list->data == data) - return i; - i++; - list = list->next; - } - - return -1; -} - -GList* -g_list_last (GList *list) -{ - if (list) - { - while (list->next) - list = list->next; - } - - return list; -} - -GList* -g_list_first (GList *list) -{ - if (list) - { - while (list->prev) - list = list->prev; - } - - return list; -} - -guint -g_list_length (GList *list) -{ - guint length; - - length = 0; - while (list) - { - length++; - list = list->next; - } - - return length; -} - -void -g_list_foreach (GList *list, - GFunc func, - gpointer user_data) -{ - while (list) - { - GList *next = list->next; - (*func) (list->data, user_data); - list = next; - } -} - - -GList* -g_list_insert_sorted (GList *list, - gpointer data, - GCompareFunc func) -{ - GList *tmp_list = list; - GList *new_list; - gint cmp; - - g_return_val_if_fail (func != NULL, list); - - if (!list) - { - new_list = _g_list_alloc (); - new_list->data = data; - return new_list; - } - - cmp = (*func) (data, tmp_list->data); - - while ((tmp_list->next) && (cmp > 0)) - { - tmp_list = tmp_list->next; - cmp = (*func) (data, tmp_list->data); - } - - new_list = _g_list_alloc (); - new_list->data = data; - - if ((!tmp_list->next) && (cmp > 0)) - { - tmp_list->next = new_list; - new_list->prev = tmp_list; - return list; - } - - if (tmp_list->prev) - { - tmp_list->prev->next = new_list; - new_list->prev = tmp_list->prev; - } - new_list->next = tmp_list; - tmp_list->prev = new_list; - - if (tmp_list == list) - return new_list; - else - return list; -} - -static GList * -g_list_sort_merge (GList *l1, - GList *l2, - GFunc compare_func, - gboolean use_data, - gpointer user_data) -{ - GList list, *l, *lprev; - gint cmp; - - l = &list; - lprev = NULL; - - while (l1 && l2) - { - if (use_data) - cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); - else - cmp = ((GCompareFunc) compare_func) (l1->data, l2->data); - - if (cmp <= 0) - { - l->next = l1; - l = l->next; - l->prev = lprev; - lprev = l; - l1 = l1->next; - } - else - { - l->next = l2; - l = l->next; - l->prev = lprev; - lprev = l; - l2 = l2->next; - } - } - l->next = l1 ? l1 : l2; - l->next->prev = l; - - return list.next; -} - -static GList* -g_list_sort_real (GList *list, - GFunc compare_func, - gboolean use_data, - gpointer user_data) -{ - GList *l1, *l2; - - if (!list) - return NULL; - if (!list->next) - return list; - - l1 = list; - l2 = list->next; - - while ((l2 = l2->next) != NULL) - { - if ((l2 = l2->next) == NULL) - break; - l1 = l1->next; - } - l2 = l1->next; - l1->next = NULL; - - return g_list_sort_merge (g_list_sort_real (list, compare_func, use_data, user_data), - g_list_sort_real (l2, compare_func, use_data, user_data), - compare_func, - use_data, - user_data); -} - -GList * -g_list_sort (GList *list, - GCompareFunc compare_func) -{ - return g_list_sort_real (list, (GFunc) compare_func, FALSE, NULL); - -} - -GList * -g_list_sort_with_data (GList *list, - GCompareDataFunc compare_func, - gpointer user_data) -{ - return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data); -} - -static GList* -g_list_sort2 (GList *list, - GCompareFunc compare_func) -{ - GSList *runs = NULL; - GList *tmp; - - /* Degenerate case. */ - if (!list) return NULL; - - /* Assume: list = [12,2,4,11,2,4,6,1,1,12]. */ - for (tmp = list; tmp; ) - { - GList *tmp2; - for (tmp2 = tmp; - tmp2->next && compare_func (tmp2->data, tmp2->next->data) <= 0; - tmp2 = tmp2->next) - /* Nothing */; - runs = g_slist_append (runs, tmp); - tmp = tmp2->next; - tmp2->next = NULL; - } - /* Now: runs = [[12],[2,4,11],[2,4,6],[1,1,12]]. */ - - while (runs->next) - { - /* We have more than one run. Merge pairwise. */ - GSList *dst, *src, *dstprev = NULL; - dst = src = runs; - while (src && src->next) - { - dst->data = g_list_sort_merge (src->data, - src->next->data, - (GFunc) compare_func, - FALSE, NULL); - dstprev = dst; - dst = dst->next; - src = src->next->next; - } - - /* If number of runs was odd, just keep the last. */ - if (src) - { - dst->data = src->data; - dstprev = dst; - dst = dst->next; - } - - dstprev->next = NULL; - g_slist_free (dst); - } - - /* After 1st loop: runs = [[2,4,11,12],[1,1,2,4,6,12]]. */ - /* After 2nd loop: runs = [[1,1,2,2,4,4,6,11,12,12]]. */ - - list = runs->data; - g_slist_free (runs); - return list; -} diff --git a/glist.h b/glist.h deleted file mode 100644 index 81ec9b3a..00000000 --- a/glist.h +++ /dev/null @@ -1,105 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_LIST_H__ -#define __G_LIST_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GList GList; - -struct _GList -{ - gpointer data; - GList *next; - GList *prev; -}; - -/* Doubly linked lists - */ -void g_list_push_allocator (GAllocator *allocator); -void g_list_pop_allocator (void); -GList* g_list_alloc (void); -void g_list_free (GList *list); -void g_list_free_1 (GList *list); -GList* g_list_append (GList *list, - gpointer data); -GList* g_list_prepend (GList *list, - gpointer data); -GList* g_list_insert (GList *list, - gpointer data, - gint position); -GList* g_list_insert_sorted (GList *list, - gpointer data, - GCompareFunc func); -GList* g_list_concat (GList *list1, - GList *list2); -GList* g_list_remove (GList *list, - gconstpointer data); -GList* g_list_remove_all (GList *list, - gconstpointer data); -GList* g_list_remove_link (GList *list, - GList *llink); -GList* g_list_delete_link (GList *list, - GList *link); -GList* g_list_reverse (GList *list); -GList* g_list_copy (GList *list); -GList* g_list_nth (GList *list, - guint n); -GList* g_list_nth_prev (GList *list, - guint n); -GList* g_list_find (GList *list, - gconstpointer data); -GList* g_list_find_custom (GList *list, - gconstpointer data, - GCompareFunc func); -gint g_list_position (GList *list, - GList *llink); -gint g_list_index (GList *list, - gconstpointer data); -GList* g_list_last (GList *list); -GList* g_list_first (GList *list); -guint g_list_length (GList *list); -void g_list_foreach (GList *list, - GFunc func, - gpointer user_data); -GList* g_list_sort (GList *list, - GCompareFunc compare_func); -GList* g_list_sort_with_data (GList *list, - GCompareDataFunc compare_func, - gpointer user_data); -gpointer g_list_nth_data (GList *list, - guint n); - -#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) -#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) - -G_END_DECLS - -#endif /* __G_LIST_H__ */ - diff --git a/gmacros.h b/gmacros.h deleted file mode 100644 index 5f4055c5..00000000 --- a/gmacros.h +++ /dev/null @@ -1,193 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* This file must not include any other glib header file and must thus - * not refer to variables from glibconfig.h - */ - -#ifndef __G_MACROS_H__ -#define __G_MACROS_H__ - -/* Here we provide G_GNUC_EXTENSION as an alias for __extension__, - * where this is valid. This allows for warningless compilation of - * "long long" types even in the presence of '-ansi -pedantic'. - */ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) -# define G_GNUC_EXTENSION __extension__ -#else -# define G_GNUC_EXTENSION -#endif - -/* Provide macros to feature the GCC function attribute. - */ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) -#define G_GNUC_PURE \ - __attribute__((pure)) -#else -#define G_GNUC_PURE -#endif - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) -#define G_GNUC_PRINTF( format_idx, arg_idx ) \ - __attribute__((format (printf, format_idx, arg_idx))) -#define G_GNUC_SCANF( format_idx, arg_idx ) \ - __attribute__((format (scanf, format_idx, arg_idx))) -#define G_GNUC_FORMAT( arg_idx ) \ - __attribute__((format_arg (arg_idx))) -#define G_GNUC_NORETURN \ - __attribute__((noreturn)) -#define G_GNUC_CONST \ - __attribute__((const)) -#define G_GNUC_UNUSED \ - __attribute__((unused)) -#else /* !__GNUC__ */ -#define G_GNUC_PRINTF( format_idx, arg_idx ) -#define G_GNUC_SCANF( format_idx, arg_idx ) -#define G_GNUC_FORMAT( arg_idx ) -#define G_GNUC_NORETURN -#define G_GNUC_CONST -#define G_GNUC_UNUSED -#endif /* !__GNUC__ */ - -/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with - * macros, so we can refer to them as strings unconditionally. - */ -#ifdef __GNUC__ -#define G_GNUC_FUNCTION __FUNCTION__ -#define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__ -#else /* !__GNUC__ */ -#define G_GNUC_FUNCTION "" -#define G_GNUC_PRETTY_FUNCTION "" -#endif /* !__GNUC__ */ - -#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string) -#define G_STRINGIFY_ARG(contents) #contents - -/* Provide a string identifying the current code position */ -#ifdef __GNUC__ -# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()" -#else -# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) -#endif - -/* Guard C code in headers, while including them from C++ */ -#ifdef __cplusplus -# define G_BEGIN_DECLS extern "C" { -# define G_END_DECLS } -#else -# define G_BEGIN_DECLS -# define G_END_DECLS -#endif - -/* Provide definitions for some commonly used macros. - * Some of them are only provided if they haven't already - * been defined. It is assumed that if they are already - * defined then the current definition is correct. - */ -#ifndef NULL -# ifdef __cplusplus -# define NULL (0L) -# else /* !__cplusplus */ -# define NULL ((void*) 0) -# endif /* !__cplusplus */ -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#undef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#undef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#undef ABS -#define ABS(a) (((a) < 0) ? -(a) : (a)) - -#undef CLAMP -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) - -/* Count the number of elements in an array. The array must be defined - * as such; using this with a dynamically allocated array will give - * incorrect results. - */ -#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) - -/* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT - */ -#define GPOINTER_TO_SIZE(p) ((gsize) (p)) -#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s)) - -/* Provide convenience macros for handling structure - * fields through their offsets. - */ -#define G_STRUCT_OFFSET(struct_type, member) \ - ((glong) ((guint8*) &((struct_type*) 0)->member)) -#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \ - ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset))) -#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \ - (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset))) - -/* Provide simple macro statement wrappers (adapted from Perl): - * G_STMT_START { statements; } G_STMT_END; - * can be used as a single statement, as in - * if (x) G_STMT_START { ... } G_STMT_END; else ... - * - * For gcc we will wrap the statements within `({' and `})' braces. - * For SunOS they will be wrapped within `if (1)' and `else (void) 0', - * and otherwise within `do' and `while (0)'. - */ -#if !(defined (G_STMT_START) && defined (G_STMT_END)) -# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) -# define G_STMT_START (void)( -# define G_STMT_END ) -# else -# if (defined (sun) || defined (__sun__)) -# define G_STMT_START if (1) -# define G_STMT_END else (void)0 -# else -# define G_STMT_START do -# define G_STMT_END while (0) -# endif -# endif -#endif - -/* Allow the app programmer to select whether or not return values - * (usually char*) are const or not. Don't try using this feature for - * functions with C++ linkage. - */ -#ifdef G_DISABLE_CONST_RETURNS -#define G_CONST_RETURN -#else -#define G_CONST_RETURN const -#endif - -#endif /* __G_MACROS_H__ */ diff --git a/gmain.c b/gmain.c deleted file mode 100644 index 7bff4dfc..00000000 --- a/gmain.c +++ /dev/null @@ -1,2937 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * gmain.c: Main loop abstraction, timeouts, and idle functions - * Copyright 1998 Owen Taylor - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "config.h" - -/* uncomment the next line to get poll() debugging info */ -/* #define G_MAIN_POLL_DEBUG */ - -#include "glib.h" -#include -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif /* HAVE_SYS_TIME_H */ -#ifdef GLIB_HAVE_SYS_POLL_H -# include -# undef events /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ -# undef revents /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ -#endif /* GLIB_HAVE_SYS_POLL_H */ -#ifdef HAVE_UNISTD_H -#include -#endif /* HAVE_UNISTD_H */ -#include - -#ifdef G_OS_WIN32 -#define STRICT -#include -#endif /* G_OS_WIN32 */ - -#ifdef G_OS_BEOS -#include -#endif /* G_OS_BEOS */ - -/* Types */ - -typedef struct _GTimeoutSource GTimeoutSource; -typedef struct _GPollRec GPollRec; -typedef struct _GSourceCallback GSourceCallback; - -typedef enum -{ - G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT, - G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1) -} GSourceFlags; - -struct _GMainContext -{ -#ifdef G_THREADS_ENABLED - /* The following lock is used for both the list of sources - * and the list of poll records - */ - GMutex *mutex; - GThread *thread; -#endif - - GPtrArray *pending_dispatches; - gint timeout; /* Timeout for current iteration */ - - guint next_id; - GSource *source_list; - gint in_check_or_prepare; - - GPollRec *poll_records; - GPollRec *poll_free_list; - GMemChunk *poll_chunk; - guint n_poll_records; - GPollFD *cached_poll_array; - guint cached_poll_array_size; - -#ifdef G_THREADS_ENABLED -#ifndef G_OS_WIN32 -/* this pipe is used to wake up the main loop when a source is added. - */ - gint wake_up_pipe[2]; -#else /* G_OS_WIN32 */ - HANDLE wake_up_semaphore; -#endif /* G_OS_WIN32 */ - - GPollFD wake_up_rec; - gboolean poll_waiting; - -/* Flag indicating whether the set of fd's changed during a poll */ - gboolean poll_changed; -#endif /* G_THREADS_ENABLED */ - - GPollFunc poll_func; - - GTimeVal current_time; - gboolean time_is_current; -}; - -struct _GSourceCallback -{ - guint ref_count; - GSourceFunc func; - gpointer data; - GDestroyNotify notify; -}; - -struct _GMainLoop -{ - GMainContext *context; - gboolean is_running; - guint ref_count; - -#ifdef G_THREADS_ENABLED - GMutex *mutex; - GCond *sem_cond; -#endif /* G_THREADS_ENABLED */ -}; - -struct _GTimeoutSource -{ - GSource source; - GTimeVal expiration; - gint interval; -}; - -struct _GPollRec -{ - gint priority; - GPollFD *fd; - GPollRec *next; -}; - -#ifdef G_THREADS_ENABLED -#define LOCK_CONTEXT(context) g_mutex_lock(context->mutex) -#define UNLOCK_CONTEXT(context) g_mutex_unlock(context->mutex) -#define LOCK_LOOP(loop) g_mutex_lock(loop->mutex) -#define UNLOCK_LOOP(loop) g_mutex_unlock(loop->mutex) -#else -#define LOCK_CONTEXT(context) (void)0 -#define UNLOCK_CONTEXT(context) (void)0 -#define LOCK_LOOP(context) (void)0 -#define UNLOCK_LOOP(context) (void)0 -#endif - -#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0) - -#define SOURCE_UNREF(source, context) \ - G_STMT_START { \ - if ((source)->ref_count > 1) \ - (source)->ref_count--; \ - else \ - g_source_unref_internal ((source), (context), TRUE); \ - } G_STMT_END - - -/* Forward declarations */ - -static void g_source_unref_internal (GSource *source, - GMainContext *context, - gboolean have_lock); -static void g_source_destroy_internal (GSource *source, - GMainContext *context, - gboolean have_lock); -static void g_main_context_poll (GMainContext *context, - gint timeout, - gint priority, - GPollFD *fds, - gint n_fds); -static void g_main_context_add_poll_unlocked (GMainContext *context, - gint priority, - GPollFD *fd); -static void g_main_context_remove_poll_unlocked (GMainContext *context, - GPollFD *fd); -static void g_main_context_wakeup (GMainContext *context); - -static gboolean g_timeout_prepare (GSource *source, - gint *timeout); -static gboolean g_timeout_check (GSource *source); -static gboolean g_timeout_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data); -static gboolean g_idle_prepare (GSource *source, - gint *timeout); -static gboolean g_idle_check (GSource *source); -static gboolean g_idle_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data); - -G_LOCK_DEFINE_STATIC (main_loop); -static GMainContext *default_main_context; - -static GSourceFuncs timeout_funcs = -{ - g_timeout_prepare, - g_timeout_check, - g_timeout_dispatch, - NULL -}; - -static GSourceFuncs idle_funcs = -{ - g_idle_prepare, - g_idle_check, - g_idle_dispatch, - NULL -}; - -#ifdef HAVE_POLL -/* SunOS has poll, but doesn't provide a prototype. */ -# if defined (sun) && !defined (__SVR4) -extern gint poll (GPollFD *ufds, guint nfsd, gint timeout); -# endif /* !sun */ -#else /* !HAVE_POLL */ - -#ifdef G_OS_WIN32 - -static gint -g_poll (GPollFD *fds, - guint nfds, - gint timeout) -{ - HANDLE handles[MAXIMUM_WAIT_OBJECTS]; - gboolean poll_msgs = FALSE; - GPollFD *f; - DWORD ready; - MSG msg; - UINT timer; - gint nhandles = 0; - - for (f = fds; f < &fds[nfds]; ++f) - if (f->fd >= 0) - { - if (f->events & G_IO_IN) - { - if (f->fd == G_WIN32_MSG_HANDLE) - poll_msgs = TRUE; - else - { -#ifdef G_MAIN_POLL_DEBUG - g_print ("g_poll: waiting for %#x\n", f->fd); -#endif - handles[nhandles++] = (HANDLE) f->fd; - } - } - } - - if (timeout == -1) - timeout = INFINITE; - - if (poll_msgs) - { - /* Waiting for messages, and maybe events - * -> First PeekMessage - */ -#ifdef G_MAIN_POLL_DEBUG - g_print ("PeekMessage\n"); -#endif - if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) - ready = WAIT_OBJECT_0 + nhandles; - else - { - if (nhandles == 0) - { - /* Waiting just for messages */ - if (timeout == INFINITE) - { - /* Infinite timeout - * -> WaitMessage - */ -#ifdef G_MAIN_POLL_DEBUG - g_print ("WaitMessage\n"); -#endif - if (!WaitMessage ()) - g_warning (G_STRLOC ": WaitMessage() failed"); - ready = WAIT_OBJECT_0 + nhandles; - } - else if (timeout == 0) - { - /* Waiting just for messages, zero timeout. - * If we got here, there was no message - */ - ready = WAIT_TIMEOUT; - } - else - { - /* Waiting just for messages, some timeout - * -> Set a timer, wait for message, - * kill timer, use PeekMessage - */ - timer = SetTimer (NULL, 0, timeout, NULL); - if (timer == 0) - g_warning (G_STRLOC ": SetTimer() failed"); - else - { -#ifdef G_MAIN_POLL_DEBUG - g_print ("WaitMessage\n"); -#endif - WaitMessage (); - KillTimer (NULL, timer); -#ifdef G_MAIN_POLL_DEBUG - g_print ("PeekMessage\n"); -#endif - if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE) - && msg.message != WM_TIMER) - ready = WAIT_OBJECT_0; - else - ready = WAIT_TIMEOUT; - } - } - } - else - { - /* Wait for either message or event - * -> Use MsgWaitForMultipleObjects - */ -#ifdef G_MAIN_POLL_DEBUG - g_print ("MsgWaitForMultipleObjects(%d, %d)\n", nhandles, timeout); -#endif - ready = MsgWaitForMultipleObjects (nhandles, handles, FALSE, - timeout, QS_ALLINPUT); - - if (ready == WAIT_FAILED) - g_warning (G_STRLOC ": MsgWaitForMultipleObjects() failed"); - } - } - } - else if (nhandles == 0) - { - /* Wait for nothing (huh?) */ - return 0; - } - else - { - /* Wait for just events - * -> Use WaitForMultipleObjects - */ -#ifdef G_MAIN_POLL_DEBUG - g_print ("WaitForMultipleObjects(%d, %d)\n", nhandles, timeout); -#endif - ready = WaitForMultipleObjects (nhandles, handles, FALSE, timeout); - if (ready == WAIT_FAILED) - g_warning (G_STRLOC ": WaitForMultipleObjects() failed"); - } - -#ifdef G_MAIN_POLL_DEBUG - g_print ("wait returns %d%s\n", - ready, - (ready == WAIT_FAILED ? " (WAIT_FAILED)" : - (ready == WAIT_TIMEOUT ? " (WAIT_TIMEOUT)" : - (poll_msgs && ready == WAIT_OBJECT_0 + nhandles ? " (msg)" : "")))); -#endif - for (f = fds; f < &fds[nfds]; ++f) - f->revents = 0; - - if (ready == WAIT_FAILED) - return -1; - else if (ready == WAIT_TIMEOUT) - return 0; - else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles) - { - for (f = fds; f < &fds[nfds]; ++f) - if (f->fd >= 0) - { - if (f->events & G_IO_IN) - if (f->fd == G_WIN32_MSG_HANDLE) - f->revents |= G_IO_IN; - } - } -#if TEST_WITHOUT_THIS - else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles) - for (f = fds; f < &fds[nfds]; ++f) - { - if ((f->events & G_IO_IN) - && f->fd == (gint) handles[ready - WAIT_OBJECT_0]) - { - f->revents |= G_IO_IN; -#ifdef G_MAIN_POLL_DEBUG - g_print ("g_poll: got event %#x\n", f->fd); -#endif -#if 0 - ResetEvent ((HANDLE) f->fd); -#endif - } - } -#endif - - return 1; -} - -#else /* !G_OS_WIN32 */ - -/* The following implementation of poll() comes from the GNU C Library. - * Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. - */ - -#include /* for bzero on BSD systems */ - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* HAVE_SYS_SELECT_H */ - -#ifdef G_OS_BEOS -#undef NO_FD_SET -#endif /* G_OS_BEOS */ - -#ifndef NO_FD_SET -# define SELECT_MASK fd_set -#else /* !NO_FD_SET */ -# ifndef _AIX -typedef long fd_mask; -# endif /* _AIX */ -# ifdef _IBMR2 -# define SELECT_MASK void -# else /* !_IBMR2 */ -# define SELECT_MASK int -# endif /* !_IBMR2 */ -#endif /* !NO_FD_SET */ - -static gint -g_poll (GPollFD *fds, - guint nfds, - gint timeout) -{ - struct timeval tv; - SELECT_MASK rset, wset, xset; - GPollFD *f; - int ready; - int maxfd = 0; - - FD_ZERO (&rset); - FD_ZERO (&wset); - FD_ZERO (&xset); - - for (f = fds; f < &fds[nfds]; ++f) - if (f->fd >= 0) - { - if (f->events & G_IO_IN) - FD_SET (f->fd, &rset); - if (f->events & G_IO_OUT) - FD_SET (f->fd, &wset); - if (f->events & G_IO_PRI) - FD_SET (f->fd, &xset); - if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI))) - maxfd = f->fd; - } - - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - - ready = select (maxfd + 1, &rset, &wset, &xset, - timeout == -1 ? NULL : &tv); - if (ready > 0) - for (f = fds; f < &fds[nfds]; ++f) - { - f->revents = 0; - if (f->fd >= 0) - { - if (FD_ISSET (f->fd, &rset)) - f->revents |= G_IO_IN; - if (FD_ISSET (f->fd, &wset)) - f->revents |= G_IO_OUT; - if (FD_ISSET (f->fd, &xset)) - f->revents |= G_IO_PRI; - } - } - - return ready; -} - -#endif /* !G_OS_WIN32 */ - -#endif /* !HAVE_POLL */ - -/* Called to clean up when a thread terminates - */ -void -g_main_context_destroy (GMainContext *context) -{ - GSource *source; - - /* We need the lock here only because g_source_destroy expects - * to be able to unlock when destroying the source's data - */ - LOCK_CONTEXT (context); - source = context->source_list; - while (source) - { - GSource *next = source->next; - g_source_destroy_internal (source, context, TRUE); - source = next; - } - UNLOCK_CONTEXT (context); - -#ifdef G_THREADS_ENABLED - g_mutex_free (context->mutex); -#endif - - g_ptr_array_free (context->pending_dispatches, TRUE); - g_free (context->cached_poll_array); - - g_mem_chunk_destroy (context->poll_chunk); - -#ifdef G_THREADS_ENABLED - if (g_thread_supported()) - { -#ifndef G_OS_WIN32 - close (context->wake_up_pipe[0]); - close (context->wake_up_pipe[1]); -#else - CloseHandle (context->wake_up_semaphore); -#endif - } -#endif - - g_free (context); -} - -/* This is an imcomplete (only the members up till context) version of - * GRealThread from gthread.h. Keep them in sync */ -typedef struct _GRealThread GRealThread; -struct _GRealThread -{ - GThread thread; - GMainContext *context; -}; - -/** - * g_main_context_get: - * @thread: a #GThread - * - * Retrieves the main loop context for a particular thread. This - * will create the main context for the thread if none previously - * existed. The context will exist until the thread terminates. - * - * Return value: the main loop context for @thread. - **/ -GMainContext * -g_main_context_get (GThread *thread) -{ - GRealThread *real_thread = (GRealThread*)thread; - GMainContext *context; - - g_return_val_if_fail (thread != NULL, NULL); - - if (g_thread_supported ()) - context = real_thread->context; - else - context = default_main_context; - - if (!context) - { - context = g_new0 (GMainContext, 1); - -#ifdef G_THREADS_ENABLED - if (g_thread_supported ()) - context->mutex = g_mutex_new(); - - context->thread = thread; -#endif - - context->next_id = 1; - - context->source_list = NULL; - -#if HAVE_POLL - context->poll_func = (GPollFunc)poll; -#else - context->poll_func = g_poll; -#endif - - context->cached_poll_array = NULL; - context->cached_poll_array_size = 0; - - context->pending_dispatches = g_ptr_array_new (); - - context->time_is_current = FALSE; - -#ifdef G_THREADS_ENABLED - if (g_thread_supported ()) - { -#ifndef G_OS_WIN32 - if (pipe (context->wake_up_pipe) < 0) - g_error ("Cannot create pipe main loop wake-up: %s\n", - g_strerror (errno)); - - context->wake_up_rec.fd = context->wake_up_pipe[0]; - context->wake_up_rec.events = G_IO_IN; - g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec); -#else - context->wake_up_semaphore = CreateSemaphore (NULL, 0, 100, NULL); - if (context->wake_up_semaphore == NULL) - g_error ("Cannot create wake-up semaphore: %s", - g_win32_error_message (GetLastError ())); - context->wake_up_rec.fd = (gint) context->wake_up_semaphore; - context->wake_up_rec.events = G_IO_IN; -#ifdef G_MAIN_POLL_DEBUG - g_print ("wake-up semaphore: %#x\n", (guint) context->wake_up_semaphore); -#endif - g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec); -#endif - } -#endif - - if (g_thread_supported ()) - real_thread->context = context; - else - default_main_context = context; - } - - return context; -} - -/** - * g_main_context_default: - * - * Return the default main context. This is the main context used - * for main loop functions when a main loop is not explicitly - * specified. - * - * Return value: the default main context. - **/ -GMainContext * -g_main_context_default (void) -{ - /* Slow, but safe */ - - G_LOCK (main_loop); - - if (!default_main_context) - default_main_context = g_main_context_get (g_thread_self ()); - - G_UNLOCK (main_loop); - - return default_main_context; -} - -/* Hooks for adding to the main loop */ - -/** - * g_source_new: - * @source_funcs: structure containing functions that implement - * the sources behavior. - * @struct_size: size of the #GSource structure to create - * - * Create a new GSource structure. The size is specified to - * allow creating structures derived from GSource that contain - * additional data. The size passed in must be at least - * sizeof(GSource). - * - * The source will not initially be associated with any #GMainContext - * and must be added to one with g_source_add() before it will be - * executed. - * - * Return value: the newly create #GSource - **/ -GSource * -g_source_new (GSourceFuncs *source_funcs, - guint struct_size) -{ - GSource *source; - - g_return_val_if_fail (source_funcs != NULL, NULL); - g_return_val_if_fail (struct_size >= sizeof (GSource), NULL); - - source = (GSource*) g_malloc0 (struct_size); - - source->source_funcs = source_funcs; - source->ref_count = 1; - - source->priority = G_PRIORITY_DEFAULT; - - source->flags = G_HOOK_FLAG_ACTIVE; - - /* NULL/0 initialization for all other fields */ - - return source; -} - -/* Holds context's lock - */ -static void -g_source_list_add (GSource *source, - GMainContext *context) -{ - GSource *tmp_source, *last_source; - - last_source = NULL; - tmp_source = context->source_list; - while (tmp_source && tmp_source->priority <= source->priority) - { - last_source = tmp_source; - tmp_source = tmp_source->next; - } - - source->next = tmp_source; - if (tmp_source) - tmp_source->prev = source; - - source->prev = last_source; - if (last_source) - last_source->next = source; - else - context->source_list = source; -} - -/* Holds context's lock - */ -static void -g_source_list_remove (GSource *source, - GMainContext *context) -{ - if (source->prev) - source->prev->next = source->next; - else - context->source_list = source->next; - - if (source->next) - source->next->prev = source->prev; - - source->prev = NULL; - source->next = NULL; -} - -/** - * g_source_attach: - * @source: a #GSource - * @context: a #GMainContext (if %NULL, the default context will be used) - * - * Adds a #GSource to a @context so that it will be executed within - * that context. - * - * Return value: the ID for the source within the #GMainContext - **/ -guint -g_source_attach (GSource *source, - GMainContext *context) -{ - guint result = 0; - GSList *tmp_list; - - g_return_val_if_fail (source->context == NULL, 0); - g_return_val_if_fail (!SOURCE_DESTROYED (source), 0); - - if (!context) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - source->context = context; - result = source->id = context->next_id++; - - source->ref_count++; - g_source_list_add (source, context); - - tmp_list = source->poll_fds; - while (tmp_list) - { - g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data); - tmp_list = tmp_list->next; - } - -#ifdef G_THREADS_ENABLED - /* Now wake up the main loop if it is waiting in the poll() */ - g_main_context_wakeup (context); -#endif - - UNLOCK_CONTEXT (context); - - return result; -} - -static void -g_source_destroy_internal (GSource *source, - GMainContext *context, - gboolean have_lock) -{ - if (!have_lock) - LOCK_CONTEXT (context); - - if (!SOURCE_DESTROYED (source)) - { - GSList *tmp_list; - gpointer old_cb_data; - GSourceCallbackFuncs *old_cb_funcs; - - source->flags &= ~G_HOOK_FLAG_ACTIVE; - - old_cb_data = source->callback_data; - old_cb_funcs = source->callback_funcs; - - source->callback_data = NULL; - source->callback_funcs = NULL; - - if (old_cb_funcs) - { - UNLOCK_CONTEXT (context); - old_cb_funcs->unref (old_cb_data); - LOCK_CONTEXT (context); - } - - tmp_list = source->poll_fds; - while (tmp_list) - { - g_main_context_remove_poll_unlocked (context, tmp_list->data); - tmp_list = tmp_list->next; - } - - g_source_unref_internal (source, context, TRUE); - } - - if (!have_lock) - UNLOCK_CONTEXT (context); -} - -/** - * g_source_destroy: - * @source: a #GSource - * - * Remove a source from its #GMainContext, if any, and mark it as - * destroyed. The source cannot be subsequently added to another - * context. - **/ -void -g_source_destroy (GSource *source) -{ - GMainContext *context; - - g_return_if_fail (source != NULL); - - context = source->context; - - if (context) - g_source_destroy_internal (source, context, FALSE); - else - source->flags &= ~G_HOOK_FLAG_ACTIVE; -} - -/** - * g_source_get_id: - * @source: a #GSource - * - * Return the numeric ID for a particular source. The ID of a source - * is unique within a particular main loop context. The reverse - * mapping from ID to source is done by g_main_context_find_source_by_id(). - * - * Return value: the ID for the source - **/ -guint -g_source_get_id (GSource *source) -{ - guint result; - - g_return_val_if_fail (source != NULL, 0); - g_return_val_if_fail (source->context != NULL, 0); - - LOCK_CONTEXT (source->context); - result = source->id; - UNLOCK_CONTEXT (source->context); - - return result; -} - -/** - * g_source_get_context: - * @source: a #GSource - * - * Get the #GMainContext with which the source is associated. - * Calling this function on a destroyed source is an error. - * - * Return value: the #GMainContext with which the source is associated, - * or %NULL if the context has not yet been added - * to a source. - **/ -GMainContext * -g_source_get_context (GSource *source) -{ - g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL); - - return source->context; -} - -/** - * g_source_add_poll: - * @source:a #GSource - * @fd: a #GPollFD structure holding information about a file - * descriptor to watch. - * - * Add a file descriptor to the set of file descriptors polled for - * this source. This is usually combined with g_source_new() to add an - * event source. The event source's check function will typically test - * the revents field in the #GPollFD struct and return %TRUE if events need - * to be processed. - **/ -void -g_source_add_poll (GSource *source, - GPollFD *fd) -{ - GMainContext *context; - - g_return_if_fail (source != NULL); - g_return_if_fail (fd != NULL); - g_return_if_fail (!SOURCE_DESTROYED (source)); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - source->poll_fds = g_slist_prepend (source->poll_fds, fd); - - if (context) - { - g_main_context_add_poll_unlocked (context, source->priority, fd); - UNLOCK_CONTEXT (context); - } -} - -/** - * g_source_remove_poll: - * @source:a #GSource - * @fd: a #GPollFD structure previously passed to g_source_poll. - * - * Remove a file descriptor from the set of file descriptors polled for - * this source. - **/ -void -g_source_remove_poll (GSource *source, - GPollFD *fd) -{ - GMainContext *context; - - g_return_if_fail (source != NULL); - g_return_if_fail (fd != NULL); - g_return_if_fail (!SOURCE_DESTROYED (source)); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - source->poll_fds = g_slist_remove (source->poll_fds, fd); - - if (context) - { - g_main_context_remove_poll_unlocked (context, fd); - UNLOCK_CONTEXT (context); - } -} - -/** - * g_source_set_callback_indirect: - * @source: the source - * @callback_data: pointer to callback data "object" - * @callback_funcs: functions for reference counting callback_data - * and getting the callback and data - * - * Set the callback function storing the data as a refcounted callback - * "object". This is used to implement g_source_set_callback_closure() - * and internally. Note that calling g_source_set_callback_indirect() assumes - * an initial reference count on @callback_data, and thus - * @callback_funcs->unref will eventually be called once more - * than @callback_funcs->ref. - **/ -void -g_source_set_callback_indirect (GSource *source, - gpointer callback_data, - GSourceCallbackFuncs *callback_funcs) -{ - GMainContext *context; - gpointer old_cb_data; - GSourceCallbackFuncs *old_cb_funcs; - - g_return_if_fail (source != NULL); - g_return_if_fail (callback_funcs != NULL || callback_data == NULL); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - old_cb_data = source->callback_data; - old_cb_funcs = source->callback_funcs; - - source->callback_data = callback_data; - source->callback_funcs = callback_funcs; - - if (context) - UNLOCK_CONTEXT (context); - - if (old_cb_funcs) - old_cb_funcs->unref (old_cb_data); -} - -static void -g_source_callback_ref (gpointer cb_data) -{ - GSourceCallback *callback = cb_data; - - callback->ref_count++; -} - - -static void -g_source_callback_unref (gpointer cb_data) -{ - GSourceCallback *callback = cb_data; - - callback->ref_count--; - if (callback->ref_count == 0) - { - if (callback->notify) - callback->notify (callback->data); - g_free (callback); - } -} - -static void -g_source_callback_get (gpointer cb_data, - GSourceFunc *func, - gpointer *data) -{ - GSourceCallback *callback = cb_data; - - *func = callback->func; - *data = callback->data; -} - -static GSourceCallbackFuncs g_source_callback_funcs = { - g_source_callback_ref, - g_source_callback_unref, - g_source_callback_get, -}; - -/** - * g_source_set_callback: - * @source: the source - * @func: a callback function - * @data: the data to pass to callback function - * @notify: a function to call when @data is no longer in use, or %NULL. - * - * Set the callback function for a source. - **/ -void -g_source_set_callback (GSource *source, - GSourceFunc func, - gpointer data, - GDestroyNotify notify) -{ - GSourceCallback *new_callback; - - g_return_if_fail (source != NULL); - - new_callback = g_new (GSourceCallback, 1); - - new_callback->ref_count = 1; - new_callback->func = func; - new_callback->data = data; - new_callback->notify = notify; - - g_source_set_callback_indirect (source, new_callback, &g_source_callback_funcs); -} - -/** - * g_source_set_priority: - * @source: a #GSource - * @priority: the new priority. - * - * Set the priority of a source. While the main loop is being - * run, a source will - **/ -void -g_source_set_priority (GSource *source, - gint priority) -{ - GSList *tmp_list; - GMainContext *context; - - g_return_if_fail (source != NULL); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - source->priority = priority; - - if (context) - { - source->next = NULL; - source->prev = NULL; - - tmp_list = source->poll_fds; - while (tmp_list) - { - g_main_context_remove_poll_unlocked (context, tmp_list->data); - g_main_context_add_poll_unlocked (context, priority, tmp_list->data); - - tmp_list = tmp_list->next; - } - - UNLOCK_CONTEXT (source->context); - } -} - -/** - * g_source_get_priority: - * @source: a #GSource - * - * Gets the priority of a surce - * - * Return value: the priority of the source - **/ -gint -g_source_get_priority (GSource *source) -{ - g_return_val_if_fail (source != NULL, 0); - - return source->priority; -} - -/** - * g_source_set_can_recurse: - * @source: a #GSource - * @can_recurse: whether recursion is allowed for this source - * - * Sets whether a source can be called recursively. If @can_recurse is - * %TRUE, then while the source is being dispatched then this source - * will be processed normally. Otherwise, all processing of this - * source is blocked until the dispatch function returns. - **/ -void -g_source_set_can_recurse (GSource *source, - gboolean can_recurse) -{ - GMainContext *context; - - g_return_if_fail (source != NULL); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - if (can_recurse) - source->flags |= G_SOURCE_CAN_RECURSE; - else - source->flags &= ~G_SOURCE_CAN_RECURSE; - - if (context) - UNLOCK_CONTEXT (context); -} - -/** - * g_source_get_can_recurse: - * @source: a #GSource - * - * Checks whether a source is allowed to be called recursively. - * see g_source_set_can_recurse. - * - * Return value: whether recursion is allowed. - **/ -gboolean -g_source_get_can_recurse (GSource *source) -{ - g_return_val_if_fail (source != NULL, FALSE); - - return (source->flags & G_SOURCE_CAN_RECURSE) != 0; -} - -/** - * g_source_ref: - * @source: a #GSource - * - * Increases the reference count on a source by one. - * - * Return value: @source - **/ -GSource * -g_source_ref (GSource *source) -{ - GMainContext *context; - - g_return_val_if_fail (source != NULL, NULL); - - context = source->context; - - if (context) - LOCK_CONTEXT (context); - - source->ref_count++; - - if (context) - UNLOCK_CONTEXT (context); - - return source; -} - -/* g_source_unref() but possible to call within context lock - */ -static void -g_source_unref_internal (GSource *source, - GMainContext *context, - gboolean have_lock) -{ - gpointer old_cb_data = NULL; - GSourceCallbackFuncs *old_cb_funcs = NULL; - - g_return_if_fail (source != NULL); - - if (!have_lock && context) - LOCK_CONTEXT (context); - - source->ref_count--; - if (source->ref_count == 0) - { - old_cb_data = source->callback_data; - old_cb_funcs = source->callback_funcs; - - source->callback_data = NULL; - source->callback_funcs = NULL; - - if (context && !SOURCE_DESTROYED (source)) - { - g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!"); - source->ref_count++; - } - else if (context) - g_source_list_remove (source, context); - - if (source->source_funcs->destroy) - source->source_funcs->destroy (source); - - g_slist_free (source->poll_fds); - source->poll_fds = NULL; - g_free (source); - } - - if (!have_lock && context) - UNLOCK_CONTEXT (context); - - if (old_cb_funcs) - { - if (have_lock) - UNLOCK_CONTEXT (context); - - old_cb_funcs->unref (old_cb_data); - - if (have_lock) - LOCK_CONTEXT (context); - } -} - -/** - * g_source_unref: - * @source: a #GSource - * - * Decreases the reference count of a source by one. If the - * resulting reference count is zero the source and associated - * memory will be destroyed. - **/ -void -g_source_unref (GSource *source) -{ - g_return_if_fail (source != NULL); - - g_source_unref_internal (source, source->context, FALSE); -} - -/** - * g_main_context_find_source_by_id: - * @context: a #GMainContext (if %NULL, the default context will be used) - * @id: the source ID, as returned by g_source_get_id() - * - * Finds a #GSource given a pair of context and ID - * - * Return value: the #GSource if found, otherwise, %NULL - **/ -GSource * -g_main_context_find_source_by_id (GMainContext *context, - guint id) -{ - GSource *source; - - g_return_val_if_fail (id > 0, FALSE); - - if (context == NULL) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - source = context->source_list; - while (source) - { - if (!SOURCE_DESTROYED (source) && - source->id == id) - break; - source = source->next; - } - - UNLOCK_CONTEXT (context); - - return source; -} - -/** - * g_main_context_find_source_by_funcs_user_data: - * @context: a #GMainContext (if %NULL, the default context will be used). - * @funcs: the @source_funcs passed to g_source_new(). - * @user_data: the user data from the callback. - * - * Finds a source with the given source functions and user data. If - * multiple sources exist with the same source function and user data, - * the first one found will be returned. - * - * Return value: the source, if one was found, otherwise %NULL - **/ -GSource * -g_main_context_find_source_by_funcs_user_data (GMainContext *context, - GSourceFuncs *funcs, - gpointer user_data) -{ - GSource *source; - - g_return_val_if_fail (funcs != NULL, FALSE); - - if (context == NULL) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - source = context->source_list; - while (source) - { - if (!SOURCE_DESTROYED (source) && - source->source_funcs == funcs && - source->callback_data == user_data) - break; - source = source->next; - } - - UNLOCK_CONTEXT (context); - - return source; -} - -/** - * g_main_context_find_source_by_user_data: - * @context: a #GMainContext - * @user_data: the user_data for the callback. - * - * Finds a source with the given user data for the callback. If - * multiple sources exist with the same user data, the first - * one found will be returned. - * - * Return value: the source, if one was found, otherwise %NULL - **/ -GSource * -g_main_context_find_source_by_user_data (GMainContext *context, - gpointer user_data) -{ - GSource *source; - - if (context == NULL) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - source = context->source_list; - while (source) - { - if (!SOURCE_DESTROYED (source) && - source->callback_data == user_data) - break; - source = source->next; - } - - UNLOCK_CONTEXT (context); - - return source; -} - -/** - * g_source_remove: - * @tag: the id of the source to remove. - * - * Removes the source with the given id from the default main - * context. The id of a #GSource is given by g_source_get_id(), - * or will be returned by the functions g_source_attach(), - * g_idle_add(), g_idle_add_full(), g_timeout_add(), - * g_timeout_add_full(), g_io_add_watch, and g_io_add_watch_full(). - * - * See also g_source_destroy(). - * - * Return value: %TRUE if the source was found and removed. - **/ -gboolean -g_source_remove (guint tag) -{ - GSource *source; - - g_return_val_if_fail (tag > 0, FALSE); - - source = g_main_context_find_source_by_id (NULL, tag); - if (source) - g_source_destroy (source); - - return source != NULL; -} - -/** - * g_source_remove_by_user_data: - * @user_data: the user_data for the callback. - * - * Removes a source from the default main loop context given the user - * data for the callback. If multiple sources exist with the same user - * data, only one will be destroyed. - * - * Return value: %TRUE if a source was found and removed. - **/ -gboolean -g_source_remove_by_user_data (gpointer user_data) -{ - GSource *source; - - source = g_main_context_find_source_by_user_data (NULL, user_data); - if (source) - { - g_source_destroy (source); - return TRUE; - } - else - return FALSE; -} - -/** - * g_source_remove_by_funcs_user_data: - * @funcs: The @source_funcs passed to g_source_new() - * @user_data: the user data for the callback - * - * Removes a source from the default main loop context given the - * source functions and user data. If multiple sources exist with the - * same source functions and user data, only one will be destroyed. - * - * Return value: %TRUE if a source was found and removed. - **/ -gboolean -g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, - gpointer user_data) -{ - GSource *source; - - g_return_val_if_fail (funcs != NULL, FALSE); - - source = g_main_context_find_source_by_funcs_user_data (NULL, funcs, user_data); - if (source) - { - g_source_destroy (source); - return TRUE; - } - else - return FALSE; -} - -/** - * g_get_current_time: - * @result: #GTimeVal structure in which to store current time. - * - * Equivalent to Unix's gettimeofday(), but portable - **/ -void -g_get_current_time (GTimeVal *result) -{ -#ifndef G_OS_WIN32 - struct timeval r; - - g_return_if_fail (result != NULL); - - /*this is required on alpha, there the timeval structs are int's - not longs and a cast only would fail horribly*/ - gettimeofday (&r, NULL); - result->tv_sec = r.tv_sec; - result->tv_usec = r.tv_usec; -#else - /* Avoid calling time() except for the first time. - * GetTickCount() should be pretty fast and low-level? - * I could also use ftime() but it seems unnecessarily overheady. - */ - static DWORD start_tick = 0; - static time_t start_time; - DWORD tick; - - g_return_if_fail (result != NULL); - - if (start_tick == 0) - { - start_tick = GetTickCount (); - time (&start_time); - } - - tick = GetTickCount (); - - result->tv_sec = (tick - start_tick) / 1000 + start_time; - result->tv_usec = ((tick - start_tick) % 1000) * 1000; -#endif -} - -/* Running the main loop */ - -/* HOLDS: context's lock */ -static void -g_main_dispatch (GMainContext *context) -{ - guint i; - - for (i = 0; i < context->pending_dispatches->len; i++) - { - GSource *source = context->pending_dispatches->pdata[i]; - - context->pending_dispatches->pdata[i] = NULL; - g_assert (source); - - source->flags &= ~G_SOURCE_READY; - - if (!SOURCE_DESTROYED (source)) - { - gboolean was_in_call; - gpointer user_data = NULL; - GSourceFunc callback = NULL; - GSourceCallbackFuncs *cb_funcs; - gpointer cb_data; - gboolean need_destroy; - - gboolean (*dispatch) (GSource *, - GSourceFunc, - gpointer); - - dispatch = source->source_funcs->dispatch; - cb_funcs = source->callback_funcs; - cb_data = source->callback_data; - - if (cb_funcs) - cb_funcs->ref (cb_data); - - was_in_call = source->flags & G_HOOK_FLAG_IN_CALL; - source->flags |= G_HOOK_FLAG_IN_CALL; - - UNLOCK_CONTEXT (context); - - if (cb_funcs) - cb_funcs->get (cb_data, &callback, &user_data); - - need_destroy = ! dispatch (source, - callback, - user_data); - LOCK_CONTEXT (context); - - if (cb_funcs) - cb_funcs->unref (cb_data); - - if (!was_in_call) - source->flags &= ~G_HOOK_FLAG_IN_CALL; - - /* Note: this depends on the fact that we can't switch - * sources from one main context to another - */ - if (need_destroy && !SOURCE_DESTROYED (source)) - { - g_assert (source->context == context); - g_source_destroy_internal (source, context, TRUE); - } - } - - SOURCE_UNREF (source, context); - } - - g_ptr_array_set_size (context->pending_dispatches, 0); -} - -/* Holds context's lock */ -static inline GSource * -next_valid_source (GMainContext *context, - GSource *source) -{ - GSource *new_source = source ? source->next : context->source_list; - - while (new_source) - { - if (!SOURCE_DESTROYED (new_source)) - { - new_source->ref_count++; - break; - } - - new_source = new_source->next; - } - - if (source) - SOURCE_UNREF (source, context); - - return new_source; -} - - -/** - * g_main_context_prepare: - * @context: a #GMainContext - * @priority: location to store priority of highest priority - * source already ready. - * - * Prepares to poll sources within a main loop. The resulting information - * for polling is determined by calling g_main_context_query (). - * - * Return value: %TRUE if some source is ready to be dispatched - * prior to polling. - **/ -gboolean -g_main_context_prepare (GMainContext *context, - gint *priority) -{ - gint n_ready = 0; - gint current_priority = G_MAXINT; - GSource *source; - - if (context == NULL) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - context->time_is_current = FALSE; - - if (context->in_check_or_prepare) - { - g_warning ("g_main_context_prepare() called recursively from within a source's check() or " - "prepare() member."); - UNLOCK_CONTEXT (context); - return FALSE; - } - -#ifdef G_THREADS_ENABLED - if (context->poll_waiting) - { - g_warning("g_main_context_prepare(): main loop already active in another thread"); - UNLOCK_CONTEXT (context); - return FALSE; - } - - context->poll_waiting = TRUE; -#endif /* G_THREADS_ENABLED */ - -#if 0 - /* If recursing, finish up current dispatch, before starting over */ - if (context->pending_dispatches) - { - if (dispatch) - g_main_dispatch (context, ¤t_time); - - UNLOCK_CONTEXT (context); - return TRUE; - } -#endif - - /* If recursing, clear list of pending dispatches */ - g_ptr_array_set_size (context->pending_dispatches, 0); - - /* Prepare all sources */ - - context->timeout = -1; - - source = next_valid_source (context, NULL); - while (source) - { - gint source_timeout = -1; - - if ((n_ready > 0) && (source->priority > current_priority)) - { - SOURCE_UNREF (source, context); - break; - } - if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE)) - goto next; - - if (!(source->flags & G_SOURCE_READY)) - { - gboolean result; - gboolean (*prepare) (GSource *source, - gint *timeout); - - prepare = source->source_funcs->prepare; - context->in_check_or_prepare++; - UNLOCK_CONTEXT (context); - - result = (*prepare) (source, &source_timeout); - - LOCK_CONTEXT (context); - context->in_check_or_prepare--; - - if (result) - source->flags |= G_SOURCE_READY; - } - - if (source->flags & G_SOURCE_READY) - { - n_ready++; - current_priority = source->priority; - context->timeout = 0; - } - - if (source_timeout >= 0) - { - if (context->timeout < 0) - context->timeout = source_timeout; - else - context->timeout = MIN (context->timeout, source_timeout); - } - - next: - source = next_valid_source (context, source); - } - - UNLOCK_CONTEXT (context); - - if (priority) - *priority = current_priority; - - return (n_ready > 0); -} - -/** - * g_main_context_query: - * @context: a #GMainContext - * @max_priority: maximum priority source to check - * @timeout: location to store timeout to be used in polling - * @fds: location to store #GPollFD records that need to be polled. - * @n_fds: length of @fds. - * - * Determines information necessary to poll this main loop. - * - * Return value: - **/ -gint -g_main_context_query (GMainContext *context, - gint max_priority, - gint *timeout, - GPollFD *fds, - gint n_fds) -{ - gint n_poll; - GPollRec *pollrec; - - LOCK_CONTEXT (context); - - pollrec = context->poll_records; - n_poll = 0; - while (pollrec && max_priority >= pollrec->priority) - { - if (pollrec->fd->events) - { - if (n_poll < n_fds) - { - fds[n_poll].fd = pollrec->fd->fd; - /* In direct contradiction to the Unix98 spec, IRIX runs into - * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL - * flags in the events field of the pollfd while it should - * just ignoring them. So we mask them out here. - */ - fds[n_poll].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL); - fds[n_poll].revents = 0; - } - n_poll++; - } - - pollrec = pollrec->next; - } - -#ifdef G_THREADS_ENABLED - context->poll_changed = FALSE; -#endif - - if (timeout) - { - *timeout = context->timeout; - if (timeout != 0) - context->time_is_current = FALSE; - } - - UNLOCK_CONTEXT (context); - - return n_poll; -} - -/** - * g_main_context_check: - * @context: a #GMainContext - * @max_priority: the maximum numerical priority of sources to check - * @fds: array of #GPollFD's that was passed to the last call to - * g_main_context_query() - * @n_fds: return value of g_main_context_query() - * - * Pass the results of polling back to the main loop. - * - * Return value: %TRUE if some sources are ready to be dispatched. - **/ -gboolean -g_main_context_check (GMainContext *context, - gint max_priority, - GPollFD *fds, - gint n_fds) -{ - GSource *source; - GPollRec *pollrec; - gint n_ready = 0; - gint i; - - LOCK_CONTEXT (context); - - if (context->in_check_or_prepare) - { - g_warning ("g_main_context_check() called recursively from within a source's check() or " - "prepare() member."); - UNLOCK_CONTEXT (context); - return FALSE; - } - -#ifdef G_THREADS_ENABLED - if (!context->poll_waiting) - { -#ifndef G_OS_WIN32 - gchar c; - read (context->wake_up_pipe[0], &c, 1); -#endif - } - else - context->poll_waiting = FALSE; - - /* If the set of poll file descriptors changed, bail out - * and let the main loop rerun - */ - if (context->poll_changed) - { - UNLOCK_CONTEXT (context); - return 0; - } -#endif /* G_THREADS_ENABLED */ - - pollrec = context->poll_records; - i = 0; - while (i < n_fds) - { - if (pollrec->fd->events) - { - pollrec->fd->revents = fds[i].revents; - i++; - } - pollrec = pollrec->next; - } - - source = next_valid_source (context, NULL); - while (source) - { - if ((n_ready > 0) && (source->priority > max_priority)) - { - SOURCE_UNREF (source, context); - break; - } - if ((source->flags & G_HOOK_FLAG_IN_CALL) && !(source->flags & G_SOURCE_CAN_RECURSE)) - goto next; - - if (!(source->flags & G_SOURCE_READY)) - { - gboolean result; - gboolean (*check) (GSource *source); - - check = source->source_funcs->check; - - context->in_check_or_prepare++; - UNLOCK_CONTEXT (context); - - result = (*check) (source); - - LOCK_CONTEXT (context); - context->in_check_or_prepare--; - - if (result) - source->flags |= G_SOURCE_READY; - } - - if (source->flags & G_SOURCE_READY) - { - source->ref_count++; - g_ptr_array_add (context->pending_dispatches, source); - - n_ready++; - } - - next: - source = next_valid_source (context, source); - } - - UNLOCK_CONTEXT (context); - - return n_ready > 0; -} - -/** - * g_main_context_dispatch: - * @context: a #GMainContext - * - * Dispatch all pending sources() - **/ -void -g_main_context_dispatch (GMainContext *context) -{ - LOCK_CONTEXT (context); - - if (context->pending_dispatches->len > 0) - { - g_main_dispatch (context); - } - - UNLOCK_CONTEXT (context); -} - -static gboolean -g_main_context_iterate (GMainContext *context, - gboolean block, - gboolean dispatch) -{ - gint max_priority; - gint timeout; - gboolean some_ready; - gint nfds, new_nfds; - GPollFD *fds; - - some_ready = g_main_context_prepare (context, &max_priority); - - do - { - LOCK_CONTEXT (context); - - if (context->cached_poll_array) - { - nfds = context->cached_poll_array_size; - fds = context->cached_poll_array; - context->cached_poll_array = NULL; - } - else - { - nfds = context->cached_poll_array_size = context->n_poll_records; - fds = g_new (GPollFD, nfds); - } - - UNLOCK_CONTEXT (context); - - new_nfds = g_main_context_query (context, max_priority, - &timeout, fds, nfds); - } - while (new_nfds > nfds); - - if (!block) - timeout = 0; - - g_main_context_poll (context, timeout, max_priority, - fds, new_nfds); - - g_main_context_check (context, - max_priority, - fds, new_nfds); - - LOCK_CONTEXT (context); - - g_assert (!context->cached_poll_array); - - context->cached_poll_array = fds; - context->cached_poll_array_size = nfds; - - UNLOCK_CONTEXT (context); - - if (dispatch) - g_main_context_dispatch (context); - - return some_ready; -} - -/** - * g_main_context_pending: - * @context: a #GMainContext (if %NULL, the default context will be used) - * - * Check if any sources have pending events for the given context. - * - * Return value: %TRUE if events are pending. - **/ -gboolean -g_main_context_pending (GMainContext *context) -{ - if (!context) - context = g_main_context_default(); - - return g_main_context_iterate (context, FALSE, FALSE); -} - -/** - * g_main_context_iteration: - * @context: a #GMainContext (if %NULL, the default context will be used) - * @may_block: whether the call may block. - * - * Run a single iteration for the given main loop. This involves - * checking to see if any event sources are ready to be processed, - * then if no events sources are ready and @may_block is %TRUE, waiting - * for a source to become ready, then dispatching the highest priority - * events sources that are ready. Note that even when @may_block is %TRUE, - * it is still possible for g_main_context_iteration() to return - * %FALSE, since the the wait may be interrupted for other - * reasons than an event source becoming ready. - * - * Return value: %TRUE if events were dispatched. - **/ -gboolean -g_main_context_iteration (GMainContext *context, gboolean may_block) -{ - if (!context) - context = g_main_context_default(); - - return g_main_context_iterate (context, may_block, TRUE); -} - -/** - * g_main_loop_new: - * @context: a #GMainContext (if %NULL, the default context will be used). - * @is_running: set to TRUE to indicate that the loop is running. This - * is not very important since calling g_main_run() will set this to - * TRUE anyway. - * - * Create a new #GMainLoop structure - * - * Return value: - **/ -GMainLoop * -g_main_loop_new (GMainContext *context, - gboolean is_running) -{ - GMainLoop *loop; - - if (!context) - context = g_main_context_default(); - - loop = g_new0 (GMainLoop, 1); - loop->context = context; - loop->is_running = is_running != FALSE; - loop->ref_count = 1; - -#ifdef G_THREADS_ENABLED - if (g_thread_supported ()) - loop->mutex = g_mutex_new (); - else - loop->mutex = NULL; - loop->sem_cond = NULL; -#endif /* G_THREADS_ENABLED */ - - return loop; -} - -/** - * g_main_loop_ref: - * @loop: a #GMainLoop - * - * Increase the reference count on a #GMainLoop object by one. - * - * Return value: @loop - **/ -GMainLoop * -g_main_loop_ref (GMainLoop *loop) -{ - g_return_val_if_fail (loop != NULL, NULL); - - LOCK_LOOP (loop); - loop->ref_count++; - UNLOCK_LOOP (loop); - - return loop; -} - -static void -main_loop_destroy (GMainLoop *loop) -{ -#ifdef G_THREADS_ENABLED - g_mutex_free (loop->mutex); - if (loop->sem_cond) - g_cond_free (loop->sem_cond); -#endif /* G_THREADS_ENABLED */ - - g_free (loop); -} - -/** - * g_main_loop_unref: - * @loop: a #GMainLoop - * - * Decreases the reference count on a #GMainLoop object by one. If - * the result is zero, free the loop and free all associated memory. - **/ -void -g_main_loop_unref (GMainLoop *loop) -{ - g_return_if_fail (loop != NULL); - g_return_if_fail (loop->ref_count > 0); - - LOCK_LOOP (loop); - - loop->ref_count--; - if (loop->ref_count == 0) - { - /* When the ref_count is 0, there can be nobody else using the - * loop, so it is safe to unlock before destroying. - */ - UNLOCK_LOOP (loop); - main_loop_destroy (loop); - } - else - UNLOCK_LOOP (loop); -} - -/** - * g_main_loop_run: - * @loop: a #GMainLoop - * - * Run a main loop until g_main_quit() is called on the loop. - * If this is called for the thread of the loop's #GMainContext, - * it will process events from the loop, otherwise it will - * simply wait. - **/ -void -g_main_loop_run (GMainLoop *loop) -{ - g_return_if_fail (loop != NULL); - - /* The assumption here is that a reference is held to the loop - * until we recursively iterate - */ -#ifdef G_THREADS_ENABLED - if (loop->context->thread != g_thread_self ()) - { - LOCK_LOOP (loop); - - loop->ref_count++; - - if (!g_thread_supported ()) - { - g_warning ("g_main_loop_run() was called from second thread but" - "g_thread_init() was never called."); - } - else - { - if (!loop->sem_cond) - loop->sem_cond = g_cond_new (); - - if (!loop->is_running) - loop->is_running = TRUE; - - while (loop->is_running) - g_cond_wait (loop->sem_cond, loop->mutex); - } - } - else -#endif /* G_THREADS_ENABLED */ - { - LOCK_CONTEXT (loop->context); - if (loop->context->in_check_or_prepare) - { - g_warning ("g_main_run(): called recursively from within a source's check() or " - "prepare() member, iteration not possible."); - return; - } - UNLOCK_CONTEXT (loop->context); - - LOCK_LOOP (loop); - - loop->ref_count++; - loop->is_running = TRUE; - while (loop->is_running) - { - UNLOCK_LOOP (loop); - g_main_context_iterate (loop->context, TRUE, TRUE); - LOCK_LOOP (loop); - } - } - - /* We inline this here rather than calling g_main_loop_unref() to - * avoid an extra unlock/lock. - */ - loop->ref_count--; - if (loop->ref_count == 0) - { - UNLOCK_LOOP (loop); - main_loop_destroy (loop); - } - else - UNLOCK_LOOP (loop); -} - -/** - * g_main_loop_quit: - * @loop: a #GMainLoop - * - * Stops a #GMainLoop from running. Any calls to g_main_loop_run() - * for the loop will return. - **/ -void -g_main_loop_quit (GMainLoop *loop) -{ - g_return_if_fail (loop != NULL); - - LOCK_LOOP (loop); - loop->is_running = FALSE; - -#ifdef G_THREADS_ENABLED - if (loop->sem_cond) - g_cond_broadcast (loop->sem_cond); -#endif - - UNLOCK_LOOP (loop); - - LOCK_CONTEXT (loop->context); - - g_main_context_wakeup (loop->context); - UNLOCK_CONTEXT (loop->context); -} - -/** - * g_main_loop_is_running: - * @loop: a #GMainLoop. - * - * Check to see if the main loop is currently being run via g_main_run() - * - * Return value: %TRUE if the mainloop is currently being run. - **/ -gboolean -g_main_loop_is_running (GMainLoop *loop) -{ - gboolean result; - - g_return_val_if_fail (loop != NULL, FALSE); - - LOCK_LOOP (loop); - result = loop->is_running; - UNLOCK_LOOP (loop); - - return result; -} - -/* HOLDS: context's lock */ -static void -g_main_context_poll (GMainContext *context, - gint timeout, - gint priority, - GPollFD *fds, - gint n_fds) -{ -#ifdef G_MAIN_POLL_DEBUG - GTimer *poll_timer; - GPollRec *pollrec; - gint i; -#endif - - GPollFunc poll_func; - - if (n_fds || timeout != 0) - { -#ifdef G_MAIN_POLL_DEBUG - g_print ("g_main_poll(%d) timeout: %d\n", n_fds, timeout); - poll_timer = g_timer_new (); -#endif - - LOCK_CONTEXT (context); - - poll_func = context->poll_func; - - UNLOCK_CONTEXT (context); - if ((*poll_func) (fds, n_fds, timeout) < 0 && errno != EINTR) - g_warning ("poll(2) failed due to: %s.", - g_strerror (errno)); - -#ifdef G_MAIN_POLL_DEBUG - LOCK_CONTEXT (context); - - g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds", - n_fds, - timeout, - g_timer_elapsed (poll_timer, NULL)); - g_timer_destroy (poll_timer); - pollrec = context->poll_records; - i = 0; - while (i < n_fds) - { - if (pollrec->fd->events) - { - if (fds[i].revents) - { - g_print (" [%d:", fds[i].fd); - if (fds[i].revents & G_IO_IN) - g_print ("i"); - if (fds[i].revents & G_IO_OUT) - g_print ("o"); - if (fds[i].revents & G_IO_PRI) - g_print ("p"); - if (fds[i].revents & G_IO_ERR) - g_print ("e"); - if (fds[i].revents & G_IO_HUP) - g_print ("h"); - if (fds[i].revents & G_IO_NVAL) - g_print ("n"); - g_print ("]"); - } - i++; - } - pollrec = pollrec->next; - } - g_print ("\n"); - - UNLOCK_CONTEXT (context); -#endif - } /* if (n_fds || timeout != 0) */ -} - -/** - * g_main_context_add_poll: - * @context: a #GMainContext (or %NULL for the default context) - * @fd: a #GPollFD structure holding information about a file - * descriptor to watch. - * @priority: the priority for this file descriptor which should be - * the same as the priority used for g_source_attach() to ensure that the - * file descriptor is polled whenever the results may be needed. - * - * Add a file descriptor to the set of file descriptors polled * for - * this context. This will very seldom be used directly. Instead - * a typical event source will use g_source_add_poll() instead. - **/ -void -g_main_context_add_poll (GMainContext *context, - GPollFD *fd, - gint priority) -{ - if (!context) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - g_main_context_add_poll_unlocked (context, priority, fd); - UNLOCK_CONTEXT (context); -} - -/* HOLDS: main_loop_lock */ -static void -g_main_context_add_poll_unlocked (GMainContext *context, - gint priority, - GPollFD *fd) -{ - GPollRec *lastrec, *pollrec, *newrec; - - if (!context->poll_chunk) - context->poll_chunk = g_mem_chunk_create (GPollRec, 32, G_ALLOC_ONLY); - - if (context->poll_free_list) - { - newrec = context->poll_free_list; - context->poll_free_list = newrec->next; - } - else - newrec = g_chunk_new (GPollRec, context->poll_chunk); - - /* This file descriptor may be checked before we ever poll */ - fd->revents = 0; - newrec->fd = fd; - newrec->priority = priority; - - lastrec = NULL; - pollrec = context->poll_records; - while (pollrec && priority >= pollrec->priority) - { - lastrec = pollrec; - pollrec = pollrec->next; - } - - if (lastrec) - lastrec->next = newrec; - else - context->poll_records = newrec; - - newrec->next = pollrec; - - context->n_poll_records++; - if (context->cached_poll_array && - context->cached_poll_array_size < context->n_poll_records) - { - g_free (context->cached_poll_array); - context->cached_poll_array = NULL; - } - -#ifdef G_THREADS_ENABLED - context->poll_changed = TRUE; - - /* Now wake up the main loop if it is waiting in the poll() */ - g_main_context_wakeup (context); -#endif -} - -/** - * g_main_context_remove_poll: - * @context:a #GMainContext - * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll() - * - * Remove file descriptor from the set of file descriptors to be - * polled for a particular context. - **/ -void -g_main_context_remove_poll (GMainContext *context, - GPollFD *fd) -{ - if (!context) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - g_main_context_remove_poll_unlocked (context, fd); - - UNLOCK_CONTEXT (context); -} - -static void -g_main_context_remove_poll_unlocked (GMainContext *context, - GPollFD *fd) -{ - GPollRec *pollrec, *lastrec; - - lastrec = NULL; - pollrec = context->poll_records; - - while (pollrec) - { - if (pollrec->fd == fd) - { - if (lastrec != NULL) - lastrec->next = pollrec->next; - else - context->poll_records = pollrec->next; - -#ifdef ENABLE_GC_FRIENDLY - pollrec->fd = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - pollrec->next = context->poll_free_list; - context->poll_free_list = pollrec; - - context->n_poll_records--; - break; - } - lastrec = pollrec; - pollrec = pollrec->next; - } - -#ifdef G_THREADS_ENABLED - context->poll_changed = TRUE; - - /* Now wake up the main loop if it is waiting in the poll() */ - g_main_context_wakeup (context); -#endif -} - -/** - * g_source_get_current_time: - * @source: a #GSource - * @timeval: #GTimeVal structure in which to store current time. - * - * Gets the "current time" to be used when checking - * this source. The advantage of calling this function over - * calling g_get_current_time() directly is that when - * checking multiple sources, GLib can cache a single value - * instead of having to repeatedly get the system time. - **/ -void -g_source_get_current_time (GSource *source, - GTimeVal *timeval) -{ - GMainContext *context; - - g_return_if_fail (source->context != NULL); - - context = source->context; - - LOCK_CONTEXT (context); - - if (!context->time_is_current) - { - g_get_current_time (&context->current_time); - context->time_is_current = TRUE; - } - - *timeval = context->current_time; - - UNLOCK_CONTEXT (context); -} - -/** - * g_main_context_set_poll_func: - * @context: a #GMainContext - * @func: the function to call to poll all file descriptors - * - * Sets the function to use to handle polling of file descriptors. It - * will be used instead of the poll() system call (or GLib's - * replacement function, which is used where poll() isn't available). - * - * This function could possibly be used to integrate the GLib event - * loop with an external event loop. - **/ -void -g_main_context_set_poll_func (GMainContext *context, - GPollFunc func) -{ - if (!context) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - - if (func) - context->poll_func = func; - else - { -#ifdef HAVE_POLL - context->poll_func = (GPollFunc) poll; -#else - context->poll_func = (GPollFunc) g_poll; -#endif - } - - UNLOCK_CONTEXT (context); -} - -/** - * g_main_context_get_poll_func: - * @context: a #GMainContext - * - * Gets the poll function set by g_main_context_set_poll_func() - * - * Return value: the poll function - **/ -GPollFunc -g_main_context_get_poll_func (GMainContext *context) -{ - GPollFunc result; - - if (!context) - context = g_main_context_default (); - - LOCK_CONTEXT (context); - result = context->poll_func; - UNLOCK_CONTEXT (context); - - return result; -} - -/* HOLDS: context's lock */ -/* Wake the main loop up from a poll() */ -static void -g_main_context_wakeup (GMainContext *context) -{ -#ifdef G_THREADS_ENABLED - if (g_thread_supported() && context->poll_waiting) - { - context->poll_waiting = FALSE; -#ifndef G_OS_WIN32 - write (context->wake_up_pipe[1], "A", 1); -#else - ReleaseSemaphore (context->wake_up_semaphore, 1, NULL); -#endif - } -#endif -} - -/* Timeouts */ - -static void -g_timeout_set_expiration (GTimeoutSource *timeout_source, - GTimeVal *current_time) -{ - guint seconds = timeout_source->interval / 1000; - guint msecs = timeout_source->interval - seconds * 1000; - - timeout_source->expiration.tv_sec = current_time->tv_sec + seconds; - timeout_source->expiration.tv_usec = current_time->tv_usec + msecs * 1000; - if (timeout_source->expiration.tv_usec >= 1000000) - { - timeout_source->expiration.tv_usec -= 1000000; - timeout_source->expiration.tv_sec++; - } -} - -static gboolean -g_timeout_prepare (GSource *source, - gint *timeout) -{ - glong sec; - glong msec; - GTimeVal current_time; - - GTimeoutSource *timeout_source = (GTimeoutSource *)source; - - g_source_get_current_time (source, ¤t_time); - - sec = timeout_source->expiration.tv_sec - current_time.tv_sec; - msec = (timeout_source->expiration.tv_usec - current_time.tv_usec) / 1000; - - /* We do the following in a rather convoluted fashion to deal with - * the fact that we don't have an integral type big enough to hold - * the difference of two timevals in millseconds. - */ - if (sec < 0 || (sec == 0 && msec < 0)) - msec = 0; - else - { - glong interval_sec = timeout_source->interval / 1000; - glong interval_msec = timeout_source->interval % 1000; - - if (msec < 0) - { - msec += 1000; - sec -= 1; - } - - if (sec > interval_sec || - (sec == interval_sec && msec > interval_msec)) - { - /* The system time has been set backwards, so we - * reset the expiration time to now + timeout_source->interval; - * this at least avoids hanging for long periods of time. - */ - g_timeout_set_expiration (timeout_source, ¤t_time); - msec = timeout_source->interval; - } - else - { - msec += sec * 1000; - } - } - - *timeout = (gint)msec; - - return msec == 0; -} - -static gboolean -g_timeout_check (GSource *source) -{ - GTimeVal current_time; - GTimeoutSource *timeout_source = (GTimeoutSource *)source; - - g_source_get_current_time (source, ¤t_time); - - return ((timeout_source->expiration.tv_sec < current_time.tv_sec) || - ((timeout_source->expiration.tv_sec == current_time.tv_sec) && - (timeout_source->expiration.tv_usec <= current_time.tv_usec))); -} - -static gboolean -g_timeout_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) -{ - GTimeoutSource *timeout_source = (GTimeoutSource *)source; - - if (!callback) - { - g_warning ("Timeout source dispatched without callback\n" - "You must call g_source_set_callback()."); - return FALSE; - } - - if (callback (user_data)) - { - GTimeVal current_time; - - g_source_get_current_time (source, ¤t_time); - g_timeout_set_expiration (timeout_source, ¤t_time); - - return TRUE; - } - else - return FALSE; -} - -/** - * g_timeout_source_new: - * @interval: the timeout interval in milliseconds. - * - * Create a new timeout source. - * - * The source will not initially be associated with any #GMainContext - * and must be added to one with g_source_attach() before it will be - * executed. - * - * Return value: the newly create timeout source - **/ -GSource * -g_timeout_source_new (guint interval) -{ - GSource *source = g_source_new (&timeout_funcs, sizeof (GTimeoutSource)); - GTimeoutSource *timeout_source = (GTimeoutSource *)source; - GTimeVal current_time; - - timeout_source->interval = interval; - - g_get_current_time (¤t_time); - g_timeout_set_expiration (timeout_source, ¤t_time); - - return source; -} - -/** - * g_timeout_add_full: - * @priority: the priority of the idle source. Typically this will be in the - * range btweeen #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. - * @interval: the time between calls to the function, in milliseconds - * (1/1000ths of a second.) - * @function: function to call - * @data: data to pass to @function - * @notify: function to call when the idle is removed, or %NULL - * - * Sets a function to be called at regular intervals, with the given - * priority. The function is called repeatedly until it returns - * FALSE, at which point the timeout is automatically destroyed and - * the function will not be called again. The @notify function is - * called when the timeout is destroyed. The first call to the - * function will be at the end of the first @interval. - * - * Note that timeout functions may be delayed, due to the processing of other - * event sources. Thus they should not be relied on for precise timing. - * After each call to the timeout function, the time of the next - * timeout is recalculated based on the current time and the given interval - * (it does not try to 'catch up' time lost in delays). - * - * Return value: the id of event source. - **/ -guint -g_timeout_add_full (gint priority, - guint interval, - GSourceFunc function, - gpointer data, - GDestroyNotify notify) -{ - GSource *source; - guint id; - - g_return_val_if_fail (function != NULL, 0); - - source = g_timeout_source_new (interval); - - if (priority != G_PRIORITY_DEFAULT) - g_source_set_priority (source, priority); - - g_source_set_callback (source, function, data, notify); - id = g_source_attach (source, NULL); - g_source_unref (source); - - return id; -} - -/** - * g_timeout_add: - * @interval: the time between calls to the function, in milliseconds - * (1/1000ths of a second.) - * @function: function to call - * @data: data to pass to @function - * - * Sets a function to be called at regular intervals, with the default - * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly - * until it returns FALSE, at which point the timeout is automatically - * destroyed and the function will not be called again. The @notify - * function is called when the timeout is destroyed. The first call - * to the function will be at the end of the first @interval. - * - * Note that timeout functions may be delayed, due to the processing of other - * event sources. Thus they should not be relied on for precise timing. - * After each call to the timeout function, the time of the next - * timeout is recalculated based on the current time and the given interval - * (it does not try to 'catch up' time lost in delays). - * - * Return value: the id of event source. - **/ -guint -g_timeout_add (guint32 interval, - GSourceFunc function, - gpointer data) -{ - return g_timeout_add_full (G_PRIORITY_DEFAULT, - interval, function, data, NULL); -} - -/* Idle functions */ - -static gboolean -g_idle_prepare (GSource *source, - gint *timeout) -{ - *timeout = 0; - - return TRUE; -} - -static gboolean -g_idle_check (GSource *source) -{ - return TRUE; -} - -static gboolean -g_idle_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) -{ - if (!callback) - { - g_warning ("Idle source dispatched without callback\n" - "You must call g_source_set_callback()."); - return FALSE; - } - - return callback (user_data); -} - -/** - * g_idle_source_new: - * - * Create a new idle source. - * - * The source will not initially be associated with any #GMainContext - * and must be added to one with g_source_attach() before it will be - * executed. - * - * Return value: the newly created idle source - **/ -GSource * -g_idle_source_new (void) -{ - return g_source_new (&idle_funcs, sizeof (GSource)); -} - -/** - * g_idle_add_full: - * @priority: the priority of the idle source. Typically this will be in the - * range btweeen #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. - * @function: function to call - * @data: data to pass to @function - * @notify: function to call when the idle is removed, or %NULL - * - * Adds a function to be called whenever there are no higher priority - * events pending. If the function returns FALSE it is automatically - * removed from the list of event sources and will not be called again. - * - * Return value: the id of the event source. - **/ -guint -g_idle_add_full (gint priority, - GSourceFunc function, - gpointer data, - GDestroyNotify notify) -{ - GSource *source; - guint id; - - g_return_val_if_fail (function != NULL, 0); - - source = g_idle_source_new (); - - if (priority != G_PRIORITY_DEFAULT) - g_source_set_priority (source, priority); - - g_source_set_callback (source, function, data, notify); - id = g_source_attach (source, NULL); - g_source_unref (source); - - return id; -} - -/** - * g_idle_add: - * @function: function to call - * @data: data to pass to @function. - * - * Adds a function to be called whenever there are no higher priority - * events pending to the default main loop. The function is given the - * default idle priority, #G_PRIORITY_DEFAULT_IDLE. If the function - * returns FALSE it is automatically removed from the list of event - * sources and will not be called again. - * - * Return value: the id of the event source. - **/ -guint -g_idle_add (GSourceFunc function, - gpointer data) -{ - return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL); -} - -/** - * g_idle_remove_by_data: - * @data: the data for the idle source's callback. - * - * Removes the idle function with the given data. - * - * Return value: %TRUE if an idle source was found and removed. - **/ -gboolean -g_idle_remove_by_data (gpointer data) -{ - return g_source_remove_by_funcs_user_data (&idle_funcs, data); -} - diff --git a/gmain.h b/gmain.h deleted file mode 100644 index 70a64de1..00000000 --- a/gmain.h +++ /dev/null @@ -1,291 +0,0 @@ -/* gmain.h - the GLib Main loop - * Copyright (C) 1998-2000 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __G_MAIN_H__ -#define __G_MAIN_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef struct _GMainContext GMainContext; /* Opaque */ -typedef struct _GMainLoop GMainLoop; /* Opaque */ -typedef struct _GSource GSource; -typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs; -typedef struct _GSourceFuncs GSourceFuncs; - -typedef gboolean (*GSourceFunc) (gpointer data); - -struct _GSource -{ - /*< private >*/ - gpointer callback_data; - GSourceCallbackFuncs *callback_funcs; - - GSourceFuncs *source_funcs; - guint ref_count; - - GMainContext *context; - - gint priority; - guint flags; - guint id; - - GSList *poll_fds; - - GSource *prev; - GSource *next; -}; - -struct _GSourceCallbackFuncs -{ - void (*ref) (gpointer cb_data); - void (*unref) (gpointer cb_data); - void (*get) (gpointer cb_data, - GSourceFunc *func, - gpointer *data); -}; - -struct _GSourceFuncs -{ - gboolean (*prepare) (GSource *source, - gint *timeout); - gboolean (*check) (GSource *source); - gboolean (*dispatch) (GSource *source, - GSourceFunc callback, - gpointer user_data); - void (*destroy) (GSource *source); /* Can be NULL */ -}; - -/* Any definitions using GPollFD or GPollFunc are primarily - * for Unix and not guaranteed to be the compatible on all - * operating systems on which GLib runs. Right now, the - * GLib does use these functions on Win32 as well, but interprets - * them in a fairly different way than on Unix. If you use - * these definitions, you are should be prepared to recode - * for different operating systems. - * - * - * On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file - * descriptor as provided by the C runtime) that can be used by - * MsgWaitForMultipleObjects. This does *not* include file handles - * from CreateFile, SOCKETs, nor pipe handles. (But you can use - * WSAEventSelect to signal events when a SOCKET is readable). - * - * On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to - * indicate polling for messages. These message queue GPollFDs should - * be added with the g_main_poll_win32_msg_add function. - * - * But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK - * (GTK) programs, as GDK itself wants to read messages and convert them - * to GDK events. - * - * So, unless you really know what you are doing, it's best not to try - * to use the main loop polling stuff for your own needs on - * Win32. It's really only written for the GIMP's needs so - * far. - */ -typedef struct _GPollFD GPollFD; -typedef gint (*GPollFunc) (GPollFD *ufds, - guint nfsd, - gint timeout); - -struct _GPollFD -{ - gint fd; - gushort events; - gushort revents; -}; - -/* Standard priorities */ - -#define G_PRIORITY_HIGH -100 -#define G_PRIORITY_DEFAULT 0 -#define G_PRIORITY_HIGH_IDLE 100 -#define G_PRIORITY_DEFAULT_IDLE 200 -#define G_PRIORITY_LOW 300 - -/* GMainContext: */ - -GMainContext *g_main_context_get (GThread *thread); -GMainContext *g_main_context_default (void); - -gboolean g_main_context_iteration (GMainContext *context, - gboolean may_block); -gboolean g_main_context_pending (GMainContext *context); - -/* For implementation of legacy interfaces - */ -GSource *g_main_context_find_source_by_id (GMainContext *context, - guint id); -GSource *g_main_context_find_source_by_user_data (GMainContext *context, - gpointer user_data); -GSource *g_main_context_find_source_by_funcs_user_data (GMainContext *context, - GSourceFuncs *funcs, - gpointer user_data); - -/* Low level functions for implementing custom main loops. - */ -gboolean g_main_context_prepare (GMainContext *context, - gint *priority); -gint g_main_context_query (GMainContext *context, - gint max_priority, - gint *timeout, - GPollFD *fds, - gint n_fds); -gint g_main_context_check (GMainContext *context, - gint max_priority, - GPollFD *fds, - gint n_fds); -void g_main_context_dispatch (GMainContext *context); - -void g_main_context_set_poll_func (GMainContext *context, - GPollFunc func); -GPollFunc g_main_context_get_poll_func (GMainContext *context); - -/* Low level functions for use by source implementations - */ -void g_main_context_add_poll (GMainContext *context, - GPollFD *fd, - gint priority); -void g_main_context_remove_poll (GMainContext *context, - GPollFD *fd); - -/* GMainLoop: */ - -GMainLoop *g_main_loop_new (GMainContext *context, - gboolean is_running); -void g_main_loop_run (GMainLoop *loop); -void g_main_loop_quit (GMainLoop *loop); -GMainLoop *g_main_loop_ref (GMainLoop *loop); -void g_main_loop_unref (GMainLoop *loop); -gboolean g_main_loop_is_running (GMainLoop *loop); - -/* GSource: */ - -GSource *g_source_new (GSourceFuncs *source_funcs, - guint struct_size); -GSource *g_source_ref (GSource *source); -void g_source_unref (GSource *source); - -guint g_source_attach (GSource *source, - GMainContext *context); -void g_source_destroy (GSource *source); - -void g_source_set_priority (GSource *source, - gint priority); -gint g_source_get_priority (GSource *source); -void g_source_set_can_recurse (GSource *source, - gboolean can_recurse); -gboolean g_source_get_can_recurse (GSource *source); -guint g_source_get_id (GSource *source); - -GMainContext *g_source_get_context (GSource *source); - -void g_source_set_callback (GSource *source, - GSourceFunc func, - gpointer data, - GDestroyNotify notify); - - -/* Used to implement g_source_connect_closure and internally*/ -void g_source_set_callback_indirect (GSource *source, - gpointer callback_data, - GSourceCallbackFuncs *callback_funcs); - -void g_source_add_poll (GSource *source, - GPollFD *fd); -void g_source_remove_poll (GSource *source, - GPollFD *fd); - -void g_source_get_current_time (GSource *source, - GTimeVal *timeval); - - /* void g_source_connect_closure (GSource *source, - GClosure *closure); - */ - -/* Specific source types - */ -GSource *g_idle_source_new (void); -GSource *g_timeout_source_new (guint interval); - -/* Miscellaneous functions - */ -void g_get_current_time (GTimeVal *result); - -/* ============== Compat main loop stuff ================== */ - -#ifndef G_DISABLE_DEPRECATED - -/* Legacy names for GMainLoop functions - */ -#define g_main_new(is_running) g_main_loop_new (NULL, is_running); -#define g_main_run(loop) g_main_loop_run(loop) -#define g_main_quit(loop) g_main_loop_quit(loop) -#define g_main_destroy(loop) g_main_loop_unref(loop) -#define g_main_is_running(loop) g_main_loop_is_running(loop) - -/* Functions to manipulate the default main loop - */ - -#define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block) -#define g_main_pending() g_main_context_pending (NULL) - -#define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func) - -#endif /* G_DISABLE_DEPRECATED */ - -/* Source manipulation by ID */ -gboolean g_source_remove (guint tag); -gboolean g_source_remove_by_user_data (gpointer user_data); -gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, - gpointer user_data); - -/* Idles and timeouts */ -guint g_timeout_add_full (gint priority, - guint interval, - GSourceFunc function, - gpointer data, - GDestroyNotify notify); -guint g_timeout_add (guint interval, - GSourceFunc function, - gpointer data); -guint g_idle_add (GSourceFunc function, - gpointer data); -guint g_idle_add_full (gint priority, - GSourceFunc function, - gpointer data, - GDestroyNotify notify); -gboolean g_idle_remove_by_data (gpointer data); - -#ifdef G_OS_WIN32 - -/* This is used to add polling for Windows messages. GDK (GTK+) programs - * should *not* use this. - */ -void g_main_poll_win32_msg_add (gint priority, - GPollFD *fd, - guint hwnd); -#endif /* G_OS_WIN32 */ - -G_END_DECLS - -#endif /* __G_MAIN_H__ */ diff --git a/gmarkup.c b/gmarkup.c deleted file mode 100644 index 3ae2a767..00000000 --- a/gmarkup.c +++ /dev/null @@ -1,1735 +0,0 @@ -/* gmarkup.c - Simple XML-like parser - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; 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 "glib.h" - -#include -#include -#include -#include - -#include "glibintl.h" - -GQuark -g_markup_error_quark () -{ - static GQuark error_quark = 0; - - if (error_quark == 0) - error_quark = g_quark_from_static_string ("g-markup-error-quark"); - - return error_quark; -} - -typedef enum -{ - STATE_START, - STATE_AFTER_OPEN_ANGLE, - STATE_AFTER_CLOSE_ANGLE, - STATE_AFTER_ELISION_SLASH, /* the slash that obviates need for end element */ - STATE_INSIDE_OPEN_TAG_NAME, - STATE_INSIDE_ATTRIBUTE_NAME, - STATE_BETWEEN_ATTRIBUTES, - STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, - STATE_INSIDE_ATTRIBUTE_VALUE, - STATE_INSIDE_TEXT, - STATE_AFTER_CLOSE_TAG_SLASH, - STATE_INSIDE_CLOSE_TAG_NAME, - STATE_INSIDE_PASSTHROUGH, - STATE_ERROR -} GMarkupParseState; - -struct _GMarkupParseContext -{ - const GMarkupParser *parser; - - GMarkupParseFlags flags; - - gint line_number; - gint char_number; - - gpointer user_data; - GDestroyNotify dnotify; - - /* A piece of character data or an element that - * hasn't "ended" yet so we haven't yet called - * the callback for it. - */ - GString *partial_chunk; - - GMarkupParseState state; - GSList *tag_stack; - gchar **attr_names; - gchar **attr_values; - gint cur_attr; - gint alloc_attrs; - - const gchar *current_text; - gssize current_text_len; - const gchar *current_text_end; - - GString *leftover_char_portion; - - /* used to save the start of the last interesting thingy */ - const gchar *start; - - const gchar *iter; - - guint document_empty : 1; - guint parsing : 1; -}; - -/** - * g_markup_parse_context_new: - * @parser: a #GMarkupParser - * @flags: one or more #GMarkupParseFlags - * @user_data: user data to pass to #GMarkupParser functions - * @user_data_dnotify: user data destroy notifier called when the parse context is freed - * - * Creates a new parse context. A parse context is used to parse - * marked-up documents. You can feed any number of documents into - * a context, as long as no errors occur; once an error occurs, - * the parse context can't continue to parse text (you have to free it - * and create a new parse context). - * - * Return value: a new #GMarkupParseContext - **/ -GMarkupParseContext * -g_markup_parse_context_new (const GMarkupParser *parser, - GMarkupParseFlags flags, - gpointer user_data, - GDestroyNotify user_data_dnotify) -{ - GMarkupParseContext *context; - - g_return_val_if_fail (parser != NULL, NULL); - - context = g_new (GMarkupParseContext, 1); - - context->parser = parser; - context->flags = flags; - context->user_data = user_data; - context->dnotify = user_data_dnotify; - - context->line_number = 1; - context->char_number = 1; - - context->partial_chunk = NULL; - - context->state = STATE_START; - context->tag_stack = NULL; - context->attr_names = NULL; - context->attr_values = NULL; - context->cur_attr = -1; - context->alloc_attrs = 0; - - context->current_text = NULL; - context->current_text_len = -1; - context->current_text_end = NULL; - context->leftover_char_portion = NULL; - - context->start = NULL; - context->iter = NULL; - - context->document_empty = TRUE; - context->parsing = FALSE; - - return context; -} - -/** - * g_markup_parse_context_free: - * @context: a #GMarkupParseContext - * - * Frees a #GMarkupParseContext. Can't be called from inside - * one of the #GMarkupParser functions. - * - **/ -void -g_markup_parse_context_free (GMarkupParseContext *context) -{ - g_return_if_fail (context != NULL); - g_return_if_fail (!context->parsing); - - if (context->dnotify) - (* context->dnotify) (context->user_data); - - g_strfreev (context->attr_names); - g_strfreev (context->attr_values); - - g_slist_foreach (context->tag_stack, (GFunc)g_free, NULL); - g_slist_free (context->tag_stack); - - if (context->partial_chunk) - g_string_free (context->partial_chunk, TRUE); - - if (context->leftover_char_portion) - g_string_free (context->leftover_char_portion, TRUE); - - g_free (context); -} - -static void -mark_error (GMarkupParseContext *context, - GError *error) -{ - context->state = STATE_ERROR; - - if (context->parser->error) - (*context->parser->error) (context, error, context->user_data); -} - -static void -set_error (GMarkupParseContext *context, - GError **error, - GMarkupError code, - const gchar *format, - ...) -{ - GError *tmp_error; - gchar *s; - va_list args; - - va_start (args, format); - s = g_strdup_vprintf (format, args); - va_end (args); - - tmp_error = g_error_new (G_MARKUP_ERROR, - code, - _("Error on line %d char %d: %s"), - context->line_number, - context->char_number, - s); - - g_free (s); - - mark_error (context, tmp_error); - - g_propagate_error (error, tmp_error); -} - -static gboolean -is_name_start_char (gunichar c) -{ - if (g_unichar_isalpha (c) || - c == '_' || - c == ':') - return TRUE; - else - return FALSE; -} - -static gboolean -is_name_char (gunichar c) -{ - if (g_unichar_isalnum (c) || - c == '.' || - c == '-' || - c == '_' || - c == ':') - return TRUE; - else - return FALSE; -} - - -static gchar* -char_str (gunichar c, - gchar *buf) -{ - memset (buf, 0, 7); - g_unichar_to_utf8 (c, buf); - return buf; -} - -static gchar* -utf8_str (const gchar *utf8, - gchar *buf) -{ - char_str (g_utf8_get_char (utf8), buf); - return buf; -} - -static void -set_unescape_error (GMarkupParseContext *context, - GError **error, - const gchar *remaining_text, - const gchar *remaining_text_end, - GMarkupError code, - const gchar *format, - ...) -{ - GError *tmp_error; - gchar *s; - va_list args; - gint remaining_newlines; - const gchar *p; - - remaining_newlines = 0; - p = remaining_text; - while (p != remaining_text_end) - { - if (*p == '\n') - ++remaining_newlines; - ++p; - } - - va_start (args, format); - s = g_strdup_vprintf (format, args); - va_end (args); - - tmp_error = g_error_new (G_MARKUP_ERROR, - code, - _("Error on line %d: %s"), - context->line_number - remaining_newlines, - s); - - g_free (s); - - mark_error (context, tmp_error); - - g_propagate_error (error, tmp_error); -} - -typedef enum -{ - USTATE_INSIDE_TEXT, - USTATE_AFTER_AMPERSAND, - USTATE_INSIDE_ENTITY_NAME, - USTATE_AFTER_CHARREF_HASH -} UnescapeState; - -static gboolean -unescape_text (GMarkupParseContext *context, - const gchar *text, - const gchar *text_end, - gchar **unescaped, - GError **error) -{ -#define MAX_ENT_LEN 5 - GString *str; - const gchar *p; - UnescapeState state; - const gchar *start; - - str = g_string_new (""); - - state = USTATE_INSIDE_TEXT; - p = text; - start = p; - while (p != text_end && context->state != STATE_ERROR) - { - g_assert (p < text_end); - - switch (state) - { - case USTATE_INSIDE_TEXT: - { - while (p != text_end && *p != '&') - p = g_utf8_next_char (p); - - if (p != start) - { - g_string_append_len (str, start, p - start); - - start = NULL; - } - - if (p != text_end && *p == '&') - { - p = g_utf8_next_char (p); - state = USTATE_AFTER_AMPERSAND; - } - } - break; - - case USTATE_AFTER_AMPERSAND: - { - if (*p == '#') - { - p = g_utf8_next_char (p); - - start = p; - state = USTATE_AFTER_CHARREF_HASH; - } - else if (!is_name_start_char (g_utf8_get_char (p))) - { - if (*p == ';') - { - set_unescape_error (context, error, - p, text_end, - G_MARKUP_ERROR_PARSE, - _("Empty entity '&;' seen; valid " - "entities are: & " < > '")); - } - else - { - gchar buf[7]; - - set_unescape_error (context, error, - p, text_end, - G_MARKUP_ERROR_PARSE, - _("Character '%s' is not valid at " - "the start of an entity name; " - "the & character begins an entity; " - "if this ampersand isn't supposed " - "to be an entity, escape it as " - "&"), - utf8_str (p, buf)); - } - } - else - { - start = p; - state = USTATE_INSIDE_ENTITY_NAME; - } - } - break; - - - case USTATE_INSIDE_ENTITY_NAME: - { - gchar buf[MAX_ENT_LEN+1] = { - '\0', '\0', '\0', '\0', '\0', '\0' - }; - gchar *dest; - - while (p != text_end) - { - if (*p == ';') - break; - else if (!is_name_char (*p)) - { - gchar ubuf[7]; - - set_unescape_error (context, error, - p, text_end, - G_MARKUP_ERROR_PARSE, - _("Character '%s' is not valid " - "inside an entity name"), - utf8_str (p, ubuf)); - break; - } - - p = g_utf8_next_char (p); - } - - if (context->state != STATE_ERROR) - { - if (p != text_end) - { - const gchar *src; - - src = start; - dest = buf; - while (src != p) - { - *dest = *src; - ++dest; - ++src; - } - - /* move to after semicolon */ - p = g_utf8_next_char (p); - start = p; - state = USTATE_INSIDE_TEXT; - - if (strcmp (buf, "lt") == 0) - g_string_append_c (str, '<'); - else if (strcmp (buf, "gt") == 0) - g_string_append_c (str, '>'); - else if (strcmp (buf, "amp") == 0) - g_string_append_c (str, '&'); - else if (strcmp (buf, "quot") == 0) - g_string_append_c (str, '"'); - else if (strcmp (buf, "apos") == 0) - g_string_append_c (str, '\''); - else - { - set_unescape_error (context, error, - p, text_end, - G_MARKUP_ERROR_PARSE, - _("Entity name '%s' is not known"), - buf); - } - } - else - { - set_unescape_error (context, error, - /* give line number of the & */ - start, text_end, - G_MARKUP_ERROR_PARSE, - _("Entity did not end with a semicolon; " - "most likely you used an ampersand " - "character without intending to start " - "an entity - escape ampersand as &")); - } - } - } - break; - - case USTATE_AFTER_CHARREF_HASH: - { - gboolean is_hex = FALSE; - if (*p == 'x') - { - is_hex = TRUE; - p = g_utf8_next_char (p); - start = p; - } - - while (p != text_end && *p != ';') - p = g_utf8_next_char (p); - - if (p != text_end) - { - g_assert (*p == ';'); - - /* digit is between start and p */ - - if (start != p) - { - gchar *digit = g_strndup (start, p - start); - gulong l; - gchar *end = NULL; - gchar *digit_end = digit + (p - start); - - errno = 0; - if (is_hex) - l = strtoul (digit, &end, 16); - else - l = strtoul (digit, &end, 10); - - if (end != digit_end || errno != 0) - { - set_unescape_error (context, error, - start, text_end, - G_MARKUP_ERROR_PARSE, - _("Failed to parse '%s', which " - "should have been a digit " - "inside a character reference " - "(ê for example) - perhaps " - "the digit is too large"), - digit); - } - else - { - /* characters XML permits */ - if (l == 0x9 || - l == 0xA || - l == 0xD || - (l >= 0x20 && l <= 0xD7FF) || - (l >= 0xE000 && l <= 0xFFFD) || - (l >= 0x10000 && l <= 0x10FFFF)) - { - gchar buf[7]; - g_string_append (str, char_str (l, buf)); - } - else - { - set_unescape_error (context, error, - start, text_end, - G_MARKUP_ERROR_PARSE, - _("Character reference '%s' does not encode a permitted character"), - digit); - } - } - - g_free (digit); - - /* Move to next state */ - p = g_utf8_next_char (p); /* past semicolon */ - start = p; - state = USTATE_INSIDE_TEXT; - } - else - { - set_unescape_error (context, error, - start, text_end, - G_MARKUP_ERROR_PARSE, - _("Empty character reference; " - "should include a digit such as " - "dž")); - } - } - else - { - set_unescape_error (context, error, - start, text_end, - G_MARKUP_ERROR_PARSE, - _("Character reference did not end with a " - "semicolon; " - "most likely you used an ampersand " - "character without intending to start " - "an entity - escape ampersand as &")); - } - } - break; - - default: - g_assert_not_reached (); - break; - } - } - - /* If no errors, we should have returned to USTATE_INSIDE_TEXT */ - g_assert (context->state == STATE_ERROR || - state == USTATE_INSIDE_TEXT); - - if (context->state == STATE_ERROR) - { - g_string_free (str, TRUE); - *unescaped = NULL; - return FALSE; - } - else - { - *unescaped = g_string_free (str, FALSE); - return TRUE; - } - -#undef MAX_ENT_LEN -} - -static gboolean -advance_char (GMarkupParseContext *context) -{ - - context->iter = g_utf8_next_char (context->iter); - context->char_number += 1; - if (*context->iter == '\n') - { - context->line_number += 1; - context->char_number = 1; - } - - return context->iter != context->current_text_end; -} - -static void -skip_spaces (GMarkupParseContext *context) -{ - do - { - if (!g_unichar_isspace (g_utf8_get_char (context->iter))) - return; - } - while (advance_char (context)); -} - -static void -advance_to_name_end (GMarkupParseContext *context) -{ - do - { - if (!is_name_char (g_utf8_get_char (context->iter))) - return; - } - while (advance_char (context)); -} - -static void -add_to_partial (GMarkupParseContext *context, - const gchar *text_start, - const gchar *text_end) -{ - if (context->partial_chunk == NULL) - context->partial_chunk = g_string_new (""); - - if (text_start != text_end) - g_string_append_len (context->partial_chunk, text_start, - text_end - text_start); - - /* Invariant here that partial_chunk exists */ -} - -static void -truncate_partial (GMarkupParseContext *context) -{ - if (context->partial_chunk != NULL) - { - context->partial_chunk = g_string_truncate (context->partial_chunk, 0); - } -} - -static const gchar* -current_element (GMarkupParseContext *context) -{ - return context->tag_stack->data; -} - -static const gchar* -current_attribute (GMarkupParseContext *context) -{ - g_assert (context->cur_attr >= 0); - return context->attr_names[context->cur_attr]; -} - -static void -find_current_text_end (GMarkupParseContext *context) -{ - /* This function must be safe (non-segfaulting) on invalid UTF8 */ - const gchar *end = context->current_text + context->current_text_len; - const gchar *p; - const gchar *next; - - g_assert (context->current_text_len > 0); - - p = context->current_text; - next = g_utf8_find_next_char (p, end); - - while (next) - { - p = next; - next = g_utf8_find_next_char (p, end); - } - - /* p is now the start of the last character or character portion. */ - g_assert (p != end); - next = g_utf8_next_char (p); /* this only touches *p, nothing beyond */ - - if (next == end) - { - /* whole character */ - context->current_text_end = end; - } - else - { - /* portion */ - context->leftover_char_portion = g_string_new_len (p, end - p); - context->current_text_len -= (end - p); - context->current_text_end = p; - } -} - -static void -add_attribute (GMarkupParseContext *context, char *name) -{ - if (context->cur_attr + 2 >= context->alloc_attrs) - { - context->alloc_attrs += 5; /* silly magic number */ - context->attr_names = g_realloc (context->attr_names, sizeof(char*)*context->alloc_attrs); - context->attr_values = g_realloc (context->attr_values, sizeof(char*)*context->alloc_attrs); - } - context->cur_attr++; - context->attr_names[context->cur_attr] = name; - context->attr_values[context->cur_attr] = NULL; - context->attr_names[context->cur_attr+1] = NULL; -} - -/** - * g_markup_parse_context_parse: - * @context: a #GMarkupParseContext - * @text: chunk of text to parse - * @text_len: length of @text in bytes - * @error: return location for a #GError - * - * Feed some data to the #GMarkupParseContext. The data need not - * be valid UTF-8; an error will be signaled if it's invalid. - * The data need not be an entire document; you can feed a document - * into the parser incrementally, via multiple calls to this function. - * Typically, as you receive data from a network connection or file, - * you feed each received chunk of data into this function, aborting - * the process if an error occurs. Once an error is reported, no further - * data may be fed to the #GMarkupParseContext; all errors are fatal. - * - * Return value: %FALSE if an error occurred, %TRUE on success - **/ -gboolean -g_markup_parse_context_parse (GMarkupParseContext *context, - const gchar *text, - gssize text_len, - GError **error) -{ - const gchar *first_invalid; - - g_return_val_if_fail (context != NULL, FALSE); - g_return_val_if_fail (text != NULL, FALSE); - g_return_val_if_fail (context->state != STATE_ERROR, FALSE); - g_return_val_if_fail (!context->parsing, FALSE); - - if (text_len < 0) - text_len = strlen (text); - - if (text_len == 0) - return TRUE; - - context->parsing = TRUE; - - if (context->leftover_char_portion) - { - const gchar *first_char; - - if ((*text & 0xc0) != 0x80) - first_char = text; - else - first_char = g_utf8_find_next_char (text, text + text_len); - - if (first_char) - { - /* leftover_char_portion was completed. Parse it. */ - GString *portion = context->leftover_char_portion; - - g_string_append_len (context->leftover_char_portion, - text, first_char - text); - - /* hacks to allow recursion */ - context->parsing = FALSE; - context->leftover_char_portion = NULL; - - if (!g_markup_parse_context_parse (context, - portion->str, portion->len, - error)) - { - g_assert (context->state == STATE_ERROR); - } - - g_string_free (portion, TRUE); - context->parsing = TRUE; - - /* Skip the fraction of char that was in this text */ - text_len -= (first_char - text); - text = first_char; - } - else - { - /* another little chunk of the leftover char; geez - * someone is inefficient. - */ - g_string_append_len (context->leftover_char_portion, - text, text_len); - - if (context->leftover_char_portion->len > 7) - { - /* The leftover char portion is too big to be - * a UTF-8 character - */ - set_error (context, - error, - G_MARKUP_ERROR_BAD_UTF8, - _("Invalid UTF-8 encoded text")); - } - - goto finished; - } - } - - context->current_text = text; - context->current_text_len = text_len; - context->iter = context->current_text; - context->start = context->iter; - - /* Nothing left after finishing the leftover char, or nothing - * passed in to begin with. - */ - if (context->current_text_len == 0) - goto finished; - - /* find_current_text_end () assumes the string starts at - * a character start, so we need to validate at least - * that much. It doesn't assume any following bytes - * are valid. - */ - if ((*context->current_text & 0xc0) == 0x80) /* not a char start */ - { - set_error (context, - error, - G_MARKUP_ERROR_BAD_UTF8, - _("Invalid UTF-8 encoded text")); - goto finished; - } - - /* Initialize context->current_text_end, possibly adjusting - * current_text_len, and add any leftover char portion - */ - find_current_text_end (context); - - /* Validate UTF8 (must be done after we find the end, since - * we could have a trailing incomplete char) - */ - if (!g_utf8_validate (context->current_text, - context->current_text_len, - &first_invalid)) - { - gint newlines = 0; - const gchar *p; - p = context->current_text; - while (p != context->current_text_end) - { - if (*p == '\n') - ++newlines; - ++p; - } - - context->line_number += newlines; - - set_error (context, - error, - G_MARKUP_ERROR_BAD_UTF8, - _("Invalid UTF-8 encoded text")); - goto finished; - } - - while (context->iter != context->current_text_end) - { - switch (context->state) - { - case STATE_START: - /* Possible next state: AFTER_OPEN_ANGLE */ - - g_assert (context->tag_stack == NULL); - - /* whitespace is ignored outside of any elements */ - skip_spaces (context); - - if (context->iter != context->current_text_end) - { - if (*context->iter == '<') - { - /* Move after the open angle */ - advance_char (context); - - context->state = STATE_AFTER_OPEN_ANGLE; - - /* this could start a passthrough */ - context->start = context->iter; - - /* document is now non-empty */ - context->document_empty = FALSE; - } - else - { - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Document must begin with an element (e.g. )")); - } - } - break; - - case STATE_AFTER_OPEN_ANGLE: - /* Possible next states: INSIDE_OPEN_TAG_NAME, - * AFTER_CLOSE_TAG_SLASH, INSIDE_PASSTHROUGH - */ - if (*context->iter == '?' || - *context->iter == '!') - { - /* include < in the passthrough */ - const gchar *openangle = "<"; - add_to_partial (context, openangle, openangle + 1); - context->start = context->iter; - context->state = STATE_INSIDE_PASSTHROUGH; - } - else if (*context->iter == '/') - { - /* move after it */ - advance_char (context); - - context->state = STATE_AFTER_CLOSE_TAG_SLASH; - } - else if (is_name_start_char (g_utf8_get_char (context->iter))) - { - context->state = STATE_INSIDE_OPEN_TAG_NAME; - - /* start of tag name */ - context->start = context->iter; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("'%s' is not a valid character following " - "a '<' character; it may not begin an " - "element name"), - utf8_str (context->iter, buf)); - } - break; - - /* The AFTER_CLOSE_ANGLE state is actually sort of - * broken, because it doesn't correspond to a range - * of characters in the input stream as the others do, - * and thus makes things harder to conceptualize - */ - case STATE_AFTER_CLOSE_ANGLE: - /* Possible next states: INSIDE_TEXT, STATE_START */ - if (context->tag_stack == NULL) - { - context->start = NULL; - context->state = STATE_START; - } - else - { - context->start = context->iter; - context->state = STATE_INSIDE_TEXT; - } - break; - - case STATE_AFTER_ELISION_SLASH: - /* Possible next state: AFTER_CLOSE_ANGLE */ - - { - /* We need to pop the tag stack and call the end_element - * function, since this is the close tag - */ - GError *tmp_error = NULL; - - g_assert (context->tag_stack != NULL); - - tmp_error = NULL; - if (context->parser->end_element) - (* context->parser->end_element) (context, - context->tag_stack->data, - context->user_data, - &tmp_error); - - if (tmp_error) - { - mark_error (context, tmp_error); - g_propagate_error (error, tmp_error); - } - else - { - if (*context->iter == '>') - { - /* move after the close angle */ - advance_char (context); - context->state = STATE_AFTER_CLOSE_ANGLE; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Odd character '%s', expected a '>' character " - "to end the start tag of element '%s'"), - utf8_str (context->iter, buf), - current_element (context)); - } - } - - g_free (context->tag_stack->data); - context->tag_stack = g_slist_delete_link (context->tag_stack, - context->tag_stack); - } - break; - - case STATE_INSIDE_OPEN_TAG_NAME: - /* Possible next states: BETWEEN_ATTRIBUTES */ - - /* if there's a partial chunk then it's the first part of the - * tag name. If there's a context->start then it's the start - * of the tag name in current_text, the partial chunk goes - * before that start though. - */ - advance_to_name_end (context); - - if (context->iter == context->current_text_end) - { - /* The name hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - add_to_partial (context, context->start, context->iter); - } - else - { - /* The name has ended. Combine it with the partial chunk - * if any; push it on the stack; enter next state. - */ - add_to_partial (context, context->start, context->iter); - context->tag_stack = - g_slist_prepend (context->tag_stack, - g_string_free (context->partial_chunk, - FALSE)); - - context->partial_chunk = NULL; - - context->state = STATE_BETWEEN_ATTRIBUTES; - context->start = NULL; - } - break; - - case STATE_INSIDE_ATTRIBUTE_NAME: - /* Possible next states: AFTER_ATTRIBUTE_EQUALS_SIGN */ - - /* read the full name, if we enter the equals sign state - * then add the attribute to the list (without the value), - * otherwise store a partial chunk to be prepended later. - */ - advance_to_name_end (context); - - if (context->iter == context->current_text_end) - { - /* The name hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - add_to_partial (context, context->start, context->iter); - } - else - { - /* The name has ended. Combine it with the partial chunk - * if any; push it on the stack; enter next state. - */ - add_to_partial (context, context->start, context->iter); - - add_attribute (context, g_string_free (context->partial_chunk, FALSE)); - - context->partial_chunk = NULL; - context->start = NULL; - - if (*context->iter == '=') - { - advance_char (context); - context->state = STATE_AFTER_ATTRIBUTE_EQUALS_SIGN; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Odd character '%s', expected a '=' after " - "attribute name '%s' of element '%s'"), - utf8_str (context->iter, buf), - current_attribute (context), - current_element (context)); - - } - } - break; - - case STATE_BETWEEN_ATTRIBUTES: - /* Possible next states: AFTER_CLOSE_ANGLE, - * AFTER_ELISION_SLASH, INSIDE_ATTRIBUTE_NAME - */ - skip_spaces (context); - - if (context->iter != context->current_text_end) - { - if (*context->iter == '/') - { - advance_char (context); - context->state = STATE_AFTER_ELISION_SLASH; - } - else if (*context->iter == '>') - { - - advance_char (context); - context->state = STATE_AFTER_CLOSE_ANGLE; - } - else if (is_name_start_char (g_utf8_get_char (context->iter))) - { - context->state = STATE_INSIDE_ATTRIBUTE_NAME; - /* start of attribute name */ - context->start = context->iter; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Odd character '%s', expected a '>' or '/' " - "character to end the start tag of " - "element '%s', or optionally an attribute; " - "perhaps you used an invalid character in " - "an attribute name"), - utf8_str (context->iter, buf), - current_element (context)); - } - - /* If we're done with attributes, invoke - * the start_element callback - */ - if (context->state == STATE_AFTER_ELISION_SLASH || - context->state == STATE_AFTER_CLOSE_ANGLE) - { - const gchar *start_name; - /* Ugly, but the current code expects an empty array instead of NULL */ - const gchar *empty = NULL; - const gchar **attr_names = ∅ - const gchar **attr_values = ∅ - GError *tmp_error; - - /* Call user callback for element start */ - start_name = current_element (context); - - if (context->cur_attr >= 0) - { - attr_names = (const gchar**)context->attr_names; - attr_values = (const gchar**)context->attr_values; - } - - tmp_error = NULL; - if (context->parser->start_element) - (* context->parser->start_element) (context, - start_name, - (const gchar **)attr_names, - (const gchar **)attr_values, - context->user_data, - &tmp_error); - - /* Go ahead and free the attributes. */ - for (; context->cur_attr >= 0; context->cur_attr--) - { - int pos = context->cur_attr; - g_free (context->attr_names[pos]); - g_free (context->attr_values[pos]); - context->attr_names[pos] = context->attr_values[pos] = NULL; - } - context->cur_attr = -1; - - if (tmp_error != NULL) - { - mark_error (context, tmp_error); - g_propagate_error (error, tmp_error); - } - } - } - break; - - case STATE_AFTER_ATTRIBUTE_EQUALS_SIGN: - /* Possible next state: INSIDE_ATTRIBUTE_VALUE */ - if (*context->iter == '"') - { - advance_char (context); - context->state = STATE_INSIDE_ATTRIBUTE_VALUE; - context->start = context->iter; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Odd character '%s', expected an open quote mark " - "after the equals sign when giving value for " - "attribute '%s' of element '%s'"), - utf8_str (context->iter, buf), - current_attribute (context), - current_element (context)); - } - break; - - case STATE_INSIDE_ATTRIBUTE_VALUE: - /* Possible next states: BETWEEN_ATTRIBUTES */ - do - { - if (*context->iter == '"') - break; - } - while (advance_char (context)); - - if (context->iter == context->current_text_end) - { - /* The value hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - add_to_partial (context, context->start, context->iter); - } - else - { - /* The value has ended at the quote mark. Combine it - * with the partial chunk if any; set it for the current - * attribute. - */ - add_to_partial (context, context->start, context->iter); - - g_assert (context->cur_attr >= 0); - - if (unescape_text (context, - context->partial_chunk->str, - context->partial_chunk->str + - context->partial_chunk->len, - &context->attr_values[context->cur_attr], - error)) - { - /* success, advance past quote and set state. */ - advance_char (context); - context->state = STATE_BETWEEN_ATTRIBUTES; - context->start = NULL; - } - - truncate_partial (context); - } - break; - - case STATE_INSIDE_TEXT: - /* Possible next states: AFTER_OPEN_ANGLE */ - do - { - if (*context->iter == '<') - break; - } - while (advance_char (context)); - - /* The text hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - - add_to_partial (context, context->start, context->iter); - - if (context->iter != context->current_text_end) - { - gchar *unescaped = NULL; - - /* The text has ended at the open angle. Call the text - * callback. - */ - - if (unescape_text (context, - context->partial_chunk->str, - context->partial_chunk->str + - context->partial_chunk->len, - &unescaped, - error)) - { - GError *tmp_error = NULL; - - if (context->parser->text) - (*context->parser->text) (context, - unescaped, - strlen (unescaped), - context->user_data, - &tmp_error); - - g_free (unescaped); - - if (tmp_error == NULL) - { - /* advance past open angle and set state. */ - advance_char (context); - context->state = STATE_AFTER_OPEN_ANGLE; - /* could begin a passthrough */ - context->start = context->iter; - } - else - { - mark_error (context, tmp_error); - g_propagate_error (error, tmp_error); - } - } - - truncate_partial (context); - } - break; - - case STATE_AFTER_CLOSE_TAG_SLASH: - /* Possible next state: INSIDE_CLOSE_TAG_NAME */ - if (is_name_start_char (g_utf8_get_char (context->iter))) - { - context->state = STATE_INSIDE_CLOSE_TAG_NAME; - - /* start of tag name */ - context->start = context->iter; - } - else - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("'%s' is not a valid character following " - "the characters 'iter, buf), - utf8_str (context->iter, buf)); - } - break; - - case STATE_INSIDE_CLOSE_TAG_NAME: - /* Possible next state: AFTER_CLOSE_ANGLE */ - advance_to_name_end (context); - - if (context->iter == context->current_text_end) - { - /* The name hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - add_to_partial (context, context->start, context->iter); - } - else - { - /* The name has ended. Combine it with the partial chunk - * if any; check that it matches stack top and pop - * stack; invoke proper callback; enter next state. - */ - gchar *close_name; - - add_to_partial (context, context->start, context->iter); - - close_name = g_string_free (context->partial_chunk, FALSE); - context->partial_chunk = NULL; - - if (context->tag_stack == NULL) - { - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Element '%s' was closed, no element " - "is currently open"), - close_name); - } - else if (strcmp (close_name, current_element (context)) != 0) - { - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("Element '%s' was closed, but the currently " - "open element is '%s'"), - close_name, - current_element (context)); - } - else if (*context->iter != '>') - { - gchar buf[7]; - set_error (context, - error, - G_MARKUP_ERROR_PARSE, - _("'%s' is not a valid character following " - "the close element name '%s'; the allowed " - "character is '>'"), - utf8_str (context->iter, buf), - close_name); - } - else - { - GError *tmp_error; - advance_char (context); - context->state = STATE_AFTER_CLOSE_ANGLE; - context->start = NULL; - - /* call the end_element callback */ - tmp_error = NULL; - if (context->parser->end_element) - (* context->parser->end_element) (context, - close_name, - context->user_data, - &tmp_error); - - - /* Pop the tag stack */ - g_free (context->tag_stack->data); - context->tag_stack = g_slist_delete_link (context->tag_stack, - context->tag_stack); - - if (tmp_error) - { - mark_error (context, tmp_error); - g_propagate_error (error, tmp_error); - } - } - - g_free (close_name); - } - break; - - case STATE_INSIDE_PASSTHROUGH: - /* Possible next state: AFTER_CLOSE_ANGLE */ - do - { - if (*context->iter == '>') - break; - } - while (advance_char (context)); - - if (context->iter == context->current_text_end) - { - /* The passthrough hasn't necessarily ended. Merge with - * partial chunk, leave state unchanged. - */ - add_to_partial (context, context->start, context->iter); - } - else - { - /* The passthrough has ended at the close angle. Combine - * it with the partial chunk if any. Call the passthrough - * callback. Note that the open/close angles are - * included in the text of the passthrough. - */ - GError *tmp_error = NULL; - - advance_char (context); /* advance past close angle */ - add_to_partial (context, context->start, context->iter); - - if (context->parser->passthrough) - (*context->parser->passthrough) (context, - context->partial_chunk->str, - context->partial_chunk->len, - context->user_data, - &tmp_error); - - truncate_partial (context); - - if (tmp_error == NULL) - { - context->state = STATE_AFTER_CLOSE_ANGLE; - context->start = context->iter; /* could begin text */ - } - else - { - mark_error (context, tmp_error); - g_propagate_error (error, tmp_error); - } - } - break; - - case STATE_ERROR: - goto finished; - break; - - default: - g_assert_not_reached (); - break; - } - } - - finished: - context->parsing = FALSE; - - return context->state != STATE_ERROR; -} - -/** - * g_markup_parse_context_end_parse: - * @context: a #GMarkupParseContext - * @error: return location for a #GError - * - * Signals to the #GMarkupParseContext that all data has been - * fed into the parse context with g_markup_parse_context_parse(). - * This function reports an error if the document isn't complete, - * for example if elements are still open. - * - * Return value: %TRUE on success, %FALSE if an error was set - **/ -gboolean -g_markup_parse_context_end_parse (GMarkupParseContext *context, - GError **error) -{ - g_return_val_if_fail (context != NULL, FALSE); - g_return_val_if_fail (!context->parsing, FALSE); - g_return_val_if_fail (context->state != STATE_ERROR, FALSE); - - if (context->partial_chunk != NULL) - { - g_string_free (context->partial_chunk, TRUE); - context->partial_chunk = NULL; - } - - if (context->document_empty) - { - set_error (context, error, G_MARKUP_ERROR_EMPTY, - _("Document was empty or contained only whitespace")); - return FALSE; - } - - context->parsing = TRUE; - - switch (context->state) - { - case STATE_START: - /* Nothing to do */ - break; - - case STATE_AFTER_OPEN_ANGLE: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly just after an open angle bracket '<'")); - break; - - case STATE_AFTER_CLOSE_ANGLE: - if (context->tag_stack != NULL) - { - /* Error message the same as for INSIDE_TEXT */ - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly with elements still open - " - "'%s' was the last element opened"), - current_element (context)); - } - break; - - case STATE_AFTER_ELISION_SLASH: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly, expected to see a close angle " - "bracket ending the tag <%s/>"), current_element (context)); - break; - - case STATE_INSIDE_OPEN_TAG_NAME: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly inside an element name")); - break; - - case STATE_INSIDE_ATTRIBUTE_NAME: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly inside an attribute name")); - break; - - case STATE_BETWEEN_ATTRIBUTES: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly inside an element-opening " - "tag.")); - break; - - case STATE_AFTER_ATTRIBUTE_EQUALS_SIGN: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly after the equals sign " - "following an attribute name; no attribute value")); - break; - - case STATE_INSIDE_ATTRIBUTE_VALUE: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly while inside an attribute " - "value")); - break; - - case STATE_INSIDE_TEXT: - g_assert (context->tag_stack != NULL); - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly with elements still open - " - "'%s' was the last element opened"), - current_element (context)); - break; - - case STATE_AFTER_CLOSE_TAG_SLASH: - case STATE_INSIDE_CLOSE_TAG_NAME: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly inside the close tag for" - "element '%s'"), current_element); - break; - - case STATE_INSIDE_PASSTHROUGH: - set_error (context, error, G_MARKUP_ERROR_PARSE, - _("Document ended unexpectedly inside a comment or " - "processing instruction")); - break; - - case STATE_ERROR: - default: - g_assert_not_reached (); - break; - } - - context->parsing = FALSE; - - return context->state != STATE_ERROR; -} - -/** - * g_markup_parse_context_get_position: - * @context: a #GMarkupParseContext - * @line_number: return location for a line number, or %NULL - * @char_number: return location for a char-on-line number, or %NULL - * - * Retrieves the current line number and the number of the character on - * that line. Intended for use in error messages; there are no strict - * semantics for what constitutes the "current" line number other than - * "the best number we could come up with for error messages." - * - **/ -void -g_markup_parse_context_get_position (GMarkupParseContext *context, - gint *line_number, - gint *char_number) -{ - g_return_if_fail (context != NULL); - - if (line_number) - *line_number = context->line_number; - - if (char_number) - *char_number = context->char_number; -} - -static void -append_escaped_text (GString *str, - const gchar *text, - gssize length) -{ - const gchar *p; - const gchar *end; - - p = text; - end = text + length; - - while (p != end) - { - const gchar *next; - next = g_utf8_next_char (p); - - switch (*p) - { - case '&': - g_string_append (str, "&"); - break; - - case '<': - g_string_append (str, "<"); - break; - - case '>': - g_string_append (str, ">"); - break; - - case '\'': - g_string_append (str, "'"); - break; - - case '"': - g_string_append (str, """); - break; - - default: - g_string_append_len (str, p, next - p); - break; - } - - p = next; - } -} - -/** - * g_markup_escape_text: - * @text: some valid UTF-8 text - * @length: length of @text in bytes - * - * Escapes text so that the markup parser will parse it verbatim. - * Less than, greater than, ampersand, etc. are replaced with the - * corresponding entities. This function would typically be used - * when writing out a file to be parsed with the markup parser. - * - * Return value: escaped text - **/ -gchar* -g_markup_escape_text (const gchar *text, - gssize length) -{ - GString *str; - - g_return_val_if_fail (text != NULL, NULL); - - if (length < 0) - length = strlen (text); - - str = g_string_new (""); - append_escaped_text (str, text, length); - - return g_string_free (str, FALSE); -} diff --git a/gmarkup.h b/gmarkup.h deleted file mode 100644 index 32de22c2..00000000 --- a/gmarkup.h +++ /dev/null @@ -1,123 +0,0 @@ -/* gmarkup.h - Simple XML-like string parser/writer - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __G_MARKUP_H__ -#define __G_MARKUP_H__ - -#include - -G_BEGIN_DECLS - -typedef enum -{ - G_MARKUP_ERROR_BAD_UTF8, - G_MARKUP_ERROR_EMPTY, - G_MARKUP_ERROR_PARSE, - /* These three are primarily intended for specific GMarkupParser - * implementations to set. - */ - G_MARKUP_ERROR_UNKNOWN_ELEMENT, - G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, - G_MARKUP_ERROR_INVALID_CONTENT -} GMarkupError; - -#define G_MARKUP_ERROR g_markup_error_quark () - -GQuark g_markup_error_quark (); - -typedef enum -{ - /* Hmm, can't think of any at the moment */ - G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0 - -} GMarkupParseFlags; - -typedef struct _GMarkupParseContext GMarkupParseContext; -typedef struct _GMarkupParser GMarkupParser; - -struct _GMarkupParser -{ - /* Called for open tags */ - void (*start_element) (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error); - - /* Called for close tags */ - void (*end_element) (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error); - - /* Called for character data */ - /* text is not nul-terminated */ - void (*text) (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error); - - /* Called for strings that should be re-saved verbatim in this same - * position, but are not otherwise interpretable. At the moment - * this includes comments and processing instructions. - */ - /* text is not nul-terminated. */ - void (*passthrough) (GMarkupParseContext *context, - const gchar *passthrough_text, - gsize text_len, - gpointer user_data, - GError **error); - - /* Called on error, including one set by other - * methods in the vtable. The GError should not be freed. - */ - void (*error) (GMarkupParseContext *context, - GError *error, - gpointer user_data); -}; - -GMarkupParseContext *g_markup_parse_context_new (const GMarkupParser *parser, - GMarkupParseFlags flags, - gpointer user_data, - GDestroyNotify user_data_dnotify); -void g_markup_parse_context_free (GMarkupParseContext *context); -gboolean g_markup_parse_context_parse (GMarkupParseContext *context, - const gchar *text, - gssize text_len, - GError **error); - -gboolean g_markup_parse_context_end_parse (GMarkupParseContext *context, - GError **error); - -/* For user-constructed error messages, has no precise semantics */ -void g_markup_parse_context_get_position (GMarkupParseContext *context, - gint *line_number, - gint *char_number); - -/* useful when saving */ -gchar* g_markup_escape_text (const gchar *text, - gssize length); - -G_END_DECLS - -#endif /* __G_MARKUP_H__ */ - diff --git a/gmem.c b/gmem.c deleted file mode 100644 index 616614b9..00000000 --- a/gmem.c +++ /dev/null @@ -1,1263 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include "glib.h" - - -/* notes on macros: - * having DISABLE_MEM_POOLS defined, disables mem_chunks alltogether, their - * allocations are performed through ordinary g_malloc/g_free. - * having G_DISABLE_CHECKS defined disables use of glib_mem_profiler_table and - * g_mem_profile(). - * REALLOC_0_WORKS is defined if g_realloc (NULL, x) works. - * SANE_MALLOC_PROTOS is defined if the systems malloc() and friends functions - * match the corresponding GLib prototypes, keep configure.in and gmem.h in sync here. - * if ENABLE_GC_FRIENDLY is defined, freed memory should be 0-wiped. - */ - -#define MEM_PROFILE_TABLE_SIZE 4096 - -#define MEM_AREA_SIZE 4L - -#ifdef G_DISABLE_CHECKS -# define ENTER_MEM_CHUNK_ROUTINE() -# define LEAVE_MEM_CHUNK_ROUTINE() -# define IN_MEM_CHUNK_ROUTINE() FALSE -#else /* !G_DISABLE_CHECKS */ -static GPrivate* mem_chunk_recursion = NULL; -# define MEM_CHUNK_ROUTINE_COUNT() GPOINTER_TO_UINT (g_private_get (mem_chunk_recursion)) -# define ENTER_MEM_CHUNK_ROUTINE() g_private_set (mem_chunk_recursion, GUINT_TO_POINTER (MEM_CHUNK_ROUTINE_COUNT () + 1)) -# define LEAVE_MEM_CHUNK_ROUTINE() g_private_set (mem_chunk_recursion, GUINT_TO_POINTER (MEM_CHUNK_ROUTINE_COUNT () - 1)) -#endif /* !G_DISABLE_CHECKS */ - -#ifndef REALLOC_0_WORKS -static gpointer -standard_realloc (gpointer mem, - gsize n_bytes) -{ - if (!mem) - return malloc (n_bytes); - else - return realloc (mem, n_bytes); -} -#endif /* !REALLOC_0_WORKS */ - -#ifdef SANE_MALLOC_PROTOS -# define standard_malloc malloc -# ifdef REALLOC_0_WORKS -# define standard_realloc realloc -# endif /* REALLOC_0_WORKS */ -# define standard_free free -# define standard_calloc calloc -# define standard_try_malloc malloc -# define standard_try_realloc realloc -#else /* !SANE_MALLOC_PROTOS */ -static gpointer -standard_malloc (gsize n_bytes) -{ - return malloc (n_bytes); -} -# ifdef REALLOC_0_WORKS -static gpointer -standard_realloc (gpointer mem, - gsize n_bytes) -{ - return realloc (mem, n_bytes); -} -# endif /* REALLOC_0_WORKS */ -static void -standard_free (gpointer mem) -{ - free (mem); -} -static gpointer -standard_calloc (gsize n_blocks, - gsize n_bytes) -{ - return calloc (n_blocks, n_bytes); -} -#define standard_try_malloc standard_malloc -#define standard_try_realloc standard_realloc -#endif /* !SANE_MALLOC_PROTOS */ - - -/* --- variables --- */ -static GMemVTable glib_mem_vtable = { - standard_malloc, - standard_realloc, - standard_free, - standard_calloc, - standard_try_malloc, - standard_try_realloc, -}; - - -/* --- functions --- */ -gpointer -g_malloc (gulong n_bytes) -{ - if (n_bytes) - { - gpointer mem; - - mem = glib_mem_vtable.malloc (n_bytes); - if (mem) - return mem; - - g_error ("%s: failed to allocate %lu bytes", G_STRLOC, n_bytes); - } - - return NULL; -} - -gpointer -g_malloc0 (gulong n_bytes) -{ - if (n_bytes) - { - gpointer mem; - - mem = glib_mem_vtable.calloc (1, n_bytes); - if (mem) - return mem; - - g_error ("%s: failed to allocate %lu bytes", G_STRLOC, n_bytes); - } - - return NULL; -} - -gpointer -g_realloc (gpointer mem, - gulong n_bytes) -{ - if (n_bytes) - { - mem = glib_mem_vtable.realloc (mem, n_bytes); - if (mem) - return mem; - - g_error ("%s: failed to allocate %lu bytes", G_STRLOC, n_bytes); - } - - if (mem) - glib_mem_vtable.free (mem); - - return NULL; -} - -void -g_free (gpointer mem) -{ - if (mem) - glib_mem_vtable.free (mem); -} - -gpointer -g_try_malloc (gulong n_bytes) -{ - if (n_bytes) - return glib_mem_vtable.try_malloc (n_bytes); - else - return NULL; -} - -gpointer -g_try_realloc (gpointer mem, - gulong n_bytes) -{ - if (n_bytes) - return glib_mem_vtable.try_realloc (mem, n_bytes); - - if (mem) - glib_mem_vtable.free (mem); - - return NULL; -} - -static gpointer -fallback_calloc (gsize n_blocks, - gsize n_block_bytes) -{ - gsize l = n_blocks * n_block_bytes; - gpointer mem = glib_mem_vtable.malloc (l); - - if (mem) - memset (mem, 0, l); - - return mem; -} - -void -g_mem_set_vtable (GMemVTable *vtable) -{ - gboolean vtable_set = FALSE; - - if (!vtable_set) - { - vtable_set |= TRUE; - if (vtable->malloc && vtable->realloc && vtable->free) - { - glib_mem_vtable.malloc = vtable->malloc; - glib_mem_vtable.realloc = vtable->realloc; - glib_mem_vtable.free = vtable->free; - glib_mem_vtable.calloc = vtable->calloc ? vtable->calloc : fallback_calloc; - glib_mem_vtable.try_malloc = vtable->try_malloc ? vtable->try_malloc : glib_mem_vtable.malloc; - glib_mem_vtable.try_realloc = vtable->try_realloc ? vtable->try_realloc : glib_mem_vtable.realloc; - } - else - g_warning (G_STRLOC ": memory allocation vtable lacks one of malloc(), realloc() or free()"); - } - else - g_warning (G_STRLOC ": memory allocation vtable can only be set once at startup"); -} - - -/* --- memory profiling and checking --- */ -#ifdef G_DISABLE_CHECKS -GMemVTable *glib_mem_profiler_table = &glib_mem_vtable; -void -g_mem_profile (void) -{ -} -#else /* !G_DISABLE_CHECKS */ -typedef enum { - PROFILER_FREE = 0, - PROFILER_ALLOC = 1, - PROFILER_RELOC = 2, - PROFILER_ZINIT = 4 -} ProfilerJob; -static guint *profile_data = NULL; -static gulong profile_allocs = 0; -static gulong profile_mc_allocs = 0; -static gulong profile_zinit = 0; -static gulong profile_frees = 0; -static gulong profile_mc_frees = 0; -static GMutex *g_profile_mutex = NULL; -#ifdef G_ENABLE_DEBUG -static volatile gulong g_trap_free_size = 0; -static volatile gulong g_trap_realloc_size = 0; -static volatile gulong g_trap_malloc_size = 0; -#endif /* G_ENABLE_DEBUG */ - -#define PROFILE_TABLE(f1,f2,f3) ( ( ((f3) << 2) | ((f2) << 1) | (f1) ) * (MEM_PROFILE_TABLE_SIZE + 1)) - -static void -profiler_log (ProfilerJob job, - gulong n_bytes, - gboolean success) -{ - g_mutex_lock (g_profile_mutex); - if (!profile_data) - { - profile_data = standard_malloc ((MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0])); - if (!profile_data) /* memory system kiddin' me, eh? */ - { - g_mutex_unlock (g_profile_mutex); - return; - } - } - - if (MEM_CHUNK_ROUTINE_COUNT () == 0) - { - if (n_bytes < MEM_PROFILE_TABLE_SIZE) - profile_data[n_bytes + PROFILE_TABLE ((job & PROFILER_ALLOC) != 0, - (job & PROFILER_RELOC) != 0, - success != 0)] += 1; - else - profile_data[MEM_PROFILE_TABLE_SIZE + PROFILE_TABLE ((job & PROFILER_ALLOC) != 0, - (job & PROFILER_RELOC) != 0, - success != 0)] += 1; - if (success) - { - if (job & PROFILER_ALLOC) - { - profile_allocs += n_bytes; - if (job & PROFILER_ZINIT) - profile_zinit += n_bytes; - } - else - profile_frees += n_bytes; - } - } - else if (success) - { - if (job & PROFILER_ALLOC) - profile_mc_allocs += n_bytes; - else - profile_mc_frees += n_bytes; - } - g_mutex_unlock (g_profile_mutex); -} - -static void -profile_print_locked (guint *local_data, - gboolean success) -{ - gboolean need_header = TRUE; - guint i; - - for (i = 0; i <= MEM_PROFILE_TABLE_SIZE; i++) - { - glong t_malloc = local_data[i + PROFILE_TABLE (1, 0, success)]; - glong t_realloc = local_data[i + PROFILE_TABLE (1, 1, success)]; - glong t_free = local_data[i + PROFILE_TABLE (0, 0, success)]; - glong t_refree = local_data[i + PROFILE_TABLE (0, 1, success)]; - - if (!t_malloc && !t_realloc && !t_free && !t_refree) - continue; - else if (need_header) - { - need_header = FALSE; - g_print (" blocks of | allocated | freed | allocated | freed | n_bytes \n"); - g_print (" n_bytes | n_times by | n_times by | n_times by | n_times by | remaining \n"); - g_print (" | malloc() | free() | realloc() | realloc() | \n"); - g_print ("===========|============|============|============|============|===========\n"); - } - if (i < MEM_PROFILE_TABLE_SIZE) - g_print ("%10u | %10ld | %10ld | %10ld | %10ld |%+11ld\n", - i, t_malloc, t_free, t_realloc, t_refree, - (t_malloc - t_free + t_realloc - t_refree) * i); - else if (i >= MEM_PROFILE_TABLE_SIZE) - g_print (" >%6u | %10ld | %10ld | %10ld | %10ld | ***\n", - i, t_malloc, t_free, t_realloc, t_refree); - } - if (need_header) - g_print (" --- none ---\n"); -} - -void -g_mem_profile (void) -{ - guint local_data[(MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0])]; - gulong local_allocs; - gulong local_zinit; - gulong local_frees; - gulong local_mc_allocs; - gulong local_mc_frees; - - g_mutex_lock (g_profile_mutex); - - local_allocs = profile_allocs; - local_zinit = profile_zinit; - local_frees = profile_frees; - local_mc_allocs = profile_mc_allocs; - local_mc_frees = profile_mc_frees; - - if (!profile_data) - { - g_mutex_unlock (g_profile_mutex); - return; - } - - memcpy (local_data, profile_data, - (MEM_PROFILE_TABLE_SIZE + 1) * 8 * sizeof (profile_data[0])); - - g_mutex_unlock (g_profile_mutex); - - g_print ("GLib Memory statistics (successful operations):\n"); - profile_print_locked (local_data, TRUE); - g_print ("GLib Memory statistics (failing operations):\n"); - profile_print_locked (local_data, FALSE); - g_print ("Total bytes: allocated=%lu, zero-initialized=%lu (%.2f%%), freed=%lu (%.2f%%), remaining=%lu\n", - local_allocs, - local_zinit, - ((gdouble) local_zinit) / local_allocs * 100.0, - local_frees, - ((gdouble) local_frees) / local_allocs * 100.0, - local_allocs - local_frees); - g_print ("MemChunk bytes: allocated=%lu, freed=%lu (%.2f%%), remaining=%lu\n", - local_mc_allocs, - local_mc_frees, - ((gdouble) local_mc_frees) / local_mc_allocs * 100.0, - local_mc_allocs - local_mc_frees); -} - -static gpointer -profiler_try_malloc (gsize n_bytes) -{ - gulong *p; - -#ifdef G_ENABLE_DEBUG - if (g_trap_malloc_size == n_bytes) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - - p = standard_malloc (sizeof (gulong) * 2 + n_bytes); - - if (p) - { - p[0] = 0; /* free count */ - p[1] = n_bytes; /* length */ - profiler_log (PROFILER_ALLOC, n_bytes, TRUE); - p += 2; - } - else - profiler_log (PROFILER_ALLOC, n_bytes, FALSE); - - return p; -} - -static gpointer -profiler_malloc (gsize n_bytes) -{ - gpointer mem = profiler_try_malloc (n_bytes); - - if (!mem) - g_mem_profile (); - - return mem; -} - -static gpointer -profiler_calloc (gsize n_blocks, - gsize n_block_bytes) -{ - gsize l = n_blocks * n_block_bytes; - gulong *p; - -#ifdef G_ENABLE_DEBUG - if (g_trap_malloc_size == l) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - - p = standard_calloc (1, sizeof (gulong) * 2 + l); - - if (p) - { - p[0] = 0; /* free count */ - p[1] = l; /* length */ - profiler_log (PROFILER_ALLOC | PROFILER_ZINIT, l, TRUE); - p += 2; - } - else - { - profiler_log (PROFILER_ALLOC | PROFILER_ZINIT, l, FALSE); - g_mem_profile (); - } - - return p; -} - -static void -profiler_free (gpointer mem) -{ - gulong *p = mem; - - p -= 2; - if (p[0]) /* free count */ - { - g_warning ("free(%p): memory has been freed %lu times already", p + 2, p[0]); - profiler_log (PROFILER_FREE, - p[1], /* length */ - FALSE); - } - else - { -#ifdef G_ENABLE_DEBUG - if (g_trap_free_size == p[1]) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - - profiler_log (PROFILER_FREE, - p[1], /* length */ - TRUE); - memset (p + 2, 0xaa, p[1]); - - /* for all those that miss standard_free (p); in this place, yes, - * we do leak all memory when profiling, and that is intentional - * to catch double frees. patch submissions are futile. - */ - } - p[0] += 1; -} - -static gpointer -profiler_try_realloc (gpointer mem, - gsize n_bytes) -{ - gulong *p = mem; - - p -= 2; - -#ifdef G_ENABLE_DEBUG - if (g_trap_realloc_size == n_bytes) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - - if (mem && p[0]) /* free count */ - { - g_warning ("realloc(%p, %u): memory has been freed %lu times already", p + 2, n_bytes, p[0]); - profiler_log (PROFILER_ALLOC | PROFILER_RELOC, n_bytes, FALSE); - - return NULL; - } - else - { - p = standard_realloc (mem ? p : NULL, sizeof (gulong) * 2 + n_bytes); - - if (p) - { - if (mem) - profiler_log (PROFILER_FREE | PROFILER_RELOC, p[1], TRUE); - p[0] = 0; - p[1] = n_bytes; - profiler_log (PROFILER_ALLOC | PROFILER_RELOC, p[1], TRUE); - p += 2; - } - else - profiler_log (PROFILER_ALLOC | PROFILER_RELOC, n_bytes, FALSE); - - return p; - } -} - -static gpointer -profiler_realloc (gpointer mem, - gsize n_bytes) -{ - mem = profiler_try_realloc (mem, n_bytes); - - if (!mem) - g_mem_profile (); - - return mem; -} - -static GMemVTable profiler_table = { - profiler_malloc, - profiler_realloc, - profiler_free, - profiler_calloc, - profiler_try_malloc, - profiler_try_realloc, -}; -GMemVTable *glib_mem_profiler_table = &profiler_table; - -#endif /* !G_DISABLE_CHECKS */ - - -/* --- MemChunks --- */ -typedef struct _GFreeAtom GFreeAtom; -typedef struct _GMemArea GMemArea; -typedef struct _GRealMemChunk GRealMemChunk; - -struct _GFreeAtom -{ - GFreeAtom *next; -}; - -struct _GMemArea -{ - GMemArea *next; /* the next mem area */ - GMemArea *prev; /* the previous mem area */ - gulong index; /* the current index into the "mem" array */ - gulong free; /* the number of free bytes in this mem area */ - gulong allocated; /* the number of atoms allocated from this area */ - gulong mark; /* is this mem area marked for deletion */ - gchar mem[MEM_AREA_SIZE]; /* the mem array from which atoms get allocated - * the actual size of this array is determined by - * the mem chunk "area_size". ANSI says that it - * must be declared to be the maximum size it - * can possibly be (even though the actual size - * may be less). - */ -}; - -struct _GRealMemChunk -{ - const gchar *name; /* name of this MemChunk...used for debugging output */ - gint type; /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */ - gint num_mem_areas; /* the number of memory areas */ - gint num_marked_areas; /* the number of areas marked for deletion */ - guint atom_size; /* the size of an atom */ - gulong area_size; /* the size of a memory area */ - GMemArea *mem_area; /* the current memory area */ - GMemArea *mem_areas; /* a list of all the mem areas owned by this chunk */ - GMemArea *free_mem_area; /* the free area...which is about to be destroyed */ - GFreeAtom *free_atoms; /* the free atoms list */ - GTree *mem_tree; /* tree of mem areas sorted by memory address */ - GRealMemChunk *next; /* pointer to the next chunk */ - GRealMemChunk *prev; /* pointer to the previous chunk */ -}; - - -#ifndef DISABLE_MEM_POOLS -static gulong g_mem_chunk_compute_size (gulong size, - gulong min_size) G_GNUC_CONST; -static gint g_mem_chunk_area_compare (GMemArea *a, - GMemArea *b); -static gint g_mem_chunk_area_search (GMemArea *a, - gchar *addr); - -/* here we can't use StaticMutexes, as they depend upon a working - * g_malloc, the same holds true for StaticPrivate - */ -static GMutex *mem_chunks_lock = NULL; -static GRealMemChunk *mem_chunks = NULL; - -GMemChunk* -g_mem_chunk_new (const gchar *name, - gint atom_size, - gulong area_size, - gint type) -{ - GRealMemChunk *mem_chunk; - gulong rarea_size; - - g_return_val_if_fail (atom_size > 0, NULL); - g_return_val_if_fail (area_size >= atom_size, NULL); - - ENTER_MEM_CHUNK_ROUTINE (); - - area_size = (area_size + atom_size - 1) / atom_size; - area_size *= atom_size; - - mem_chunk = g_new (struct _GRealMemChunk, 1); - mem_chunk->name = name; - mem_chunk->type = type; - mem_chunk->num_mem_areas = 0; - mem_chunk->num_marked_areas = 0; - mem_chunk->mem_area = NULL; - mem_chunk->free_mem_area = NULL; - mem_chunk->free_atoms = NULL; - mem_chunk->mem_tree = NULL; - mem_chunk->mem_areas = NULL; - mem_chunk->atom_size = atom_size; - - if (mem_chunk->type == G_ALLOC_AND_FREE) - mem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare); - - if (mem_chunk->atom_size % G_MEM_ALIGN) - mem_chunk->atom_size += G_MEM_ALIGN - (mem_chunk->atom_size % G_MEM_ALIGN); - - rarea_size = area_size + sizeof (GMemArea) - MEM_AREA_SIZE; - rarea_size = g_mem_chunk_compute_size (rarea_size, atom_size + sizeof (GMemArea) - MEM_AREA_SIZE); - mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE); - - g_mutex_lock (mem_chunks_lock); - mem_chunk->next = mem_chunks; - mem_chunk->prev = NULL; - if (mem_chunks) - mem_chunks->prev = mem_chunk; - mem_chunks = mem_chunk; - g_mutex_unlock (mem_chunks_lock); - - LEAVE_MEM_CHUNK_ROUTINE (); - - return ((GMemChunk*) mem_chunk); -} - -void -g_mem_chunk_destroy (GMemChunk *mem_chunk) -{ - GRealMemChunk *rmem_chunk; - GMemArea *mem_areas; - GMemArea *temp_area; - - g_return_if_fail (mem_chunk != NULL); - - ENTER_MEM_CHUNK_ROUTINE (); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - - mem_areas = rmem_chunk->mem_areas; - while (mem_areas) - { - temp_area = mem_areas; - mem_areas = mem_areas->next; - g_free (temp_area); - } - - if (rmem_chunk->next) - rmem_chunk->next->prev = rmem_chunk->prev; - if (rmem_chunk->prev) - rmem_chunk->prev->next = rmem_chunk->next; - - g_mutex_lock (mem_chunks_lock); - if (rmem_chunk == mem_chunks) - mem_chunks = mem_chunks->next; - g_mutex_unlock (mem_chunks_lock); - - if (rmem_chunk->type == G_ALLOC_AND_FREE) - g_tree_destroy (rmem_chunk->mem_tree); - - g_free (rmem_chunk); - - LEAVE_MEM_CHUNK_ROUTINE (); -} - -gpointer -g_mem_chunk_alloc (GMemChunk *mem_chunk) -{ - GRealMemChunk *rmem_chunk; - GMemArea *temp_area; - gpointer mem; - - ENTER_MEM_CHUNK_ROUTINE (); - - g_return_val_if_fail (mem_chunk != NULL, NULL); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - - while (rmem_chunk->free_atoms) - { - /* Get the first piece of memory on the "free_atoms" list. - * We can go ahead and destroy the list node we used to keep - * track of it with and to update the "free_atoms" list to - * point to its next element. - */ - mem = rmem_chunk->free_atoms; - rmem_chunk->free_atoms = rmem_chunk->free_atoms->next; - - /* Determine which area this piece of memory is allocated from */ - temp_area = g_tree_search (rmem_chunk->mem_tree, - (GCompareFunc) g_mem_chunk_area_search, - mem); - - /* If the area has been marked, then it is being destroyed. - * (ie marked to be destroyed). - * We check to see if all of the segments on the free list that - * reference this area have been removed. This occurs when - * the ammount of free memory is less than the allocatable size. - * If the chunk should be freed, then we place it in the "free_mem_area". - * This is so we make sure not to free the mem area here and then - * allocate it again a few lines down. - * If we don't allocate a chunk a few lines down then the "free_mem_area" - * will be freed. - * If there is already a "free_mem_area" then we'll just free this mem area. - */ - if (temp_area->mark) - { - /* Update the "free" memory available in that area */ - temp_area->free += rmem_chunk->atom_size; - - if (temp_area->free == rmem_chunk->area_size) - { - if (temp_area == rmem_chunk->mem_area) - rmem_chunk->mem_area = NULL; - - if (rmem_chunk->free_mem_area) - { - rmem_chunk->num_mem_areas -= 1; - - if (temp_area->next) - temp_area->next->prev = temp_area->prev; - if (temp_area->prev) - temp_area->prev->next = temp_area->next; - if (temp_area == rmem_chunk->mem_areas) - rmem_chunk->mem_areas = rmem_chunk->mem_areas->next; - - if (rmem_chunk->type == G_ALLOC_AND_FREE) - g_tree_remove (rmem_chunk->mem_tree, temp_area); - g_free (temp_area); - } - else - rmem_chunk->free_mem_area = temp_area; - - rmem_chunk->num_marked_areas -= 1; - } - } - else - { - /* Update the number of allocated atoms count. - */ - temp_area->allocated += 1; - - /* The area wasn't marked...return the memory - */ - goto outa_here; - } - } - - /* If there isn't a current mem area or the current mem area is out of space - * then allocate a new mem area. We'll first check and see if we can use - * the "free_mem_area". Otherwise we'll just malloc the mem area. - */ - if ((!rmem_chunk->mem_area) || - ((rmem_chunk->mem_area->index + rmem_chunk->atom_size) > rmem_chunk->area_size)) - { - if (rmem_chunk->free_mem_area) - { - rmem_chunk->mem_area = rmem_chunk->free_mem_area; - rmem_chunk->free_mem_area = NULL; - } - else - { -#ifdef ENABLE_GC_FRIENDLY - rmem_chunk->mem_area = (GMemArea*) g_malloc0 (sizeof (GMemArea) - - MEM_AREA_SIZE + - rmem_chunk->area_size); -#else /* !ENABLE_GC_FRIENDLY */ - rmem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) - - MEM_AREA_SIZE + - rmem_chunk->area_size); -#endif /* ENABLE_GC_FRIENDLY */ - - rmem_chunk->num_mem_areas += 1; - rmem_chunk->mem_area->next = rmem_chunk->mem_areas; - rmem_chunk->mem_area->prev = NULL; - - if (rmem_chunk->mem_areas) - rmem_chunk->mem_areas->prev = rmem_chunk->mem_area; - rmem_chunk->mem_areas = rmem_chunk->mem_area; - - if (rmem_chunk->type == G_ALLOC_AND_FREE) - g_tree_insert (rmem_chunk->mem_tree, rmem_chunk->mem_area, rmem_chunk->mem_area); - } - - rmem_chunk->mem_area->index = 0; - rmem_chunk->mem_area->free = rmem_chunk->area_size; - rmem_chunk->mem_area->allocated = 0; - rmem_chunk->mem_area->mark = 0; - } - - /* Get the memory and modify the state variables appropriately. - */ - mem = (gpointer) &rmem_chunk->mem_area->mem[rmem_chunk->mem_area->index]; - rmem_chunk->mem_area->index += rmem_chunk->atom_size; - rmem_chunk->mem_area->free -= rmem_chunk->atom_size; - rmem_chunk->mem_area->allocated += 1; - -outa_here: - - LEAVE_MEM_CHUNK_ROUTINE (); - - return mem; -} - -gpointer -g_mem_chunk_alloc0 (GMemChunk *mem_chunk) -{ - gpointer mem; - - mem = g_mem_chunk_alloc (mem_chunk); - if (mem) - { - GRealMemChunk *rmem_chunk = (GRealMemChunk*) mem_chunk; - - memset (mem, 0, rmem_chunk->atom_size); - } - - return mem; -} - -void -g_mem_chunk_free (GMemChunk *mem_chunk, - gpointer mem) -{ - GRealMemChunk *rmem_chunk; - GMemArea *temp_area; - GFreeAtom *free_atom; - - g_return_if_fail (mem_chunk != NULL); - g_return_if_fail (mem != NULL); - - ENTER_MEM_CHUNK_ROUTINE (); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - -#ifdef ENABLE_GC_FRIENDLY - memset (mem, 0, rmem_chunk->atom_size); -#endif /* ENABLE_GC_FRIENDLY */ - - /* Don't do anything if this is an ALLOC_ONLY chunk - */ - if (rmem_chunk->type == G_ALLOC_AND_FREE) - { - /* Place the memory on the "free_atoms" list - */ - free_atom = (GFreeAtom*) mem; - free_atom->next = rmem_chunk->free_atoms; - rmem_chunk->free_atoms = free_atom; - - temp_area = g_tree_search (rmem_chunk->mem_tree, - (GCompareFunc) g_mem_chunk_area_search, - mem); - - temp_area->allocated -= 1; - - if (temp_area->allocated == 0) - { - temp_area->mark = 1; - rmem_chunk->num_marked_areas += 1; - } - } - - LEAVE_MEM_CHUNK_ROUTINE (); -} - -/* This doesn't free the free_area if there is one */ -void -g_mem_chunk_clean (GMemChunk *mem_chunk) -{ - GRealMemChunk *rmem_chunk; - GMemArea *mem_area; - GFreeAtom *prev_free_atom; - GFreeAtom *temp_free_atom; - gpointer mem; - - g_return_if_fail (mem_chunk != NULL); - - ENTER_MEM_CHUNK_ROUTINE (); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - - if (rmem_chunk->type == G_ALLOC_AND_FREE) - { - prev_free_atom = NULL; - temp_free_atom = rmem_chunk->free_atoms; - - while (temp_free_atom) - { - mem = (gpointer) temp_free_atom; - - mem_area = g_tree_search (rmem_chunk->mem_tree, - (GCompareFunc) g_mem_chunk_area_search, - mem); - - /* If this mem area is marked for destruction then delete the - * area and list node and decrement the free mem. - */ - if (mem_area->mark) - { - if (prev_free_atom) - prev_free_atom->next = temp_free_atom->next; - else - rmem_chunk->free_atoms = temp_free_atom->next; - temp_free_atom = temp_free_atom->next; - - mem_area->free += rmem_chunk->atom_size; - if (mem_area->free == rmem_chunk->area_size) - { - rmem_chunk->num_mem_areas -= 1; - rmem_chunk->num_marked_areas -= 1; - - if (mem_area->next) - mem_area->next->prev = mem_area->prev; - if (mem_area->prev) - mem_area->prev->next = mem_area->next; - if (mem_area == rmem_chunk->mem_areas) - rmem_chunk->mem_areas = rmem_chunk->mem_areas->next; - if (mem_area == rmem_chunk->mem_area) - rmem_chunk->mem_area = NULL; - - if (rmem_chunk->type == G_ALLOC_AND_FREE) - g_tree_remove (rmem_chunk->mem_tree, mem_area); - g_free (mem_area); - } - } - else - { - prev_free_atom = temp_free_atom; - temp_free_atom = temp_free_atom->next; - } - } - } - LEAVE_MEM_CHUNK_ROUTINE (); -} - -void -g_mem_chunk_reset (GMemChunk *mem_chunk) -{ - GRealMemChunk *rmem_chunk; - GMemArea *mem_areas; - GMemArea *temp_area; - - g_return_if_fail (mem_chunk != NULL); - - ENTER_MEM_CHUNK_ROUTINE (); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - - mem_areas = rmem_chunk->mem_areas; - rmem_chunk->num_mem_areas = 0; - rmem_chunk->mem_areas = NULL; - rmem_chunk->mem_area = NULL; - - while (mem_areas) - { - temp_area = mem_areas; - mem_areas = mem_areas->next; - g_free (temp_area); - } - - rmem_chunk->free_atoms = NULL; - - if (rmem_chunk->mem_tree) - g_tree_destroy (rmem_chunk->mem_tree); - rmem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare); - - LEAVE_MEM_CHUNK_ROUTINE (); -} - -void -g_mem_chunk_print (GMemChunk *mem_chunk) -{ - GRealMemChunk *rmem_chunk; - GMemArea *mem_areas; - gulong mem; - - g_return_if_fail (mem_chunk != NULL); - - rmem_chunk = (GRealMemChunk*) mem_chunk; - mem_areas = rmem_chunk->mem_areas; - mem = 0; - - while (mem_areas) - { - mem += rmem_chunk->area_size - mem_areas->free; - mem_areas = mem_areas->next; - } - - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, - "%s: %ld bytes using %d mem areas", - rmem_chunk->name, mem, rmem_chunk->num_mem_areas); -} - -void -g_mem_chunk_info (void) -{ - GRealMemChunk *mem_chunk; - gint count; - - count = 0; - g_mutex_lock (mem_chunks_lock); - mem_chunk = mem_chunks; - while (mem_chunk) - { - count += 1; - mem_chunk = mem_chunk->next; - } - g_mutex_unlock (mem_chunks_lock); - - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%d mem chunks", count); - - g_mutex_lock (mem_chunks_lock); - mem_chunk = mem_chunks; - g_mutex_unlock (mem_chunks_lock); - - while (mem_chunk) - { - g_mem_chunk_print ((GMemChunk*) mem_chunk); - mem_chunk = mem_chunk->next; - } -} - -void -g_blow_chunks (void) -{ - GRealMemChunk *mem_chunk; - - g_mutex_lock (mem_chunks_lock); - mem_chunk = mem_chunks; - g_mutex_unlock (mem_chunks_lock); - while (mem_chunk) - { - g_mem_chunk_clean ((GMemChunk*) mem_chunk); - mem_chunk = mem_chunk->next; - } -} - -static gulong -g_mem_chunk_compute_size (gulong size, - gulong min_size) -{ - gulong power_of_2; - gulong lower, upper; - - power_of_2 = 16; - while (power_of_2 < size) - power_of_2 <<= 1; - - lower = power_of_2 >> 1; - upper = power_of_2; - - if (size - lower < upper - size && lower >= min_size) - return lower; - else - return upper; -} - -static gint -g_mem_chunk_area_compare (GMemArea *a, - GMemArea *b) -{ - if (a->mem > b->mem) - return 1; - else if (a->mem < b->mem) - return -1; - return 0; -} - -static gint -g_mem_chunk_area_search (GMemArea *a, - gchar *addr) -{ - if (a->mem <= addr) - { - if (addr < &a->mem[a->index]) - return 0; - return 1; - } - return -1; -} - -#else /* DISABLE_MEM_POOLS */ - -typedef struct { - guint alloc_size; /* the size of an atom */ -} GMinimalMemChunk; - -GMemChunk* -g_mem_chunk_new (const gchar *name, - gint atom_size, - gulong area_size, - gint type) -{ - GMinimalMemChunk *mem_chunk; - - g_return_val_if_fail (atom_size > 0, NULL); - - mem_chunk = g_new (GMinimalMemChunk, 1); - mem_chunk->alloc_size = atom_size; - - return ((GMemChunk*) mem_chunk); -} - -void -g_mem_chunk_destroy (GMemChunk *mem_chunk) -{ - g_return_if_fail (mem_chunk != NULL); - - g_free (mem_chunk); -} - -gpointer -g_mem_chunk_alloc (GMemChunk *mem_chunk) -{ - GMinimalMemChunk *minimal = (GMinimalMemChunk *)mem_chunk; - - g_return_val_if_fail (mem_chunk != NULL, NULL); - - return g_malloc (minimal->alloc_size); -} - -gpointer -g_mem_chunk_alloc0 (GMemChunk *mem_chunk) -{ - GMinimalMemChunk *minimal = (GMinimalMemChunk *)mem_chunk; - - g_return_val_if_fail (mem_chunk != NULL, NULL); - - return g_malloc0 (minimal->alloc_size); -} - -void -g_mem_chunk_free (GMemChunk *mem_chunk, - gpointer mem) -{ - g_return_if_fail (mem_chunk != NULL); - - g_free (mem); -} - -void g_mem_chunk_clean (GMemChunk *mem_chunk) {} -void g_mem_chunk_reset (GMemChunk *mem_chunk) {} -void g_mem_chunk_print (GMemChunk *mem_chunk) {} -void g_mem_chunk_info (void) {} -void g_blow_chunks (void) {} - -#endif /* DISABLE_MEM_POOLS */ - - -/* generic allocators - */ -struct _GAllocator /* from gmem.c */ -{ - gchar *name; - guint16 n_preallocs; - guint is_unused : 1; - guint type : 4; - GAllocator *last; - GMemChunk *mem_chunk; - gpointer dummy; /* implementation specific */ -}; - -GAllocator* -g_allocator_new (const gchar *name, - guint n_preallocs) -{ - GAllocator *allocator; - - g_return_val_if_fail (name != NULL, NULL); - - allocator = g_new0 (GAllocator, 1); - allocator->name = g_strdup (name); - allocator->n_preallocs = CLAMP (n_preallocs, 1, 65535); - allocator->is_unused = TRUE; - allocator->type = 0; - allocator->last = NULL; - allocator->mem_chunk = NULL; - allocator->dummy = NULL; - - return allocator; -} - -void -g_allocator_free (GAllocator *allocator) -{ - g_return_if_fail (allocator != NULL); - g_return_if_fail (allocator->is_unused == TRUE); - - g_free (allocator->name); - if (allocator->mem_chunk) - g_mem_chunk_destroy (allocator->mem_chunk); - - g_free (allocator); -} - -void -g_mem_init (void) -{ -#ifndef DISABLE_MEM_POOLS - mem_chunks_lock = g_mutex_new (); -#endif -#ifndef G_DISABLE_CHECKS - mem_chunk_recursion = g_private_new (NULL); - g_profile_mutex = g_mutex_new (); -#endif -} diff --git a/gmem.h b/gmem.h deleted file mode 100644 index 014326c6..00000000 --- a/gmem.h +++ /dev/null @@ -1,174 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_MEM_H__ -#define __G_MEM_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GAllocator GAllocator; -typedef struct _GMemChunk GMemChunk; -typedef struct _GMemVTable GMemVTable; - - -#if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG -# define G_MEM_ALIGN GLIB_SIZEOF_VOID_P -#else /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ -# define G_MEM_ALIGN GLIB_SIZEOF_LONG -#endif /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ - - -/* Memory allocation functions - */ -gpointer g_malloc (gulong n_bytes); -gpointer g_malloc0 (gulong n_bytes); -gpointer g_realloc (gpointer mem, - gulong n_bytes); -void g_free (gpointer mem); -gpointer g_try_malloc (gulong n_bytes); -gpointer g_try_realloc (gpointer mem, - gulong n_bytes); - - -/* Convenience memory allocators - */ -#define g_new(struct_type, n_structs) \ - ((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) -#define g_new0(struct_type, n_structs) \ - ((struct_type *) g_malloc0 (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) -#define g_renew(struct_type, mem, n_structs) \ - ((struct_type *) g_realloc ((mem), ((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) - - -/* Memory allocation virtualization for debugging purposes - * g_mem_set_vtable() has to be the very first GLib function called - * if being used - */ -struct _GMemVTable -{ - gpointer (*malloc) (gsize n_bytes); - gpointer (*realloc) (gpointer mem, - gsize n_bytes); - void (*free) (gpointer mem); - /* optional */ - gpointer (*calloc) (gsize n_blocks, - gsize n_block_bytes); - gpointer (*try_malloc) (gsize n_bytes); - gpointer (*try_realloc) (gpointer mem, - gsize n_bytes); -}; -void g_mem_set_vtable (GMemVTable *vtable); - - -/* Memory profiler and checker, has to be enabled via g_mem_set_vtable() - */ -GLIB_VAR GMemVTable *glib_mem_profiler_table; -void g_mem_profile (void); - - -/* Memchunk convenience functions - */ -#define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ - g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ - sizeof (type), \ - sizeof (type) * (pre_alloc), \ - (alloc_type)) \ -) -#define g_chunk_new(type, chunk) ( \ - (type *) g_mem_chunk_alloc (chunk) \ -) -#define g_chunk_new0(type, chunk) ( \ - (type *) g_mem_chunk_alloc0 (chunk) \ -) -#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ - g_mem_chunk_free ((mem_chunk), (mem)); \ -} G_STMT_END - - -/* "g_mem_chunk_new" creates a new memory chunk. - * Memory chunks are used to allocate pieces of memory which are - * always the same size. Lists are a good example of such a data type. - * The memory chunk allocates and frees blocks of memory as needed. - * Just be sure to call "g_mem_chunk_free" and not "g_free" on data - * allocated in a mem chunk. ("g_free" will most likely cause a seg - * fault...somewhere). - * - * Oh yeah, GMemChunk is an opaque data type. (You don't really - * want to know what's going on inside do you?) - */ - -/* ALLOC_ONLY MemChunk's can only allocate memory. The free operation - * is interpreted as a no op. ALLOC_ONLY MemChunk's save 4 bytes per - * atom. (They are also useful for lists which use MemChunk to allocate - * memory but are also part of the MemChunk implementation). - * ALLOC_AND_FREE MemChunk's can allocate and free memory. - */ - -#define G_ALLOC_ONLY 1 -#define G_ALLOC_AND_FREE 2 - -GMemChunk* g_mem_chunk_new (const gchar *name, - gint atom_size, - gulong area_size, - gint type); -void g_mem_chunk_destroy (GMemChunk *mem_chunk); -gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk); -gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk); -void g_mem_chunk_free (GMemChunk *mem_chunk, - gpointer mem); -void g_mem_chunk_clean (GMemChunk *mem_chunk); -void g_mem_chunk_reset (GMemChunk *mem_chunk); -void g_mem_chunk_print (GMemChunk *mem_chunk); -void g_mem_chunk_info (void); - -/* Ah yes...we have a "g_blow_chunks" function. - * "g_blow_chunks" simply compresses all the chunks. This operation - * consists of freeing every memory area that should be freed (but - * which we haven't gotten around to doing yet). And, no, - * "g_blow_chunks" doesn't follow the naming scheme, but it is a - * much better name than "g_mem_chunk_clean_all" or something - * similar. - */ -void g_blow_chunks (void); - - -/* Generic allocators - */ -GAllocator* g_allocator_new (const gchar *name, - guint n_preallocs); -void g_allocator_free (GAllocator *allocator); - -/* internal */ -#define G_ALLOCATOR_LIST (1) -#define G_ALLOCATOR_SLIST (2) -#define G_ALLOCATOR_NODE (3) - - -G_END_DECLS - -#endif /* __G_MEM_H__ */ diff --git a/gmessages.c b/gmessages.c deleted file mode 100644 index 19479503..00000000 --- a/gmessages.c +++ /dev/null @@ -1,1256 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include "glib.h" -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include - -#ifdef G_OS_WIN32 -typedef FILE* GFileDescriptor; -#else -typedef gint GFileDescriptor; -#endif - -/* --- structures --- */ -typedef struct _GLogDomain GLogDomain; -typedef struct _GLogHandler GLogHandler; -struct _GLogDomain -{ - gchar *log_domain; - GLogLevelFlags fatal_mask; - GLogHandler *handlers; - GLogDomain *next; -}; -struct _GLogHandler -{ - guint id; - GLogLevelFlags log_level; - GLogFunc log_func; - gpointer data; - GLogHandler *next; -}; - - -/* --- prototypes --- */ -static guint printf_string_upper_bound (const gchar *format, - gboolean may_warn, - va_list args); - - -/* --- variables --- */ - -static GMutex* g_messages_lock = NULL; - -const gchar *g_log_domain_glib = "GLib"; -static GLogDomain *g_log_domains = NULL; -static GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK; -static GPrintFunc glib_print_func = NULL; -static GPrintFunc glib_printerr_func = NULL; -static GErrorFunc glib_error_func = NULL; -static GWarningFunc glib_warning_func = NULL; -static GPrintFunc glib_message_func = NULL; - -static GPrivate* g_log_depth = NULL; - -/* --- functions --- */ -#ifdef G_OS_WIN32 -# define STRICT -# include -# undef STRICT -# include /* For _getpid() */ - -static gboolean alloc_console_called = FALSE; - -static gboolean gonna_abort = FALSE; - -/* This default message will usually be overwritten. */ -/* Yes, a fixed size buffer is bad. So sue me. But g_error is never - * with huge strings, is it? */ -static char fatal_msg_buf[1000] = "Unspecified fatal error encountered, aborting."; -static char *fatal_msg_ptr = fatal_msg_buf; - -/* Just use stdio. If we're out of memory, we're hosed anyway. */ -#undef write -static inline int -dowrite (GFileDescriptor fd, - const void *buf, - unsigned int len) -{ - if (gonna_abort) - { - memcpy (fatal_msg_ptr, buf, len); - fatal_msg_ptr += len; - *fatal_msg_ptr = 0; - return len; - } - - fwrite (buf, len, 1, fd); - fflush (fd); - - return len; -} - -#define write(fd, buf, len) dowrite(fd, buf, len) - -static void -ensure_stdout_valid (void) -{ - HANDLE handle; - - if (gonna_abort) - return; - - if (!alloc_console_called) - { - handle = GetStdHandle (STD_OUTPUT_HANDLE); - - if (handle == INVALID_HANDLE_VALUE) - { - AllocConsole (); - alloc_console_called = TRUE; - freopen ("CONOUT$", "w", stdout); - } - } -} -#else -#define ensure_stdout_valid() /* Define as empty */ -#endif - -static void -write_unsigned (GFileDescriptor fd, - gulong num, - guint radix) -{ - char buffer[64]; - gulong tmp; - char c; - int i, n; - - g_return_if_fail (radix >= 2 && radix <= 36); - - if (!num) - { - write (fd, "0", 1); - return; - } - - if (radix == 16) - write (fd, "0x", 2); - else if (radix == 8) - write (fd, "0", 1); - - n = 0; - tmp = num; - while (tmp) - { - tmp /= radix; - n++; - } - - i = n; - while (num) - { - i--; - c = (num % radix); - if (c < 10) - buffer[i] = c + '0'; - else - buffer[i] = c + 'a' - 10; - num /= radix; - } - - write (fd, buffer, n); -} - -static void -write_string (GFileDescriptor fd, - gchar *string) -{ - write (fd, string, strlen (string)); -} - -static void -g_log_write_prefix (GFileDescriptor fd, - GLogLevelFlags mask) -{ - static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; - static gboolean initialized = FALSE; - - g_mutex_lock (g_messages_lock); - - if (!initialized) - { - const gchar *val; - initialized = TRUE; - - val = g_getenv ("G_MESSAGES_PREFIXED"); - - if (val) - { - static const GDebugKey keys[] = { - { "error", G_LOG_LEVEL_ERROR }, - { "critical", G_LOG_LEVEL_CRITICAL }, - { "warning", G_LOG_LEVEL_WARNING }, - { "message", G_LOG_LEVEL_MESSAGE }, - { "info", G_LOG_LEVEL_INFO }, - { "debug", G_LOG_LEVEL_DEBUG } - }; - - g_log_msg_prefix = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); - } - } - - g_mutex_unlock (g_messages_lock); - - if ((g_log_msg_prefix & mask) == mask) - { - gchar *prg_name; - - prg_name = g_get_prgname (); - - if (!prg_name) - write_string (fd, "(process:"); - else - { - write_string (fd, prg_name); - write_string (fd, " (pid:"); - } - - write_unsigned (fd, getpid (), 10); - write_string (fd, "): "); - } -} - -static inline GLogDomain* -g_log_find_domain (const gchar *log_domain) -{ - register GLogDomain *domain; - - g_mutex_lock (g_messages_lock); - domain = g_log_domains; - while (domain) - { - if (strcmp (domain->log_domain, log_domain) == 0) - { - g_mutex_unlock (g_messages_lock); - return domain; - } - domain = domain->next; - } - g_mutex_unlock (g_messages_lock); - return NULL; -} - -static inline GLogDomain* -g_log_domain_new (const gchar *log_domain) -{ - register GLogDomain *domain; - - domain = g_new (GLogDomain, 1); - domain->log_domain = g_strdup (log_domain); - domain->fatal_mask = G_LOG_FATAL_MASK; - domain->handlers = NULL; - - g_mutex_lock (g_messages_lock); - domain->next = g_log_domains; - g_log_domains = domain; - g_mutex_unlock (g_messages_lock); - - return domain; -} - -static inline void -g_log_domain_check_free (GLogDomain *domain) -{ - if (domain->fatal_mask == G_LOG_FATAL_MASK && - domain->handlers == NULL) - { - register GLogDomain *last, *work; - - last = NULL; - - g_mutex_lock (g_messages_lock); - work = g_log_domains; - while (work) - { - if (work == domain) - { - if (last) - last->next = domain->next; - else - g_log_domains = domain->next; - g_free (domain->log_domain); - g_free (domain); - break; - } - last = work; - work = last->next; - } - g_mutex_unlock (g_messages_lock); - } -} - -static inline GLogFunc -g_log_domain_get_handler (GLogDomain *domain, - GLogLevelFlags log_level, - gpointer *data) -{ - if (domain && log_level) - { - register GLogHandler *handler; - - handler = domain->handlers; - while (handler) - { - if ((handler->log_level & log_level) == log_level) - { - *data = handler->data; - return handler->log_func; - } - handler = handler->next; - } - } - return g_log_default_handler; -} - -GLogLevelFlags -g_log_set_always_fatal (GLogLevelFlags fatal_mask) -{ - GLogLevelFlags old_mask; - - /* restrict the global mask to levels that are known to glib */ - fatal_mask &= (1 << G_LOG_LEVEL_USER_SHIFT) - 1; - /* force errors to be fatal */ - fatal_mask |= G_LOG_LEVEL_ERROR; - /* remove bogus flag */ - fatal_mask &= ~G_LOG_FLAG_FATAL; - - g_mutex_lock (g_messages_lock); - old_mask = g_log_always_fatal; - g_log_always_fatal = fatal_mask; - g_mutex_unlock (g_messages_lock); - - return old_mask; -} - -GLogLevelFlags -g_log_set_fatal_mask (const gchar *log_domain, - GLogLevelFlags fatal_mask) -{ - GLogLevelFlags old_flags; - register GLogDomain *domain; - - if (!log_domain) - log_domain = ""; - - /* force errors to be fatal */ - fatal_mask |= G_LOG_LEVEL_ERROR; - /* remove bogus flag */ - fatal_mask &= ~G_LOG_FLAG_FATAL; - - domain = g_log_find_domain (log_domain); - if (!domain) - domain = g_log_domain_new (log_domain); - old_flags = domain->fatal_mask; - - domain->fatal_mask = fatal_mask; - g_log_domain_check_free (domain); - - return old_flags; -} - -guint -g_log_set_handler (const gchar *log_domain, - GLogLevelFlags log_levels, - GLogFunc log_func, - gpointer user_data) -{ - register GLogDomain *domain; - register GLogHandler *handler; - static guint handler_id = 0; - - g_return_val_if_fail ((log_levels & G_LOG_LEVEL_MASK) != 0, 0); - g_return_val_if_fail (log_func != NULL, 0); - - if (!log_domain) - log_domain = ""; - - domain = g_log_find_domain (log_domain); - if (!domain) - domain = g_log_domain_new (log_domain); - - handler = g_new (GLogHandler, 1); - g_mutex_lock (g_messages_lock); - handler->id = ++handler_id; - g_mutex_unlock (g_messages_lock); - handler->log_level = log_levels; - handler->log_func = log_func; - handler->data = user_data; - handler->next = domain->handlers; - domain->handlers = handler; - - return handler_id; -} - -void -g_log_remove_handler (const gchar *log_domain, - guint handler_id) -{ - register GLogDomain *domain; - - g_return_if_fail (handler_id > 0); - - if (!log_domain) - log_domain = ""; - - domain = g_log_find_domain (log_domain); - if (domain) - { - register GLogHandler *work, *last; - - last = NULL; - work = domain->handlers; - while (work) - { - if (work->id == handler_id) - { - if (last) - last->next = work->next; - else - domain->handlers = work->next; - g_free (work); - g_log_domain_check_free (domain); - return; - } - last = work; - work = last->next; - } - } - g_warning ("g_log_remove_handler(): could not find handler with id `%d' for domain \"%s\"", - handler_id, - log_domain); -} - -void -g_logv (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *format, - va_list args1) -{ - va_list args2; - gchar buffer[1025]; - register gint i; - - log_level &= G_LOG_LEVEL_MASK; - if (!log_level) - return; - - /* we use a stack buffer of fixed size, because we might get called - * recursively. - */ - G_VA_COPY (args2, args1); - if (printf_string_upper_bound (format, FALSE, args1) < 1024) - vsprintf (buffer, format, args2); - else - { - /* since we might be out of memory, we can't use g_vsnprintf(). */ -#ifdef HAVE_VSNPRINTF - vsnprintf (buffer, 1024, format, args2); -#else /* !HAVE_VSNPRINTF */ - /* we are out of luck here */ - strncpy (buffer, format, 1024); -#endif /* !HAVE_VSNPRINTF */ - buffer[1024] = 0; - } - va_end (args2); - - for (i = g_bit_nth_msf (log_level, -1); i >= 0; i = g_bit_nth_msf (log_level, i)) - { - register GLogLevelFlags test_level; - - test_level = 1 << i; - if (log_level & test_level) - { - guint depth = GPOINTER_TO_UINT (g_private_get (g_log_depth)); - GLogDomain *domain; - GLogFunc log_func; - gpointer data = NULL; - - domain = g_log_find_domain (log_domain ? log_domain : ""); - - if (depth) - test_level |= G_LOG_FLAG_RECURSION; - - depth++; - g_private_set (g_log_depth, GUINT_TO_POINTER (depth)); - - g_mutex_lock (g_messages_lock); - if ((((domain ? domain->fatal_mask : G_LOG_FATAL_MASK) | - g_log_always_fatal) & test_level) != 0) - test_level |= G_LOG_FLAG_FATAL; - g_mutex_unlock (g_messages_lock); - - log_func = g_log_domain_get_handler (domain, test_level, &data); - log_func (log_domain, test_level, buffer, data); - - /* *domain can be cluttered now */ - - if (test_level & G_LOG_FLAG_FATAL) - { -#if defined (G_ENABLE_DEBUG) && defined (SIGTRAP) - if (!(test_level & G_LOG_FLAG_RECURSION)) - G_BREAKPOINT (); - else - abort (); -#else /* !G_ENABLE_DEBUG || !SIGTRAP */ -#ifdef G_OS_WIN32 - MessageBox (NULL, fatal_msg_buf, NULL, MB_OK); -#endif -# if defined (_MSC_VER) && defined (_DEBUG) - /* let's see the call stack ... */ - __asm int 3 -# endif - abort (); -#endif /* !G_ENABLE_DEBUG || !SIGTRAP */ - } - - depth--; - g_private_set (g_log_depth, GUINT_TO_POINTER (depth)); - } - } -} - -void -g_log (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *format, - ...) -{ - va_list args; - - va_start (args, format); - g_logv (log_domain, log_level, format, args); - va_end (args); -} - -void -g_log_default_handler (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message, - gpointer unused_data) -{ - GFileDescriptor fd; - gboolean in_recursion; - gboolean is_fatal; - GErrorFunc local_glib_error_func; - GWarningFunc local_glib_warning_func; - GPrintFunc local_glib_message_func; - - in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0; - is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; - log_level &= G_LOG_LEVEL_MASK; - - if (!message) - message = "g_log_default_handler(): (NULL) message"; - -#ifdef G_OS_WIN32 - /* Use just stdout as stderr is hard to get redirected from the - * DOS prompt. - */ - fd = stdout; - gonna_abort = is_fatal; -#else - fd = (log_level > G_LOG_LEVEL_MESSAGE) ? 1 : 2; -#endif - - g_mutex_lock (g_messages_lock); - local_glib_error_func = glib_error_func; - local_glib_warning_func = glib_warning_func; - local_glib_message_func = glib_message_func; - g_mutex_unlock (g_messages_lock); - - switch (log_level) - { - case G_LOG_LEVEL_ERROR: - if (!log_domain && local_glib_error_func) - { - /* compatibility code */ - local_glib_error_func (message); - return; - } - /* use write(2) for output, in case we are out of memeory */ - ensure_stdout_valid (); - write (fd, "\n", 1); - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - else - write (fd, "** ", 3); - if (in_recursion) - write (fd, "ERROR (recursed) **: ", 21); - else - write (fd, "ERROR **: ", 10); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - case G_LOG_LEVEL_CRITICAL: - ensure_stdout_valid (); - write (fd, "\n", 1); - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - else - write (fd, "** ", 3); - if (in_recursion) - write (fd, "CRITICAL (recursed) **: ", 24); - else - write (fd, "CRITICAL **: ", 13); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - case G_LOG_LEVEL_WARNING: - if (!log_domain && local_glib_warning_func) - { - /* compatibility code */ - local_glib_warning_func (message); - return; - } - ensure_stdout_valid (); - write (fd, "\n", 1); - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - else - write (fd, "** ", 3); - if (in_recursion) - write (fd, "WARNING (recursed) **: ", 23); - else - write (fd, "WARNING **: ", 12); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - case G_LOG_LEVEL_MESSAGE: - if (!log_domain && local_glib_message_func) - { - /* compatibility code */ - local_glib_message_func (message); - return; - } - ensure_stdout_valid (); - - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - if (in_recursion) - write (fd, "Message (recursed): ", 20); - else - write (fd, "Message: ", 9); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - case G_LOG_LEVEL_INFO: - ensure_stdout_valid (); - - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - if (in_recursion) - write (fd, "INFO (recursed): ", 17); - else - write (fd, "INFO: ", 6); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - case G_LOG_LEVEL_DEBUG: - ensure_stdout_valid (); - - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - write (fd, "-", 1); - } - if (in_recursion) - write (fd, "DEBUG (recursed): ", 18); - else - write (fd, "DEBUG: ", 7); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - default: - /* we are used for a log level that is not defined by GLib itself, - * try to make the best out of it. - */ - ensure_stdout_valid (); - - g_log_write_prefix (fd, log_level); - - if (log_domain) - { - write (fd, log_domain, strlen (log_domain)); - if (in_recursion) - write (fd, "-LOG (recursed:", 15); - else - write (fd, "-LOG (", 6); - } - else if (in_recursion) - write (fd, "LOG (recursed:", 14); - else - write (fd, "LOG (", 5); - if (log_level) - { - gchar string[] = "0x00): "; - gchar *p = string + 2; - guint i; - - i = g_bit_nth_msf (log_level, -1); - *p = i >> 4; - p++; - *p = '0' + (i & 0xf); - if (*p > '9') - *p += 'A' - '9' - 1; - - write (fd, string, 7); - } - else - write (fd, "): ", 3); - write (fd, message, strlen (message)); - if (is_fatal) - write (fd, "\naborting...\n", 13); - else - write (fd, "\n", 1); - break; - } -} - -GPrintFunc -g_set_print_handler (GPrintFunc func) -{ - GPrintFunc old_print_func; - - g_mutex_lock (g_messages_lock); - old_print_func = glib_print_func; - glib_print_func = func; - g_mutex_unlock (g_messages_lock); - - return old_print_func; -} - -void -g_print (const gchar *format, - ...) -{ - va_list args; - gchar *string; - GPrintFunc local_glib_print_func; - - g_return_if_fail (format != NULL); - - va_start (args, format); - string = g_strdup_vprintf (format, args); - va_end (args); - - g_mutex_lock (g_messages_lock); - local_glib_print_func = glib_print_func; - g_mutex_unlock (g_messages_lock); - - if (local_glib_print_func) - local_glib_print_func (string); - else - { - ensure_stdout_valid (); - fputs (string, stdout); - fflush (stdout); - } - g_free (string); -} - -GPrintFunc -g_set_printerr_handler (GPrintFunc func) -{ - GPrintFunc old_printerr_func; - - g_mutex_lock (g_messages_lock); - old_printerr_func = glib_printerr_func; - glib_printerr_func = func; - g_mutex_unlock (g_messages_lock); - - return old_printerr_func; -} - -void -g_printerr (const gchar *format, - ...) -{ - va_list args; - gchar *string; - GPrintFunc local_glib_printerr_func; - - g_return_if_fail (format != NULL); - - va_start (args, format); - string = g_strdup_vprintf (format, args); - va_end (args); - - g_mutex_lock (g_messages_lock); - local_glib_printerr_func = glib_printerr_func; - g_mutex_unlock (g_messages_lock); - - if (local_glib_printerr_func) - local_glib_printerr_func (string); - else - { - fputs (string, stderr); - fflush (stderr); - } - g_free (string); -} - -/* compatibility code */ -GErrorFunc -g_set_error_handler (GErrorFunc func) -{ - GErrorFunc old_error_func; - - g_mutex_lock (g_messages_lock); - old_error_func = glib_error_func; - glib_error_func = func; - g_mutex_unlock (g_messages_lock); - - return old_error_func; -} - -/* compatibility code */ -GWarningFunc -g_set_warning_handler (GWarningFunc func) -{ - GWarningFunc old_warning_func; - - g_mutex_lock (g_messages_lock); - old_warning_func = glib_warning_func; - glib_warning_func = func; - g_mutex_unlock (g_messages_lock); - - return old_warning_func; -} - -/* compatibility code */ -GPrintFunc -g_set_message_handler (GPrintFunc func) -{ - GPrintFunc old_message_func; - - g_mutex_lock (g_messages_lock); - old_message_func = glib_message_func; - glib_message_func = func; - g_mutex_unlock (g_messages_lock); - - return old_message_func; -} - -#ifndef MB_LEN_MAX -# define MB_LEN_MAX 8 -#endif - -typedef struct -{ - guint min_width; - guint precision; - gboolean alternate_format, zero_padding, adjust_left, locale_grouping; - gboolean add_space, add_sign, possible_sign, seen_precision; - gboolean mod_half, mod_long, mod_extra_long; -} PrintfArgSpec; - -static gsize -printf_string_upper_bound (const gchar *format, - gboolean may_warn, - va_list args) -{ - static const gboolean honour_longs = SIZEOF_LONG > 4 || SIZEOF_VOID_P > 4; - gsize len = 1; - - if (!format) - return len; - - while (*format) - { - register gchar c = *format++; - - if (c != '%') - len += 1; - else /* (c == '%') */ - { - PrintfArgSpec spec = { 0, }; - gboolean seen_l = FALSE, conv_done = FALSE; - gsize conv_len = 0; - const gchar *spec_start = format; - - do - { - c = *format++; - switch (c) - { - GDoubleIEEE754 u_double; - guint v_uint; - gint v_int; - const gchar *v_string; - - /* beware of positional parameters - */ - case '$': - if (may_warn) - g_warning (G_GNUC_PRETTY_FUNCTION - "(): unable to handle positional parameters (%%n$)"); - len += 1024; /* try adding some safety padding */ - break; - - /* parse flags - */ - case '#': - spec.alternate_format = TRUE; - break; - case '0': - spec.zero_padding = TRUE; - break; - case '-': - spec.adjust_left = TRUE; - break; - case ' ': - spec.add_space = TRUE; - break; - case '+': - spec.add_sign = TRUE; - break; - case '\'': - spec.locale_grouping = TRUE; - break; - - /* parse output size specifications - */ - case '.': - spec.seen_precision = TRUE; - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - v_uint = c - '0'; - c = *format; - while (c >= '0' && c <= '9') - { - format++; - v_uint = v_uint * 10 + c - '0'; - c = *format; - } - if (spec.seen_precision) - spec.precision = MAX (spec.precision, v_uint); - else - spec.min_width = MAX (spec.min_width, v_uint); - break; - case '*': - v_int = va_arg (args, int); - if (spec.seen_precision) - { - /* forget about negative precision */ - if (v_int >= 0) - spec.precision = MAX (spec.precision, v_int); - } - else - { - if (v_int < 0) - { - v_int = - v_int; - spec.adjust_left = TRUE; - } - spec.min_width = MAX (spec.min_width, v_int); - } - break; - - /* parse type modifiers - */ - case 'h': - spec.mod_half = TRUE; - break; - case 'l': - if (!seen_l) - { - spec.mod_long = TRUE; - seen_l = TRUE; - break; - } - /* else, fall through */ - case 'L': - case 'q': - spec.mod_long = TRUE; - spec.mod_extra_long = TRUE; - break; - case 'z': - case 'Z': -#if GLIB_SIZEOF_SIZE_T > 4 - spec.mod_long = TRUE; - spec.mod_extra_long = TRUE; -#endif /* GLIB_SIZEOF_SIZE_T > 4 */ - break; - case 't': -#if GLIB_SIZEOF_PTRDIFF_T > 4 - spec.mod_long = TRUE; - spec.mod_extra_long = TRUE; -#endif /* GLIB_SIZEOF_PTRDIFF_T > 4 */ - break; - case 'j': -#if GLIB_SIZEOF_INTMAX_T > 4 - spec.mod_long = TRUE; - spec.mod_extra_long = TRUE; -#endif /* GLIB_SIZEOF_INTMAX_T > 4 */ - break; - - /* parse output conversions - */ - case '%': - conv_len += 1; - break; - case 'O': - case 'D': - case 'I': - case 'U': - /* some C libraries feature long variants for these as well? */ - spec.mod_long = TRUE; - /* fall through */ - case 'o': - conv_len += 2; - /* fall through */ - case 'd': - case 'i': - conv_len += 1; /* sign */ - /* fall through */ - case 'u': - conv_len += 4; - /* fall through */ - case 'x': - case 'X': - spec.possible_sign = TRUE; - conv_len += 10; - if (spec.mod_long && honour_longs) - conv_len *= 2; - if (spec.mod_extra_long) - conv_len *= 2; - if (spec.mod_extra_long) - { -#ifdef G_HAVE_GINT64 - (void) va_arg (args, gint64); -#else /* !G_HAVE_GINT64 */ - (void) va_arg (args, long); -#endif /* !G_HAVE_GINT64 */ - } - else if (spec.mod_long) - (void) va_arg (args, long); - else - (void) va_arg (args, int); - break; - case 'A': - case 'a': - /* 0x */ - conv_len += 2; - /* fall through */ - case 'g': - case 'G': - case 'e': - case 'E': - case 'f': - spec.possible_sign = TRUE; - /* n . dddddddddddddddddddddddd E +- eeee */ - conv_len += 1 + 1 + MAX (24, spec.precision) + 1 + 1 + 4; - if (may_warn && spec.mod_extra_long) - g_warning (G_GNUC_PRETTY_FUNCTION - "(): unable to handle long double, collecting double only"); -#ifdef HAVE_LONG_DOUBLE -#error need to implement special handling for long double -#endif - u_double.v_double = va_arg (args, double); - /* %f can expand up to all significant digits before '.' (308) */ - if (c == 'f' && - u_double.mpn.biased_exponent > 0 && u_double.mpn.biased_exponent < 2047) - { - gint exp = u_double.mpn.biased_exponent; - - exp -= G_IEEE754_DOUBLE_BIAS; - exp = exp * G_LOG_2_BASE_10 + 1; - conv_len += exp; - } - /* some printf() implementations require extra padding for rounding */ - conv_len += 2; - /* we can't really handle locale specific grouping here */ - if (spec.locale_grouping) - conv_len *= 2; - break; - case 'C': - spec.mod_long = TRUE; - /* fall through */ - case 'c': - conv_len += spec.mod_long ? MB_LEN_MAX : 1; - (void) va_arg (args, int); - break; - case 'S': - spec.mod_long = TRUE; - /* fall through */ - case 's': - v_string = va_arg (args, char*); - if (!v_string) - conv_len += 8; /* hold "(null)" */ - else if (spec.seen_precision) - conv_len += spec.precision; - else - conv_len += strlen (v_string); - conv_done = TRUE; - if (spec.mod_long) - { - if (may_warn) - g_warning (G_GNUC_PRETTY_FUNCTION - "(): unable to handle wide char strings"); - len += 1024; /* try adding some safety padding */ - } - break; - case 'P': /* do we actually need this? */ - /* fall through */ - case 'p': - spec.alternate_format = TRUE; - conv_len += 10; - if (honour_longs) - conv_len *= 2; - /* fall through */ - case 'n': - conv_done = TRUE; - (void) va_arg (args, void*); - break; - case 'm': - /* there's not much we can do to be clever */ - v_string = g_strerror (errno); - v_uint = v_string ? strlen (v_string) : 0; - conv_len += MAX (256, v_uint); - break; - - /* handle invalid cases - */ - case '\000': - /* no conversion specification, bad bad */ - conv_len += format - spec_start; - break; - default: - if (may_warn) - g_warning (G_GNUC_PRETTY_FUNCTION - "(): unable to handle `%c' while parsing format", - c); - break; - } - conv_done |= conv_len > 0; - } - while (!conv_done); - /* handle width specifications */ - conv_len = MAX (conv_len, MAX (spec.precision, spec.min_width)); - /* handle flags */ - conv_len += spec.alternate_format ? 2 : 0; - conv_len += (spec.add_space || spec.add_sign || spec.possible_sign); - /* finally done */ - len += conv_len; - } /* else (c == '%') */ - } /* while (*format) */ - - return len; -} - -gsize -g_printf_string_upper_bound (const gchar *format, - va_list args) -{ - return printf_string_upper_bound (format, TRUE, args); -} - -void -g_messages_init (void) -{ - g_messages_lock = g_mutex_new(); - g_log_depth = g_private_new(NULL); -} diff --git a/gmessages.h b/gmessages.h deleted file mode 100644 index 5657604c..00000000 --- a/gmessages.h +++ /dev/null @@ -1,341 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_MESSAGES_H__ -#define __G_MESSAGES_H__ - -#include -#include - -G_BEGIN_DECLS - -/* calculate a string size, guarranteed to fit format + args. - */ -gsize g_printf_string_upper_bound (const gchar* format, - va_list args); - -/* Log level shift offset for user defined - * log levels (0-7 are used by GLib). - */ -#define G_LOG_LEVEL_USER_SHIFT (8) - -/* Glib log levels and flags. - */ -typedef enum -{ - /* log flags */ - G_LOG_FLAG_RECURSION = 1 << 0, - G_LOG_FLAG_FATAL = 1 << 1, - - /* GLib log levels */ - G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */ - G_LOG_LEVEL_CRITICAL = 1 << 3, - G_LOG_LEVEL_WARNING = 1 << 4, - G_LOG_LEVEL_MESSAGE = 1 << 5, - G_LOG_LEVEL_INFO = 1 << 6, - G_LOG_LEVEL_DEBUG = 1 << 7, - - G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL) -} GLogLevelFlags; - -/* GLib log levels that are considered fatal by default */ -#define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR) - -typedef void (*GLogFunc) (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message, - gpointer user_data); - -/* Logging mechanism - */ -GLIB_VAR const gchar *g_log_domain_glib; -guint g_log_set_handler (const gchar *log_domain, - GLogLevelFlags log_levels, - GLogFunc log_func, - gpointer user_data); -void g_log_remove_handler (const gchar *log_domain, - guint handler_id); -void g_log_default_handler (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message, - gpointer unused_data); -void g_log (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *format, - ...) G_GNUC_PRINTF (3, 4); -void g_logv (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *format, - va_list args); -GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain, - GLogLevelFlags fatal_mask); -GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask); - -#ifndef G_LOG_DOMAIN -#define G_LOG_DOMAIN ((gchar*) 0) -#endif /* G_LOG_DOMAIN */ -#ifdef G_HAVE_ISO_VARARGS -#define g_error(...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - __VA_ARGS__) -#define g_message(...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_MESSAGE, \ - __VA_ARGS__) -#define g_critical(...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - __VA_ARGS__) -#define g_warning(...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_WARNING, \ - __VA_ARGS__) -#elif defined(G_HAVE_GNUC_VARARGS) -#define g_error(format...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - format) -#define g_message(format...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_MESSAGE, \ - format) -#define g_critical(format...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - format) -#define g_warning(format...) g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_WARNING, \ - format) -#else /* no varargs macros */ -static void -g_error (const gchar *format, - ...) -{ - va_list args; - va_start (args, format); - g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args); - va_end (args); -} -static void -g_message (const gchar *format, - ...) -{ - va_list args; - va_start (args, format); - g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args); - va_end (args); -} -static void -g_critical (const gchar *format, - ...) -{ - va_list args; - va_start (args, format); - g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args); - va_end (args); -} -static void -g_warning (const gchar *format, - ...) -{ - va_list args; - va_start (args, format); - g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args); - va_end (args); -} -#endif /* !__GNUC__ */ - -typedef void (*GPrintFunc) (const gchar *string); -void g_print (const gchar *format, - ...) G_GNUC_PRINTF (1, 2); -GPrintFunc g_set_print_handler (GPrintFunc func); -void g_printerr (const gchar *format, - ...) G_GNUC_PRINTF (1, 2); -GPrintFunc g_set_printerr_handler (GPrintFunc func); - -/* deprecated compatibility functions, use g_log_set_handler() instead */ -typedef void (*GErrorFunc) (const gchar *str); -typedef void (*GWarningFunc) (const gchar *str); -GErrorFunc g_set_error_handler (GErrorFunc func); -GWarningFunc g_set_warning_handler (GWarningFunc func); -GPrintFunc g_set_message_handler (GPrintFunc func); - -/* Provide macros for error handling. The "assert" macros will - * exit on failure. The "return" macros will exit the current - * function. Two different definitions are given for the macros - * if G_DISABLE_ASSERT is not defined, in order to support gcc's - * __PRETTY_FUNCTION__ capability. - */ - -#ifdef G_DISABLE_ASSERT - -#define g_assert(expr) -#define g_assert_not_reached() - -#else /* !G_DISABLE_ASSERT */ - -#ifdef __GNUC__ - -#define g_assert(expr) G_STMT_START{ \ - if (!(expr)) \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - "file %s: line %d (%s): assertion failed: (%s)", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); }G_STMT_END - -#define g_assert_not_reached() G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - "file %s: line %d (%s): should not be reached", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__); }G_STMT_END - -#else /* !__GNUC__ */ - -#define g_assert(expr) G_STMT_START{ \ - if (!(expr)) \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - "file %s: line %d: assertion failed: (%s)", \ - __FILE__, \ - __LINE__, \ - #expr); }G_STMT_END - -#define g_assert_not_reached() G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_ERROR, \ - "file %s: line %d: should not be reached", \ - __FILE__, \ - __LINE__); }G_STMT_END - -#endif /* __GNUC__ */ - -#endif /* !G_DISABLE_ASSERT */ - - -#ifdef G_DISABLE_CHECKS - -#define g_return_if_fail(expr) -#define g_return_val_if_fail(expr,val) -#define g_return_if_reached() return -#define g_return_val_if_reached(val) return (val) - -#else /* !G_DISABLE_CHECKS */ - -#ifdef __GNUC__ - -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d (%s): assertion `%s' failed", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return; \ - }; }G_STMT_END - -#define g_return_val_if_fail(expr,val) G_STMT_START{ \ - if (!(expr)) \ - { \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d (%s): assertion `%s' failed", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return (val); \ - }; }G_STMT_END - -#define g_return_if_reached() G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d (%s): should not be reached", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__); \ - return; }G_STMT_END - -#define g_return_val_if_reached(val) G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d (%s): should not be reached", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__); \ - return (val); }G_STMT_END - -#else /* !__GNUC__ */ - -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d: assertion `%s' failed", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return; \ - }; }G_STMT_END - -#define g_return_val_if_fail(expr, val) G_STMT_START{ \ - if (!(expr)) \ - { \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d: assertion `%s' failed", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return (val); \ - }; }G_STMT_END - -#define g_return_if_reached() G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d: should not be reached", \ - __FILE__, \ - __LINE__); \ - return; }G_STMT_END - -#define g_return_val_if_reached(val) G_STMT_START{ \ - g_log (G_LOG_DOMAIN, \ - G_LOG_LEVEL_CRITICAL, \ - "file %s: line %d: should not be reached", \ - __FILE__, \ - __LINE__); \ - return (val); }G_STMT_END - -#endif /* !__GNUC__ */ - -#endif /* !G_DISABLE_CHECKS */ - -G_END_DECLS - -#endif /* __G_MESSAGES_H__ */ - diff --git a/gmodule/Makefile.am b/gmodule/Makefile.am index 95f43d25..faa8d1d2 100644 --- a/gmodule/Makefile.am +++ b/gmodule/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/gmodule \ +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gmodule \ -DG_LOG_DOMAIN=\"GModule\" @GLIB_DEBUG_FLAGS@ EXTRA_DIST = \ @@ -28,7 +28,7 @@ glibincludedir=$(includedir)/glib-2.0 glibinclude_HEADERS = \ gmodule.h -libglib = $(top_builddir)/libglib-1.3.la +libglib = $(top_builddir)/glib/libglib-1.3.la top_builddir_full=`cd \$(top_builddir); pwd` diff --git a/gnode.c b/gnode.c deleted file mode 100644 index 77143a8c..00000000 --- a/gnode.c +++ /dev/null @@ -1,1064 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GNode: N-way tree implementation. - * Copyright (C) 1998 Tim Janik - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - -#ifndef DISABLE_MEM_POOLS -/* node allocation - */ -struct _GAllocator /* from gmem.c */ -{ - gchar *name; - guint16 n_preallocs; - guint is_unused : 1; - guint type : 4; - GAllocator *last; - GMemChunk *mem_chunk; - GNode *free_nodes; /* implementation specific */ -}; - -G_LOCK_DEFINE_STATIC (current_allocator); -static GAllocator *current_allocator = NULL; - -/* HOLDS: current_allocator_lock */ -static void -g_node_validate_allocator (GAllocator *allocator) -{ - g_return_if_fail (allocator != NULL); - g_return_if_fail (allocator->is_unused == TRUE); - - if (allocator->type != G_ALLOCATOR_NODE) - { - allocator->type = G_ALLOCATOR_NODE; - if (allocator->mem_chunk) - { - g_mem_chunk_destroy (allocator->mem_chunk); - allocator->mem_chunk = NULL; - } - } - - if (!allocator->mem_chunk) - { - allocator->mem_chunk = g_mem_chunk_new (allocator->name, - sizeof (GNode), - sizeof (GNode) * allocator->n_preallocs, - G_ALLOC_ONLY); - allocator->free_nodes = NULL; - } - - allocator->is_unused = FALSE; -} - -void -g_node_push_allocator (GAllocator *allocator) -{ - G_LOCK (current_allocator); - g_node_validate_allocator (allocator); - allocator->last = current_allocator; - current_allocator = allocator; - G_UNLOCK (current_allocator); -} - -void -g_node_pop_allocator (void) -{ - G_LOCK (current_allocator); - if (current_allocator) - { - GAllocator *allocator; - - allocator = current_allocator; - current_allocator = allocator->last; - allocator->last = NULL; - allocator->is_unused = TRUE; - } - G_UNLOCK (current_allocator); -} - - -/* --- functions --- */ -GNode* -g_node_new (gpointer data) -{ - GNode *node; - - G_LOCK (current_allocator); - if (!current_allocator) - { - GAllocator *allocator = g_allocator_new ("GLib default GNode allocator", - 128); - g_node_validate_allocator (allocator); - allocator->last = NULL; - current_allocator = allocator; - } - if (!current_allocator->free_nodes) - node = g_chunk_new (GNode, current_allocator->mem_chunk); - else - { - node = current_allocator->free_nodes; - current_allocator->free_nodes = node->next; - } - G_UNLOCK (current_allocator); - - node->data = data; - node->next = NULL; - node->prev = NULL; - node->parent = NULL; - node->children = NULL; - - return node; -} - -static void -g_nodes_free (GNode *node) -{ - GNode *parent; - - parent = node; - while (1) - { - if (parent->children) - g_nodes_free (parent->children); - -#ifdef ENABLE_GC_FRIENDLY - parent->data = NULL; - parent->prev = NULL; - parent->parent = NULL; - parent->children = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - if (parent->next) - parent = parent->next; - else - break; - } - - G_LOCK (current_allocator); - parent->next = current_allocator->free_nodes; - current_allocator->free_nodes = node; - G_UNLOCK (current_allocator); -} -#else /* DISABLE_MEM_POOLS */ - -GNode* -g_node_new (gpointer data) -{ - GNode *node; - - node = g_new0 (GNode, 1); - - node->data = data; - - return node; -} - -static void -g_nodes_free (GNode *root) -{ - GNode *node, *next; - - node = root; - while (node != NULL) - { - next = node->next; - g_nodes_free (node->children); - g_free (node); - node = next; - } -} -#endif - -void -g_node_destroy (GNode *root) -{ - g_return_if_fail (root != NULL); - - if (!G_NODE_IS_ROOT (root)) - g_node_unlink (root); - - g_nodes_free (root); -} - -void -g_node_unlink (GNode *node) -{ - g_return_if_fail (node != NULL); - - if (node->prev) - node->prev->next = node->next; - else if (node->parent) - node->parent->children = node->next; - node->parent = NULL; - if (node->next) - { - node->next->prev = node->prev; - node->next = NULL; - } - node->prev = NULL; -} - -GNode* -g_node_copy (GNode *node) -{ - GNode *new_node = NULL; - - if (node) - { - GNode *child; - - new_node = g_node_new (node->data); - - for (child = g_node_last_child (node); child; child = child->prev) - g_node_prepend (new_node, g_node_copy (child)); - } - - return new_node; -} - -GNode* -g_node_insert (GNode *parent, - gint position, - GNode *node) -{ - g_return_val_if_fail (parent != NULL, node); - g_return_val_if_fail (node != NULL, node); - g_return_val_if_fail (G_NODE_IS_ROOT (node), node); - - if (position > 0) - return g_node_insert_before (parent, - g_node_nth_child (parent, position), - node); - else if (position == 0) - return g_node_prepend (parent, node); - else /* if (position < 0) */ - return g_node_append (parent, node); -} - -GNode* -g_node_insert_before (GNode *parent, - GNode *sibling, - GNode *node) -{ - g_return_val_if_fail (parent != NULL, node); - g_return_val_if_fail (node != NULL, node); - g_return_val_if_fail (G_NODE_IS_ROOT (node), node); - if (sibling) - g_return_val_if_fail (sibling->parent == parent, node); - - node->parent = parent; - - if (sibling) - { - if (sibling->prev) - { - node->prev = sibling->prev; - node->prev->next = node; - node->next = sibling; - sibling->prev = node; - } - else - { - node->parent->children = node; - node->next = sibling; - sibling->prev = node; - } - } - else - { - if (parent->children) - { - sibling = parent->children; - while (sibling->next) - sibling = sibling->next; - node->prev = sibling; - sibling->next = node; - } - else - node->parent->children = node; - } - - return node; -} - -GNode* -g_node_insert_after (GNode *parent, - GNode *sibling, - GNode *node) -{ - g_return_val_if_fail (parent != NULL, node); - g_return_val_if_fail (node != NULL, node); - g_return_val_if_fail (G_NODE_IS_ROOT (node), node); - if (sibling) - g_return_val_if_fail (sibling->parent == parent, node); - - node->parent = parent; - - if (sibling) - { - if (sibling->next) - { - sibling->next->prev = node; - } - node->next = sibling->next; - node->prev = sibling; - sibling->next = node; - } - else - { - if (parent->children) - { - node->next = parent->children; - parent->children->prev = node; - } - parent->children = node; - } - - return node; -} - -GNode* -g_node_prepend (GNode *parent, - GNode *node) -{ - g_return_val_if_fail (parent != NULL, node); - - return g_node_insert_before (parent, parent->children, node); -} - -GNode* -g_node_get_root (GNode *node) -{ - g_return_val_if_fail (node != NULL, NULL); - - while (node->parent) - node = node->parent; - - return node; -} - -gboolean -g_node_is_ancestor (GNode *node, - GNode *descendant) -{ - g_return_val_if_fail (node != NULL, FALSE); - g_return_val_if_fail (descendant != NULL, FALSE); - - while (descendant) - { - if (descendant->parent == node) - return TRUE; - - descendant = descendant->parent; - } - - return FALSE; -} - -/* returns 1 for root, 2 for first level children, - * 3 for children's children... - */ -guint -g_node_depth (GNode *node) -{ - register guint depth = 0; - - while (node) - { - depth++; - node = node->parent; - } - - return depth; -} - -void -g_node_reverse_children (GNode *node) -{ - GNode *child; - GNode *last; - - g_return_if_fail (node != NULL); - - child = node->children; - last = NULL; - while (child) - { - last = child; - child = last->next; - last->next = last->prev; - last->prev = child; - } - node->children = last; -} - -guint -g_node_max_height (GNode *root) -{ - register GNode *child; - register guint max_height = 0; - - if (!root) - return 0; - - child = root->children; - while (child) - { - register guint tmp_height; - - tmp_height = g_node_max_height (child); - if (tmp_height > max_height) - max_height = tmp_height; - child = child->next; - } - - return max_height + 1; -} - -static gboolean -g_node_traverse_pre_order (GNode *node, - GTraverseFlags flags, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - GNode *child; - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - child = node->children; - while (child) - { - register GNode *current; - - current = child; - child = current->next; - if (g_node_traverse_pre_order (current, flags, func, data)) - return TRUE; - } - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_depth_traverse_pre_order (GNode *node, - GTraverseFlags flags, - guint depth, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - GNode *child; - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - depth--; - if (!depth) - return FALSE; - - child = node->children; - while (child) - { - register GNode *current; - - current = child; - child = current->next; - if (g_node_depth_traverse_pre_order (current, flags, depth, func, data)) - return TRUE; - } - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_traverse_post_order (GNode *node, - GTraverseFlags flags, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - GNode *child; - - child = node->children; - while (child) - { - register GNode *current; - - current = child; - child = current->next; - if (g_node_traverse_post_order (current, flags, func, data)) - return TRUE; - } - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_depth_traverse_post_order (GNode *node, - GTraverseFlags flags, - guint depth, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - depth--; - if (depth) - { - GNode *child; - - child = node->children; - while (child) - { - register GNode *current; - - current = child; - child = current->next; - if (g_node_depth_traverse_post_order (current, flags, depth, func, data)) - return TRUE; - } - } - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_traverse_in_order (GNode *node, - GTraverseFlags flags, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - GNode *child; - register GNode *current; - - child = node->children; - current = child; - child = current->next; - - if (g_node_traverse_in_order (current, flags, func, data)) - return TRUE; - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - while (child) - { - current = child; - child = current->next; - if (g_node_traverse_in_order (current, flags, func, data)) - return TRUE; - } - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_depth_traverse_in_order (GNode *node, - GTraverseFlags flags, - guint depth, - GNodeTraverseFunc func, - gpointer data) -{ - if (node->children) - { - depth--; - if (depth) - { - GNode *child; - register GNode *current; - - child = node->children; - current = child; - child = current->next; - - if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) - return TRUE; - - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - - while (child) - { - current = child; - child = current->next; - if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) - return TRUE; - } - } - else if ((flags & G_TRAVERSE_NON_LEAFS) && - func (node, data)) - return TRUE; - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (node, data)) - return TRUE; - - return FALSE; -} - -static gboolean -g_node_traverse_children (GNode *node, - GTraverseFlags flags, - GNodeTraverseFunc func, - gpointer data) -{ - GNode *child; - - child = node->children; - - while (child) - { - register GNode *current; - - current = child; - child = current->next; - - if (current->children) - { - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (current, data)) - return TRUE; - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (current, data)) - return TRUE; - } - - child = node->children; - - while (child) - { - register GNode *current; - - current = child; - child = current->next; - - if (current->children && - g_node_traverse_children (current, flags, func, data)) - return TRUE; - } - - return FALSE; -} - -static gboolean -g_node_depth_traverse_children (GNode *node, - GTraverseFlags flags, - guint depth, - GNodeTraverseFunc func, - gpointer data) -{ - GNode *child; - - child = node->children; - - while (child) - { - register GNode *current; - - current = child; - child = current->next; - - if (current->children) - { - if ((flags & G_TRAVERSE_NON_LEAFS) && - func (current, data)) - return TRUE; - } - else if ((flags & G_TRAVERSE_LEAFS) && - func (current, data)) - return TRUE; - } - - depth--; - if (!depth) - return FALSE; - - child = node->children; - - while (child) - { - register GNode *current; - - current = child; - child = current->next; - - if (current->children && - g_node_depth_traverse_children (current, flags, depth, func, data)) - return TRUE; - } - - return FALSE; -} - -void -g_node_traverse (GNode *root, - GTraverseType order, - GTraverseFlags flags, - gint depth, - GNodeTraverseFunc func, - gpointer data) -{ - g_return_if_fail (root != NULL); - g_return_if_fail (func != NULL); - g_return_if_fail (order <= G_LEVEL_ORDER); - g_return_if_fail (flags <= G_TRAVERSE_MASK); - g_return_if_fail (depth == -1 || depth > 0); - - switch (order) - { - case G_PRE_ORDER: - if (depth < 0) - g_node_traverse_pre_order (root, flags, func, data); - else - g_node_depth_traverse_pre_order (root, flags, depth, func, data); - break; - case G_POST_ORDER: - if (depth < 0) - g_node_traverse_post_order (root, flags, func, data); - else - g_node_depth_traverse_post_order (root, flags, depth, func, data); - break; - case G_IN_ORDER: - if (depth < 0) - g_node_traverse_in_order (root, flags, func, data); - else - g_node_depth_traverse_in_order (root, flags, depth, func, data); - break; - case G_LEVEL_ORDER: - if (root->children) - { - if (!((flags & G_TRAVERSE_NON_LEAFS) && - func (root, data))) - { - if (depth < 0) - g_node_traverse_children (root, flags, func, data); - else - { - depth--; - if (depth) - g_node_depth_traverse_children (root, flags, depth, func, data); - } - } - } - else if (flags & G_TRAVERSE_LEAFS) - func (root, data); - break; - } -} - -static gboolean -g_node_find_func (GNode *node, - gpointer data) -{ - register gpointer *d = data; - - if (*d != node->data) - return FALSE; - - *(++d) = node; - - return TRUE; -} - -GNode* -g_node_find (GNode *root, - GTraverseType order, - GTraverseFlags flags, - gpointer data) -{ - gpointer d[2]; - - g_return_val_if_fail (root != NULL, NULL); - g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL); - g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); - - d[0] = data; - d[1] = NULL; - - g_node_traverse (root, order, flags, -1, g_node_find_func, d); - - return d[1]; -} - -static void -g_node_count_func (GNode *node, - GTraverseFlags flags, - guint *n) -{ - if (node->children) - { - GNode *child; - - if (flags & G_TRAVERSE_NON_LEAFS) - (*n)++; - - child = node->children; - while (child) - { - g_node_count_func (child, flags, n); - child = child->next; - } - } - else if (flags & G_TRAVERSE_LEAFS) - (*n)++; -} - -guint -g_node_n_nodes (GNode *root, - GTraverseFlags flags) -{ - guint n = 0; - - g_return_val_if_fail (root != NULL, 0); - g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0); - - g_node_count_func (root, flags, &n); - - return n; -} - -GNode* -g_node_last_child (GNode *node) -{ - g_return_val_if_fail (node != NULL, NULL); - - node = node->children; - if (node) - while (node->next) - node = node->next; - - return node; -} - -GNode* -g_node_nth_child (GNode *node, - guint n) -{ - g_return_val_if_fail (node != NULL, NULL); - - node = node->children; - if (node) - while ((n-- > 0) && node) - node = node->next; - - return node; -} - -guint -g_node_n_children (GNode *node) -{ - guint n = 0; - - g_return_val_if_fail (node != NULL, 0); - - node = node->children; - while (node) - { - n++; - node = node->next; - } - - return n; -} - -GNode* -g_node_find_child (GNode *node, - GTraverseFlags flags, - gpointer data) -{ - g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); - - node = node->children; - while (node) - { - if (node->data == data) - { - if (G_NODE_IS_LEAF (node)) - { - if (flags & G_TRAVERSE_LEAFS) - return node; - } - else - { - if (flags & G_TRAVERSE_NON_LEAFS) - return node; - } - } - node = node->next; - } - - return NULL; -} - -gint -g_node_child_position (GNode *node, - GNode *child) -{ - register guint n = 0; - - g_return_val_if_fail (node != NULL, -1); - g_return_val_if_fail (child != NULL, -1); - g_return_val_if_fail (child->parent == node, -1); - - node = node->children; - while (node) - { - if (node == child) - return n; - n++; - node = node->next; - } - - return -1; -} - -gint -g_node_child_index (GNode *node, - gpointer data) -{ - register guint n = 0; - - g_return_val_if_fail (node != NULL, -1); - - node = node->children; - while (node) - { - if (node->data == data) - return n; - n++; - node = node->next; - } - - return -1; -} - -GNode* -g_node_first_sibling (GNode *node) -{ - g_return_val_if_fail (node != NULL, NULL); - - if (node->parent) - return node->parent->children; - - while (node->prev) - node = node->prev; - - return node; -} - -GNode* -g_node_last_sibling (GNode *node) -{ - g_return_val_if_fail (node != NULL, NULL); - - while (node->next) - node = node->next; - - return node; -} - -void -g_node_children_foreach (GNode *node, - GTraverseFlags flags, - GNodeForeachFunc func, - gpointer data) -{ - g_return_if_fail (node != NULL); - g_return_if_fail (flags <= G_TRAVERSE_MASK); - g_return_if_fail (func != NULL); - - node = node->children; - while (node) - { - register GNode *current; - - current = node; - node = current->next; - if (G_NODE_IS_LEAF (current)) - { - if (flags & G_TRAVERSE_LEAFS) - func (current, data); - } - else - { - if (flags & G_TRAVERSE_NON_LEAFS) - func (current, data); - } - } -} diff --git a/gnode.h b/gnode.h deleted file mode 100644 index c4a9c5f6..00000000 --- a/gnode.h +++ /dev/null @@ -1,163 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_NODE_H__ -#define __G_NODE_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GNode GNode; - -/* Tree traverse flags */ -typedef enum -{ - G_TRAVERSE_LEAFS = 1 << 0, - G_TRAVERSE_NON_LEAFS = 1 << 1, - G_TRAVERSE_ALL = G_TRAVERSE_LEAFS | G_TRAVERSE_NON_LEAFS, - G_TRAVERSE_MASK = 0x03 -} GTraverseFlags; - -/* Tree traverse orders */ -typedef enum -{ - G_IN_ORDER, - G_PRE_ORDER, - G_POST_ORDER, - G_LEVEL_ORDER -} GTraverseType; - -typedef gboolean (*GNodeTraverseFunc) (GNode *node, - gpointer data); -typedef void (*GNodeForeachFunc) (GNode *node, - gpointer data); - -/* N-way tree implementation - */ -struct _GNode -{ - gpointer data; - GNode *next; - GNode *prev; - GNode *parent; - GNode *children; -}; - -#define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \ - ((GNode*) (node))->prev == NULL && \ - ((GNode*) (node))->next == NULL) -#define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL) - -void g_node_push_allocator (GAllocator *allocator); -void g_node_pop_allocator (void); -GNode* g_node_new (gpointer data); -void g_node_destroy (GNode *root); -void g_node_unlink (GNode *node); -GNode* g_node_copy (GNode *node); -GNode* g_node_insert (GNode *parent, - gint position, - GNode *node); -GNode* g_node_insert_before (GNode *parent, - GNode *sibling, - GNode *node); -GNode* g_node_insert_after (GNode *parent, - GNode *sibling, - GNode *node); -GNode* g_node_prepend (GNode *parent, - GNode *node); -guint g_node_n_nodes (GNode *root, - GTraverseFlags flags); -GNode* g_node_get_root (GNode *node); -gboolean g_node_is_ancestor (GNode *node, - GNode *descendant); -guint g_node_depth (GNode *node); -GNode* g_node_find (GNode *root, - GTraverseType order, - GTraverseFlags flags, - gpointer data); - -/* convenience macros */ -#define g_node_append(parent, node) \ - g_node_insert_before ((parent), NULL, (node)) -#define g_node_insert_data(parent, position, data) \ - g_node_insert ((parent), (position), g_node_new (data)) -#define g_node_insert_data_before(parent, sibling, data) \ - g_node_insert_before ((parent), (sibling), g_node_new (data)) -#define g_node_prepend_data(parent, data) \ - g_node_prepend ((parent), g_node_new (data)) -#define g_node_append_data(parent, data) \ - g_node_insert_before ((parent), NULL, g_node_new (data)) - -/* traversal function, assumes that `node' is root - * (only traverses `node' and its subtree). - * this function is just a high level interface to - * low level traversal functions, optimized for speed. - */ -void g_node_traverse (GNode *root, - GTraverseType order, - GTraverseFlags flags, - gint max_depth, - GNodeTraverseFunc func, - gpointer data); - -/* return the maximum tree height starting with `node', this is an expensive - * operation, since we need to visit all nodes. this could be shortened by - * adding `guint height' to struct _GNode, but then again, this is not very - * often needed, and would make g_node_insert() more time consuming. - */ -guint g_node_max_height (GNode *root); - -void g_node_children_foreach (GNode *node, - GTraverseFlags flags, - GNodeForeachFunc func, - gpointer data); -void g_node_reverse_children (GNode *node); -guint g_node_n_children (GNode *node); -GNode* g_node_nth_child (GNode *node, - guint n); -GNode* g_node_last_child (GNode *node); -GNode* g_node_find_child (GNode *node, - GTraverseFlags flags, - gpointer data); -gint g_node_child_position (GNode *node, - GNode *child); -gint g_node_child_index (GNode *node, - gpointer data); - -GNode* g_node_first_sibling (GNode *node); -GNode* g_node_last_sibling (GNode *node); - -#define g_node_prev_sibling(node) ((node) ? \ - ((GNode*) (node))->prev : NULL) -#define g_node_next_sibling(node) ((node) ? \ - ((GNode*) (node))->next : NULL) -#define g_node_first_child(node) ((node) ? \ - ((GNode*) (node))->children : NULL) - -G_END_DECLS - -#endif /* __G_NODE_H__ */ diff --git a/gobject/Makefile.am b/gobject/Makefile.am index 22126089..f018ea16 100644 --- a/gobject/Makefile.am +++ b/gobject/Makefile.am @@ -6,12 +6,13 @@ INCLUDES = @STRIP_BEGIN@ \ -DG_LOG_DOMAIN=g_log_domain_gruntime \ -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ -I$(top_builddir) \ @GLIB_DEBUG_FLAGS@ \ -DG_DISABLE_CONST_RETURNS \ @STRIP_END@ -libglib = $(top_builddir)/libglib-1.3.la +libglib = $(top_builddir)/glib/libglib-1.3.la # libraries to compile and install lib_LTLIBRARIES = libgobject-1.3.la diff --git a/gpattern.c b/gpattern.c deleted file mode 100644 index a149273a..00000000 --- a/gpattern.c +++ /dev/null @@ -1,300 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#include "gpattern.h" - -#include "gmacros.h" -#include "gmessages.h" -#include "gmem.h" -#include "gutils.h" /* inline hassle */ -#include - - -/* --- functions --- */ -static inline gboolean -g_pattern_ph_match (const gchar *match_pattern, - const gchar *match_string) -{ - register const gchar *pattern, *string; - register gchar ch; - - pattern = match_pattern; - string = match_string; - - ch = *pattern; - pattern++; - while (ch) - { - switch (ch) - { - case '?': - if (!*string) - return FALSE; - string++; - break; - - case '*': - do - { - ch = *pattern; - pattern++; - if (ch == '?') - { - if (!*string) - return FALSE; - string++; - } - } - while (ch == '*' || ch == '?'); - if (!ch) - return TRUE; - do - { - while (ch != *string) - { - if (!*string) - return FALSE; - string++; - } - string++; - if (g_pattern_ph_match (pattern, string)) - return TRUE; - } - while (*string); - break; - - default: - if (ch == *string) - string++; - else - return FALSE; - break; - } - - ch = *pattern; - pattern++; - } - - return *string == 0; -} - -gboolean -g_pattern_match (GPatternSpec *pspec, - guint string_length, - const gchar *string, - const gchar *string_reversed) -{ - g_return_val_if_fail (pspec != NULL, FALSE); - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (string_reversed != NULL, FALSE); - - switch (pspec->match_type) - { - case G_MATCH_ALL: - return g_pattern_ph_match (pspec->pattern, string); - - case G_MATCH_ALL_TAIL: - return g_pattern_ph_match (pspec->pattern_reversed, string_reversed); - - case G_MATCH_HEAD: - if (pspec->pattern_length > string_length) - return FALSE; - else if (pspec->pattern_length == string_length) - return strcmp (pspec->pattern, string) == 0; - else if (pspec->pattern_length) - return strncmp (pspec->pattern, string, pspec->pattern_length) == 0; - else - return TRUE; - - case G_MATCH_TAIL: - if (pspec->pattern_length > string_length) - return FALSE; - else if (pspec->pattern_length == string_length) - return strcmp (pspec->pattern_reversed, string_reversed) == 0; - else if (pspec->pattern_length) - return strncmp (pspec->pattern_reversed, - string_reversed, - pspec->pattern_length) == 0; - else - return TRUE; - - case G_MATCH_EXACT: - if (pspec->pattern_length != string_length) - return FALSE; - else - return strcmp (pspec->pattern_reversed, string_reversed) == 0; - - default: - g_return_val_if_fail (pspec->match_type < G_MATCH_LAST, FALSE); - return FALSE; - } -} - -GPatternSpec* -g_pattern_spec_new (const gchar *pattern) -{ - GPatternSpec *pspec; - gchar *p, *t; - const gchar *h; - guint hw = 0, tw = 0, hj = 0, tj = 0; - - g_return_val_if_fail (pattern != NULL, NULL); - - pspec = g_new (GPatternSpec, 1); - pspec->pattern_length = strlen (pattern); - pspec->pattern = strcpy (g_new (gchar, pspec->pattern_length + 1), pattern); - pspec->pattern_reversed = g_new (gchar, pspec->pattern_length + 1); - t = pspec->pattern_reversed + pspec->pattern_length; - *(t--) = 0; - h = pattern; - while (t >= pspec->pattern_reversed) - { - register gchar c = *(h++); - - if (c == '*') - { - if (t < h) - hw++; - else - tw++; - } - else if (c == '?') - { - if (t < h) - hj++; - else - tj++; - } - - *(t--) = c; - } - pspec->match_type = hw > tw || (hw == tw && hj > tj) ? G_MATCH_ALL_TAIL : G_MATCH_ALL; - - if (hj || tj) - return pspec; - - if (hw == 0 && tw == 0) - { - pspec->match_type = G_MATCH_EXACT; - return pspec; - } - - if (hw) - { - p = pspec->pattern; - while (*p == '*') - p++; - if (p > pspec->pattern && !strchr (p, '*')) - { - gchar *tmp; - - pspec->match_type = G_MATCH_TAIL; - pspec->pattern_length = strlen (p); - tmp = pspec->pattern; - pspec->pattern = strcpy (g_new (gchar, pspec->pattern_length + 1), p); - g_free (tmp); - g_free (pspec->pattern_reversed); - pspec->pattern_reversed = g_new (gchar, pspec->pattern_length + 1); - t = pspec->pattern_reversed + pspec->pattern_length; - *(t--) = 0; - h = pspec->pattern; - while (t >= pspec->pattern_reversed) - *(t--) = *(h++); - return pspec; - } - } - - if (tw) - { - p = pspec->pattern_reversed; - while (*p == '*') - p++; - if (p > pspec->pattern_reversed && !strchr (p, '*')) - { - gchar *tmp; - - pspec->match_type = G_MATCH_HEAD; - pspec->pattern_length = strlen (p); - tmp = pspec->pattern_reversed; - pspec->pattern_reversed = strcpy (g_new (gchar, pspec->pattern_length + 1), p); - g_free (tmp); - g_free (pspec->pattern); - pspec->pattern = g_new (gchar, pspec->pattern_length + 1); - t = pspec->pattern + pspec->pattern_length; - *(t--) = 0; - h = pspec->pattern_reversed; - while (t >= pspec->pattern) - *(t--) = *(h++); - } - } - - return pspec; -} - -gboolean -g_pattern_match_string (GPatternSpec *pspec, - const gchar *string) -{ - gchar *string_reversed, *t; - const gchar *h; - guint length; - gboolean ergo; - - g_return_val_if_fail (pspec != NULL, FALSE); - g_return_val_if_fail (string != NULL, FALSE); - - length = strlen (string); - string_reversed = g_new (gchar, length + 1); - t = string_reversed + length; - *(t--) = 0; - h = string; - while (t >= string_reversed) - *(t--) = *(h++); - - ergo = g_pattern_match (pspec, length, string, string_reversed); - g_free (string_reversed); - - return ergo; -} - -gboolean -g_pattern_match_simple (const gchar *pattern, - const gchar *string) -{ - GPatternSpec *pspec; - gboolean ergo; - - g_return_val_if_fail (pattern != NULL, FALSE); - g_return_val_if_fail (string != NULL, FALSE); - - pspec = g_pattern_spec_new (pattern); - ergo = g_pattern_match_string (pspec, string); - g_pattern_spec_free (pspec); - - return ergo; -} - -void -g_pattern_spec_free (GPatternSpec *pspec) -{ - g_return_if_fail (pspec != NULL); - - g_free (pspec->pattern); - g_free (pspec->pattern_reversed); - g_free (pspec); -} diff --git a/gpattern.h b/gpattern.h deleted file mode 100644 index add239c6..00000000 --- a/gpattern.h +++ /dev/null @@ -1,58 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __G_PATTERN_H__ -#define __G_PATTERN_H__ - -#include - -G_BEGIN_DECLS - -typedef enum -{ - G_MATCH_ALL, /* "*A?A*" */ - G_MATCH_ALL_TAIL, /* "*A?AA" */ - G_MATCH_HEAD, /* "AAAA*" */ - G_MATCH_TAIL, /* "*AAAA" */ - G_MATCH_EXACT, /* "AAAAA" */ - G_MATCH_LAST -} GMatchType; - -typedef struct _GPatternSpec GPatternSpec; -struct _GPatternSpec -{ - GMatchType match_type; - guint pattern_length; - gchar *pattern; - gchar *pattern_reversed; -}; - -GPatternSpec* g_pattern_spec_new (const gchar *pattern); -void g_pattern_spec_free (GPatternSpec *pspec); -gboolean g_pattern_match (GPatternSpec *pspec, - guint string_length, - const gchar *string, - const gchar *string_reversed); -gboolean g_pattern_match_string (GPatternSpec *pspec, - const gchar *string); -gboolean g_pattern_match_simple (const gchar *pattern, - const gchar *string); - -G_END_DECLS - -#endif /* __G_PATTERN_H__ */ diff --git a/gprimes.c b/gprimes.c deleted file mode 100644 index 0d63bb76..00000000 --- a/gprimes.c +++ /dev/null @@ -1,83 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" - -static const guint g_primes[] = -{ - 11, - 19, - 37, - 73, - 109, - 163, - 251, - 367, - 557, - 823, - 1237, - 1861, - 2777, - 4177, - 6247, - 9371, - 14057, - 21089, - 31627, - 47431, - 71143, - 106721, - 160073, - 240101, - 360163, - 540217, - 810343, - 1215497, - 1823231, - 2734867, - 4102283, - 6153409, - 9230113, - 13845163, -}; - -static const guint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]); - -guint -g_spaced_primes_closest (guint num) -{ - gint i; - - for (i = 0; i < g_nprimes; i++) - if (g_primes[i] > num) - return g_primes[i]; - - return g_primes[g_nprimes - 1]; -} diff --git a/gprimes.h b/gprimes.h deleted file mode 100644 index daa1598c..00000000 --- a/gprimes.h +++ /dev/null @@ -1,47 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_PRIMES_H__ -#define __G_PRIMES_H__ - -#include - -G_BEGIN_DECLS - -/* Prime numbers. - */ - -/* This function returns prime numbers spaced by approximately 1.5-2.0 - * and is for use in resizing data structures which prefer - * prime-valued sizes. The closest spaced prime function returns the - * next largest prime, or the highest it knows about which is about - * MAXINT/4. - */ -guint g_spaced_primes_closest (guint num) G_GNUC_CONST; - -G_END_DECLS - -#endif /* __G_PRIMES_H__ */ diff --git a/gqsort.c b/gqsort.c deleted file mode 100644 index a100735a..00000000 --- a/gqsort.c +++ /dev/null @@ -1,282 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. - * Copyright (C) 2000 Eazel, Inc. - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * This file was originally part of the GNU C Library, and was modified to allow - * user data to be passed in to the sorting function. - * - * Written by Douglas C. Schmidt (schmidt@ics.uci.edu). - * Modified by Maciej Stachowiak (mjs@eazel.com) - * - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with GLib - * at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include - -#include "glib.h" - -/* Byte-wise swap two items of size SIZE. */ -#define SWAP(a, b, size) \ - do \ - { \ - register size_t __size = (size); \ - register char *__a = (a), *__b = (b); \ - do \ - { \ - char __tmp = *__a; \ - *__a++ = *__b; \ - *__b++ = __tmp; \ - } while (--__size > 0); \ - } while (0) - -/* Discontinue quicksort algorithm when partition gets below this size. - This particular magic number was chosen to work best on a Sun 4/260. */ -#define MAX_THRESH 4 - -/* Stack node declarations used to store unfulfilled partition obligations. */ -typedef struct -{ - char *lo; - char *hi; -} -stack_node; - -/* The next 4 #defines implement a very fast in-line stack abstraction. */ -#define STACK_SIZE (8 * sizeof(unsigned long int)) -#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top)) -#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi))) -#define STACK_NOT_EMPTY (stack < top) - - -/* Order size using quicksort. This implementation incorporates - * four optimizations discussed in Sedgewick: - * - * 1. Non-recursive, using an explicit stack of pointer that store the next - * array partition to sort. To save time, this maximum amount of space - * required to store an array of MAX_INT is allocated on the stack. Assuming - * a 32-bit integer, this needs only 32 * sizeof(stack_node) == 136 bits. - * Pretty cheap, actually. - * - * 2. Chose the pivot element using a median-of-three decision tree. This - * reduces the probability of selecting a bad pivot value and eliminates - * certain * extraneous comparisons. - * - * 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving insertion - * sort to order the MAX_THRESH items within each partition. This is a big - * win, since insertion sort is faster for small, mostly sorted array - * segments. - * - * 4. The larger of the two sub-partitions is always pushed onto the stack - * first, with the algorithm then concentrating on the smaller partition. - * This *guarantees* no more than log (n) stack size is needed (actually O(1) - * in this case)! - */ - -/** - * g_qsort_with_data: - * @pbase: start of array to sort - * @total_elems: elements in the array - * @size: size of each element - * @compare_func: function to compare elements - * @user_data: data to pass to @compare_func - * - * This is just like the standard C qsort() function, but - * the comparison routine accepts a user data argument. - * - **/ -void -g_qsort_with_data (gconstpointer pbase, - gint total_elems, - size_t size, - GCompareDataFunc compare_func, - gpointer user_data) -{ - register char *base_ptr = (char *) pbase; - - /* Allocating SIZE bytes for a pivot buffer facilitates a better - * algorithm below since we can do comparisons directly on the pivot. - */ - char *pivot_buffer = (char *) alloca (size); - const size_t max_thresh = MAX_THRESH * size; - - g_return_if_fail (total_elems > 0); - g_return_if_fail (pbase != NULL); - g_return_if_fail (compare_func != NULL); - - if (total_elems > MAX_THRESH) - { - char *lo = base_ptr; - char *hi = &lo[size * (total_elems - 1)]; - /* Largest size needed for 32-bit int!!! */ - stack_node stack[STACK_SIZE]; - stack_node *top = stack + 1; - - while (STACK_NOT_EMPTY) - { - char *left_ptr; - char *right_ptr; - - char *pivot = pivot_buffer; - - /* Select median value from among LO, MID, and HI. Rearrange - * LO and HI so the three values are sorted. This lowers the - * probability of picking a pathological pivot value and - * skips a comparison for both the LEFT_PTR and RIGHT_PTR. */ - - char *mid = lo + size * ((hi - lo) / size >> 1); - - if ((*compare_func) ((void *) mid, (void *) lo, user_data) < 0) - SWAP (mid, lo, size); - if ((*compare_func) ((void *) hi, (void *) mid, user_data) < 0) - SWAP (mid, hi, size); - else - goto jump_over; - if ((*compare_func) ((void *) mid, (void *) lo, user_data) < 0) - SWAP (mid, lo, size); - jump_over:; - memcpy (pivot, mid, size); - pivot = pivot_buffer; - - left_ptr = lo + size; - right_ptr = hi - size; - - /* Here's the famous ``collapse the walls'' section of quicksort. - * Gotta like those tight inner loops! They are the main reason - * that this algorithm runs much faster than others. */ - do - { - while ((*compare_func) - ((void *) left_ptr, (void *) pivot, - user_data) < 0) - left_ptr += size; - - while ((*compare_func) - ((void *) pivot, (void *) right_ptr, - user_data) < 0) - right_ptr -= size; - - if (left_ptr < right_ptr) - { - SWAP (left_ptr, right_ptr, size); - left_ptr += size; - right_ptr -= size; - } - else if (left_ptr == right_ptr) - { - left_ptr += size; - right_ptr -= size; - break; - } - } - while (left_ptr <= right_ptr); - - /* Set up pointers for next iteration. First determine whether - * left and right partitions are below the threshold size. If so, - * ignore one or both. Otherwise, push the larger partition's - * bounds on the stack and continue sorting the smaller one. */ - - if ((size_t) (right_ptr - lo) <= max_thresh) - { - if ((size_t) (hi - left_ptr) <= max_thresh) - /* Ignore both small partitions. */ - POP (lo, hi); - else - /* Ignore small left partition. */ - lo = left_ptr; - } - else if ((size_t) (hi - left_ptr) <= max_thresh) - /* Ignore small right partition. */ - hi = right_ptr; - else if ((right_ptr - lo) > (hi - left_ptr)) - { - /* Push larger left partition indices. */ - PUSH (lo, right_ptr); - lo = left_ptr; - - } - else - { - /* Push larger right partition indices. */ - PUSH (left_ptr, hi); - hi = right_ptr; - } - } - } - - /* Once the BASE_PTR array is partially sorted by quicksort the rest - * is completely sorted using insertion sort, since this is efficient - * for partitions below MAX_THRESH size. BASE_PTR points to the beginning - * of the array to sort, and END_PTR points at the very last element in - * the array (*not* one beyond it!). */ - - { - char *const end_ptr = &base_ptr[size * (total_elems - 1)]; - char *tmp_ptr = base_ptr; - char *thresh = MIN (end_ptr, base_ptr + max_thresh); - register char *run_ptr; - - /* Find smallest element in first threshold and place it at the - * array's beginning. This is the smallest array element, - * and the operation speeds up insertion sort's inner loop. */ - - for (run_ptr = tmp_ptr + size; run_ptr <= thresh; - run_ptr += - size) if ((*compare_func) ((void *) run_ptr, (void *) tmp_ptr, - user_data) < 0) - tmp_ptr = run_ptr; - - if (tmp_ptr != base_ptr) - SWAP (tmp_ptr, base_ptr, size); - - /* Insertion sort, running from left-hand-side up to right-hand-side. */ - - run_ptr = base_ptr + size; - while ((run_ptr += size) <= end_ptr) - { - tmp_ptr = run_ptr - size; - while ((*compare_func) - ((void *) run_ptr, (void *) tmp_ptr, - user_data) < 0) - tmp_ptr -= size; - - tmp_ptr += size; - if (tmp_ptr != run_ptr) - { - char *trav; - - trav = run_ptr + size; - while (--trav >= run_ptr) - { - char c = *trav; - char *hi, *lo; - - for (hi = lo = trav; - (lo -= size) >= tmp_ptr; hi = lo) - *hi = *lo; - *hi = c; - } - } - } - } -} diff --git a/gqsort.h b/gqsort.h deleted file mode 100644 index d946e80c..00000000 --- a/gqsort.h +++ /dev/null @@ -1,44 +0,0 @@ - /* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - - -#ifndef __G_QSORT_H__ -#define __G_QSORT_H__ - -#include - -G_BEGIN_DECLS - -void g_qsort_with_data (gconstpointer pbase, - gint total_elems, - size_t size, - GCompareDataFunc compare_func, - gpointer user_data); - -G_END_DECLS - -#endif /* __G_QSORT_H__ */ - diff --git a/gquark.h b/gquark.h deleted file mode 100644 index e8756ef6..00000000 --- a/gquark.h +++ /dev/null @@ -1,46 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_QUARK_H__ -#define __G_QUARK_H__ - -#include - -G_BEGIN_DECLS - -typedef guint32 GQuark; - -/* Quarks (string<->id association) - */ -GQuark g_quark_try_string (const gchar *string); -GQuark g_quark_from_static_string (const gchar *string); -GQuark g_quark_from_string (const gchar *string); -G_CONST_RETURN gchar* g_quark_to_string (GQuark quark) G_GNUC_CONST; - -G_END_DECLS - -#endif /* __G_QUARK_H__ */ - diff --git a/gqueue.c b/gqueue.c deleted file mode 100644 index b15adb4f..00000000 --- a/gqueue.c +++ /dev/null @@ -1,263 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GQueue: Double ended queue implementation, piggy backed on GList. - * Copyright (C) 1998 Tim Janik - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - - -G_LOCK_DEFINE_STATIC (queue_memchunk); -static GMemChunk *queue_memchunk = NULL; -static GTrashStack *free_queue_nodes = NULL; - -GQueue* -g_queue_new (void) -{ - GQueue *queue; - - G_LOCK (queue_memchunk); - queue = g_trash_stack_pop (&free_queue_nodes); - - if (!queue) - { - if (!queue_memchunk) - queue_memchunk = g_mem_chunk_new ("GLib GQueue chunk", - sizeof (GNode), - sizeof (GNode) * 128, - G_ALLOC_ONLY); - queue = g_chunk_new (GQueue, queue_memchunk); - } - G_UNLOCK (queue_memchunk); - - queue->head = NULL; - queue->tail = NULL; - queue->length = 0; - - return queue; -} - -void -g_queue_free (GQueue *queue) -{ - g_return_if_fail (queue != NULL); - - g_list_free (queue->head); - -#ifdef ENABLE_GC_FRIENDLY - queue->head = NULL; - queue->tail = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (queue_memchunk); - g_trash_stack_push (&free_queue_nodes, queue); - G_UNLOCK (queue_memchunk); -} - -void -g_queue_push_head (GQueue *queue, - gpointer data) -{ - g_return_if_fail (queue != NULL); - - queue->head = g_list_prepend (queue->head, data); - if (!queue->tail) - queue->tail = queue->head; - queue->length++; -} - -void -g_queue_push_head_link (GQueue *queue, - GList *link) -{ - g_return_if_fail (queue != NULL); - g_return_if_fail (link != NULL); - g_return_if_fail (link->prev == NULL); - g_return_if_fail (link->next == NULL); - - link->next = queue->head; - if (queue->head) - queue->head->prev = link; - else - queue->tail = link; - queue->head = link; - queue->length++; -} - -void -g_queue_push_tail (GQueue *queue, - gpointer data) -{ - g_return_if_fail (queue != NULL); - - queue->tail = g_list_append (queue->tail, data); - if (queue->tail->next) - queue->tail = queue->tail->next; - else - queue->head = queue->tail; - queue->length++; -} - -void -g_queue_push_tail_link (GQueue *queue, - GList *link) -{ - g_return_if_fail (queue != NULL); - g_return_if_fail (link != NULL); - g_return_if_fail (link->prev == NULL); - g_return_if_fail (link->next == NULL); - - link->prev = queue->tail; - if (queue->tail) - queue->tail->next = link; - else - queue->head = link; - queue->tail = link; - queue->length++; -} - -gpointer -g_queue_pop_head (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - if (queue->head) - { - GList *node = queue->head; - gpointer data = node->data; - - queue->head = node->next; - if (queue->head) - queue->head->prev = NULL; - else - queue->tail = NULL; - g_list_free_1 (node); - queue->length--; - - return data; - } - - return NULL; -} - -GList* -g_queue_pop_head_link (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - if (queue->head) - { - GList *node = queue->head; - - queue->head = node->next; - if (queue->head) - { - queue->head->prev = NULL; - node->next = NULL; - } - else - queue->tail = NULL; - queue->length--; - - return node; - } - - return NULL; -} - -gpointer -g_queue_pop_tail (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - if (queue->tail) - { - GList *node = queue->tail; - gpointer data = node->data; - - queue->tail = node->prev; - if (queue->tail) - queue->tail->next = NULL; - else - queue->head = NULL; - queue->length--; - g_list_free_1 (node); - - return data; - } - - return NULL; -} - -GList* -g_queue_pop_tail_link (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - if (queue->tail) - { - GList *node = queue->tail; - - queue->tail = node->prev; - if (queue->tail) - { - queue->tail->next = NULL; - node->prev = NULL; - } - else - queue->head = NULL; - queue->length--; - - return node; - } - - return NULL; -} - -gboolean -g_queue_is_empty (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, TRUE); - - return queue->head == NULL; -} - -gpointer -g_queue_peek_head (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - return queue->head ? queue->head->data : NULL; -} - -gpointer -g_queue_peek_tail (GQueue *queue) -{ - g_return_val_if_fail (queue != NULL, NULL); - - return queue->tail ? queue->tail->data : NULL; -} diff --git a/gqueue.h b/gqueue.h deleted file mode 100644 index b71b6d61..00000000 --- a/gqueue.h +++ /dev/null @@ -1,65 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_QUEUE_H__ -#define __G_QUEUE_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GQueue GQueue; - -struct _GQueue -{ - GList *head; - GList *tail; - guint length; -}; - -/* Queues - */ -GQueue* g_queue_new (void); -void g_queue_free (GQueue *queue); -void g_queue_push_head (GQueue *queue, - gpointer data); -void g_queue_push_tail (GQueue *queue, - gpointer data); -gpointer g_queue_pop_head (GQueue *queue); -gpointer g_queue_pop_tail (GQueue *queue); -gboolean g_queue_is_empty (GQueue *queue); -gpointer g_queue_peek_head (GQueue *queue); -gpointer g_queue_peek_tail (GQueue *queue); -void g_queue_push_head_link (GQueue *queue, - GList *link); -void g_queue_push_tail_link (GQueue *queue, - GList *link); -GList* g_queue_pop_head_link (GQueue *queue); -GList* g_queue_pop_tail_link (GQueue *queue); - -G_END_DECLS - -#endif /* __G_QUEUE_H__ */ diff --git a/grand.c b/grand.c deleted file mode 100644 index 2a60e5bd..00000000 --- a/grand.c +++ /dev/null @@ -1,403 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* Originally developed and coded by Makoto Matsumoto and Takuji - * Nishimura. Please mail , if you're using - * code from this file in your own programs or libraries. - * Further information on the Mersenne Twister can be found at - * http://www.math.keio.ac.jp/~matumoto/emt.html - * This code was adapted to glib by Sebastian Wilhelmi . - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include -#include -#include - -G_LOCK_DEFINE_STATIC (global_random); -static GRand* global_random = NULL; - -/* Period parameters */ -#define N 624 -#define M 397 -#define MATRIX_A 0x9908b0df /* constant vector a */ -#define UPPER_MASK 0x80000000 /* most significant w-r bits */ -#define LOWER_MASK 0x7fffffff /* least significant r bits */ - -/* Tempering parameters */ -#define TEMPERING_MASK_B 0x9d2c5680 -#define TEMPERING_MASK_C 0xefc60000 -#define TEMPERING_SHIFT_U(y) (y >> 11) -#define TEMPERING_SHIFT_S(y) (y << 7) -#define TEMPERING_SHIFT_T(y) (y << 15) -#define TEMPERING_SHIFT_L(y) (y >> 18) - -struct _GRand -{ - guint32 mt[N]; /* the array for the state vector */ - guint mti; -}; - -/** - * g_rand_new_with_seed: - * @seed: a value to initialize the random number generator. - * - * Creates a new random number generator initialized with @seed. - * - * Return value: the new #GRand. - **/ -GRand* -g_rand_new_with_seed (guint32 seed) -{ - GRand *rand = g_new0 (GRand, 1); - g_rand_set_seed (rand, seed); - return rand; -} - -/** - * g_rand_new: - * - * Creates a new random number generator initialized with a seed taken - * either from /dev/urandom (if existing) or from the current time (as - * a fallback). - * - * Return value: the new #GRand. - **/ -GRand* -g_rand_new (void) -{ - guint32 seed; - GTimeVal now; - static gboolean dev_urandom_exists = TRUE; - - if (dev_urandom_exists) - { - FILE* dev_urandom = fopen("/dev/urandom", "rb"); - if (dev_urandom) - { - if (fread (&seed, sizeof (seed), 1, dev_urandom) != 1) - dev_urandom_exists = FALSE; - fclose (dev_urandom); - } - else - dev_urandom_exists = FALSE; - } - if (!dev_urandom_exists) - { - g_get_current_time (&now); - seed = now.tv_sec ^ now.tv_usec; - } - - return g_rand_new_with_seed (seed); -} - -/** - * g_rand_free: - * @rand: a #GRand. - * - * Frees the memory allocated for the #GRand. - **/ -void -g_rand_free (GRand* rand) -{ - g_return_if_fail (rand != NULL); - - g_free (rand); -} - -/** - * g_rand_set_seed: - * @rand: a #GRand. - * @seed: a value to reinitialize the random number generator. - * - * Sets the seed for the random number generator #GRand to @seed. - **/ -void -g_rand_set_seed (GRand* rand, guint32 seed) -{ - g_return_if_fail (rand != NULL); - - /* setting initial seeds to mt[N] using */ - /* the generator Line 25 of Table 1 in */ - /* [KNUTH 1981, The Art of Computer Programming */ - /* Vol. 2 (2nd Ed.), pp102] */ - - if (seed == 0) /* This would make the PRNG procude only zeros */ - seed = 0x6b842128; /* Just set it to another number */ - - rand->mt[0]= seed & 0xffffffff; - for (rand->mti=1; rand->mtimti++) - rand->mt[rand->mti] = (69069 * rand->mt[rand->mti-1]) & 0xffffffff; -} - -/** - * g_rand_int: - * @rand: a #GRand. - * - * Return the next random #guint32 from @rand equaly distributed over - * the range [0..2^32-1]. - * - * Return value: A random number. - **/ -guint32 -g_rand_int (GRand* rand) -{ - guint32 y; - static const guint32 mag01[2]={0x0, MATRIX_A}; - /* mag01[x] = x * MATRIX_A for x=0,1 */ - - g_return_val_if_fail (rand != NULL, 0); - - if (rand->mti >= N) { /* generate N words at one time */ - int kk; - - for (kk=0;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); - rand->mt[kk] = rand->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1]; - } - for (;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); - rand->mt[kk] = rand->mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1]; - } - y = (rand->mt[N-1]&UPPER_MASK)|(rand->mt[0]&LOWER_MASK); - rand->mt[N-1] = rand->mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1]; - - rand->mti = 0; - } - - y = rand->mt[rand->mti++]; - y ^= TEMPERING_SHIFT_U(y); - y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B; - y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C; - y ^= TEMPERING_SHIFT_L(y); - - return y; -} - -/* transform [0..2^32] -> [0..1] */ -#define G_RAND_DOUBLE_TRANSFORM 2.3283064365386962890625e-10 - -/** - * g_rand_int_range: - * @rand: a #GRand. - * @begin: lower closed bound of the interval. - * @end: upper open bound of the interval. - * - * Return the next random #gint32 from @rand equaly distributed over - * the range [@begin..@end-1]. - * - * Return value: A random number. - **/ -gint32 -g_rand_int_range (GRand* rand, gint32 begin, gint32 end) -{ - guint32 dist = end - begin; - guint32 random; - - g_return_val_if_fail (rand != NULL, begin); - g_return_val_if_fail (end > begin, begin); - - /* All tricks doing modulo calculations do not have a perfect - * distribution -> We must use the slower way through gdouble for - * maximal quality. */ - - if (dist <= 0x10000L) /* 2^16 */ - { - /* This method, which only calls g_rand_int once is only good - * for (end - begin) <= 2^16, because we only have 32 bits set - * from the one call to g_rand_int (). */ - - /* we are using (trans + trans * trans), because g_rand_int only - * covers [0..2^32-1] and thus g_rand_int * trans only covers - * [0..1-2^-32], but the biggest double < 1 is 1-2^-52. - */ - - gdouble double_rand = g_rand_int (rand) * - (G_RAND_DOUBLE_TRANSFORM + - G_RAND_DOUBLE_TRANSFORM * G_RAND_DOUBLE_TRANSFORM); - - random = (gint32) (double_rand * dist); - } - else - { - /* Now we use g_rand_double_range (), which will set 52 bits for - us, so that it is safe to round and still get a decent - distribution */ - random = (gint32) g_rand_double_range (rand, 0, dist); - } - - return begin + random; -} - -/** - * g_rand_double: - * @rand: a #GRand. - * - * Return the next random #gdouble from @rand equaly distributed over - * the range [0..1). - * - * Return value: A random number. - **/ -gdouble -g_rand_double (GRand* rand) -{ - /* We set all 52 bits after the point for this, not only the first - 32. Thats why we need two calls to g_rand_int */ - gdouble retval = g_rand_int (rand) * G_RAND_DOUBLE_TRANSFORM; - retval = (retval + g_rand_int (rand)) * G_RAND_DOUBLE_TRANSFORM; - - /* The following might happen due to very bad rounding luck, but - * actually this should be more than rare, we just try again then */ - if (retval >= 1.0) - return g_rand_double (rand); - - return retval; -} - -/** - * g_rand_double_range: - * @rand: a #GRand. - * @begin: lower closed bound of the interval. - * @end: upper open bound of the interval. - * - * Return the next random #gdouble from @rand equaly distributed over - * the range [@begin..@end). - * - * Return value: A random number. - **/ -gdouble -g_rand_double_range (GRand* rand, gdouble begin, gdouble end) -{ - return g_rand_double (rand) * (end - begin) + begin; -} - -/** - * g_random_int: - * - * Return a random #guint32 equaly distributed over the range - * [0..2^32-1]. - * - * Return value: A random number. - **/ -guint32 -g_random_int (void) -{ - guint32 result; - G_LOCK (global_random); - if (!global_random) - global_random = g_rand_new (); - - result = g_rand_int (global_random); - G_UNLOCK (global_random); - return result; -} - -/** - * g_random_int_range: - * @begin: lower closed bound of the interval. - * @end: upper open bound of the interval. - * - * Return a random #gint32 equaly distributed over the range - * [@begin..@end-1]. - * - * Return value: A random number. - **/ -gint32 -g_random_int_range (gint32 begin, gint32 end) -{ - gint32 result; - G_LOCK (global_random); - if (!global_random) - global_random = g_rand_new (); - - result = g_rand_int_range (global_random, begin, end); - G_UNLOCK (global_random); - return result; -} - -/** - * g_random_double: - * - * Return a random #gdouble equaly distributed over the range [0..1). - * - * Return value: A random number. - **/ -gdouble -g_random_double (void) -{ - double result; - G_LOCK (global_random); - if (!global_random) - global_random = g_rand_new (); - - result = g_rand_double (global_random); - G_UNLOCK (global_random); - return result; -} - -/** - * g_random_double_range: - * @begin: lower closed bound of the interval. - * @end: upper open bound of the interval. - * - * Return a random #gdouble equaly distributed over the range [@begin..@end). - * - * Return value: A random number. - **/ -gdouble -g_random_double_range (gdouble begin, gdouble end) -{ - double result; - G_LOCK (global_random); - if (!global_random) - global_random = g_rand_new (); - - result = g_rand_double_range (global_random, begin, end); - G_UNLOCK (global_random); - return result; -} - -/** - * g_random_set_seed: - * @seed: a value to reinitialize the global random number generator. - * - * Sets the seed for the global random number generator, which is used - * by te g_random_* functions, to @seed. - **/ -void -g_random_set_seed (guint32 seed) -{ - G_LOCK (global_random); - if (!global_random) - global_random = g_rand_new_with_seed (seed); - else - g_rand_set_seed (global_random, seed); - G_UNLOCK (global_random); -} - diff --git a/grand.h b/grand.h deleted file mode 100644 index 5accc1ae..00000000 --- a/grand.h +++ /dev/null @@ -1,82 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_RAND_H__ -#define __G_RAND_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GRand GRand; - -/* GRand - a good and fast random number generator: Mersenne Twister - * see http://www.math.keio.ac.jp/~matumoto/emt.html for more info. - * The range functions return a value in the intervall [begin, end). - * int -> [0..2^32-1] - * int_range -> [begin..end-1] - * double -> [0..1) - * double_range -> [begin..end) - */ - -GRand* g_rand_new_with_seed (guint32 seed); -GRand* g_rand_new (void); -void g_rand_free (GRand *rand); - -void g_rand_set_seed (GRand *rand, - guint32 seed); - -#define g_rand_boolean(rand) ((g_rand_int (rand) & (1 << 15)) != 0) - -guint32 g_rand_int (GRand *rand); -gint32 g_rand_int_range (GRand *rand, - gint32 begin, - gint32 end); -gdouble g_rand_double (GRand *rand); -gdouble g_rand_double_range (GRand *rand, - gdouble begin, - gdouble end); - -void g_random_set_seed (guint32 seed); - -#define g_random_boolean() ((g_random_int () & (1 << 15)) != 0) - -guint32 g_random_int (void); -gint32 g_random_int_range (gint32 begin, - gint32 end); -gdouble g_random_double (void); -gdouble g_random_double_range (gdouble begin, - gdouble end); - -G_END_DECLS - -#endif /* __G_RAND_H__ */ - - - - - - diff --git a/grel.c b/grel.c deleted file mode 100644 index 41e73229..00000000 --- a/grel.c +++ /dev/null @@ -1,459 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "glib.h" -#include -#include - -typedef struct _GRealRelation GRealRelation; -typedef struct _GRealTuples GRealTuples; - -struct _GRealRelation -{ - gint fields; - gint current_field; - - GHashTable *all_tuples; - GHashTable **hashed_tuple_tables; - GMemChunk *tuple_chunk; - - gint count; -}; - -struct _GRealTuples -{ - gint len; - gint width; - gpointer *data; -}; - -static gboolean -tuple_equal_2 (gconstpointer v_a, - gconstpointer v_b) -{ - gpointer* a = (gpointer*) v_a; - gpointer* b = (gpointer*) v_b; - - return a[0] == b[0] && a[1] == b[1]; -} - -static guint -tuple_hash_2 (gconstpointer v_a) -{ - gpointer* a = (gpointer*) v_a; - - return (gulong)a[0] ^ (gulong)a[1]; -} - -static GHashFunc -tuple_hash (gint fields) -{ - switch (fields) - { - case 2: - return tuple_hash_2; - default: - g_error ("no tuple hash for %d", fields); - } - - return NULL; -} - -static GEqualFunc -tuple_equal (gint fields) -{ - switch (fields) - { - case 2: - return tuple_equal_2; - default: - g_error ("no tuple equal for %d", fields); - } - - return NULL; -} - -GRelation* -g_relation_new (gint fields) -{ - GRealRelation* rel = g_new0 (GRealRelation, 1); - - rel->fields = fields; - rel->tuple_chunk = g_mem_chunk_new ("Relation Chunk", - fields * sizeof (gpointer), - fields * sizeof (gpointer) * 128, - G_ALLOC_AND_FREE); - rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields)); - rel->hashed_tuple_tables = g_new0 (GHashTable*, fields); - - return (GRelation*) rel; -} - -static void -g_relation_free_array (gpointer key, gpointer value, gpointer user_data) -{ - g_hash_table_destroy ((GHashTable*) value); -} - -void -g_relation_destroy (GRelation *relation) -{ - GRealRelation *rel = (GRealRelation *) relation; - gint i; - - if (rel) - { - g_hash_table_destroy (rel->all_tuples); - g_mem_chunk_destroy (rel->tuple_chunk); - - for (i = 0; i < rel->fields; i += 1) - { - if (rel->hashed_tuple_tables[i]) - { - g_hash_table_foreach (rel->hashed_tuple_tables[i], g_relation_free_array, NULL); - g_hash_table_destroy (rel->hashed_tuple_tables[i]); - } - } - - g_free (rel->hashed_tuple_tables); - g_free (rel); - } -} - -void -g_relation_index (GRelation *relation, - gint field, - GHashFunc hash_func, - GEqualFunc key_equal_func) -{ - GRealRelation *rel = (GRealRelation *) relation; - - g_return_if_fail (relation != NULL); - - g_return_if_fail (rel->count == 0 && rel->hashed_tuple_tables[field] == NULL); - - rel->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_equal_func); -} - -void -g_relation_insert (GRelation *relation, - ...) -{ - GRealRelation *rel = (GRealRelation *) relation; - gpointer* tuple = g_chunk_new (gpointer, rel->tuple_chunk); - va_list args; - gint i; - - va_start(args, relation); - - for (i = 0; i < rel->fields; i += 1) - tuple[i] = va_arg(args, gpointer); - - va_end(args); - - g_hash_table_insert (rel->all_tuples, tuple, tuple); - - rel->count += 1; - - for (i = 0; i < rel->fields; i += 1) - { - GHashTable *table; - gpointer key; - GHashTable *per_key_table; - - table = rel->hashed_tuple_tables[i]; - - if (table == NULL) - continue; - - key = tuple[i]; - per_key_table = g_hash_table_lookup (table, key); - - if (per_key_table == NULL) - { - per_key_table = g_hash_table_new (tuple_hash (rel->fields), tuple_equal (rel->fields)); - g_hash_table_insert (table, key, per_key_table); - } - - g_hash_table_insert (per_key_table, tuple, tuple); - } -} - -static void -g_relation_delete_tuple (gpointer tuple_key, - gpointer tuple_value, - gpointer user_data) -{ - gpointer *tuple = (gpointer*) tuple_value; - GRealRelation *rel = (GRealRelation *) user_data; - gint j; - - g_assert (tuple_key == tuple_value); - - for (j = 0; j < rel->fields; j += 1) - { - GHashTable *one_table = rel->hashed_tuple_tables[j]; - gpointer one_key; - GHashTable *per_key_table; - - if (one_table == NULL) - continue; - - if (j == rel->current_field) - /* can't delete from the table we're foreaching in */ - continue; - - one_key = tuple[j]; - - per_key_table = g_hash_table_lookup (one_table, one_key); - - g_hash_table_remove (per_key_table, tuple); - } - - g_hash_table_remove (rel->all_tuples, tuple); - - rel->count -= 1; -} - -gint -g_relation_delete (GRelation *relation, - gconstpointer key, - gint field) -{ - GRealRelation *rel = (GRealRelation *) relation; - GHashTable *table = rel->hashed_tuple_tables[field]; - GHashTable *key_table; - gint count = rel->count; - - g_return_val_if_fail (relation != NULL, 0); - g_return_val_if_fail (table != NULL, 0); - - key_table = g_hash_table_lookup (table, key); - - if (!key_table) - return 0; - - rel->current_field = field; - - g_hash_table_foreach (key_table, g_relation_delete_tuple, rel); - - g_hash_table_remove (table, key); - - g_hash_table_destroy (key_table); - - /* @@@ FIXME: Remove empty hash tables. */ - - return count - rel->count; -} - -static void -g_relation_select_tuple (gpointer tuple_key, - gpointer tuple_value, - gpointer user_data) -{ - gpointer *tuple = (gpointer*) tuple_value; - GRealTuples *tuples = (GRealTuples*) user_data; - gint stride = sizeof (gpointer) * tuples->width; - - g_assert (tuple_key == tuple_value); - - memcpy (tuples->data + (tuples->len * tuples->width), - tuple, - stride); - - tuples->len += 1; -} - -GTuples* -g_relation_select (GRelation *relation, - gconstpointer key, - gint field) -{ - GRealRelation *rel = (GRealRelation *) relation; - GHashTable *table = rel->hashed_tuple_tables[field]; - GHashTable *key_table; - GRealTuples *tuples = g_new0 (GRealTuples, 1); - gint count; - - g_return_val_if_fail (relation != NULL, NULL); - g_return_val_if_fail (table != NULL, NULL); - - key_table = g_hash_table_lookup (table, key); - - if (!key_table) - return (GTuples*)tuples; - - count = g_relation_count (relation, key, field); - - tuples->data = g_malloc (sizeof (gpointer) * rel->fields * count); - tuples->width = rel->fields; - - g_hash_table_foreach (key_table, g_relation_select_tuple, tuples); - - g_assert (count == tuples->len); - - return (GTuples*)tuples; -} - -gint -g_relation_count (GRelation *relation, - gconstpointer key, - gint field) -{ - GRealRelation *rel = (GRealRelation *) relation; - GHashTable *table = rel->hashed_tuple_tables[field]; - GHashTable *key_table; - - g_return_val_if_fail (relation != NULL, 0); - g_return_val_if_fail (table != NULL, 0); - - key_table = g_hash_table_lookup (table, key); - - if (!key_table) - return 0; - - return g_hash_table_size (key_table); -} - -gboolean -g_relation_exists (GRelation *relation, ...) -{ - GRealRelation *rel = (GRealRelation *) relation; - gpointer* tuple = g_chunk_new (gpointer, rel->tuple_chunk); - va_list args; - gint i; - gboolean result; - - va_start(args, relation); - - for (i = 0; i < rel->fields; i += 1) - tuple[i] = va_arg(args, gpointer); - - va_end(args); - - result = g_hash_table_lookup (rel->all_tuples, tuple) != NULL; - - g_mem_chunk_free (rel->tuple_chunk, tuple); - - return result; -} - -void -g_tuples_destroy (GTuples *tuples0) -{ - GRealTuples *tuples = (GRealTuples*) tuples0; - - if (tuples) - { - g_free (tuples->data); - g_free (tuples); - } -} - -gpointer -g_tuples_index (GTuples *tuples0, - gint index, - gint field) -{ - GRealTuples *tuples = (GRealTuples*) tuples0; - - g_return_val_if_fail (tuples0 != NULL, NULL); - g_return_val_if_fail (field < tuples->width, NULL); - - return tuples->data[index * tuples->width + field]; -} - -/* Print - */ - -static void -g_relation_print_one (gpointer tuple_key, - gpointer tuple_value, - gpointer user_data) -{ - gint i; - GString *gstring; - GRealRelation* rel = (GRealRelation*) user_data; - gpointer* tuples = (gpointer*) tuple_value; - - gstring = g_string_new ("["); - - for (i = 0; i < rel->fields; i += 1) - { - g_string_printfa (gstring, "%p", tuples[i]); - - if (i < (rel->fields - 1)) - g_string_append (gstring, ","); - } - - g_string_append (gstring, "]"); - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, gstring->str); - g_string_free (gstring, TRUE); -} - -static void -g_relation_print_index (gpointer tuple_key, - gpointer tuple_value, - gpointer user_data) -{ - GRealRelation* rel = (GRealRelation*) user_data; - GHashTable* table = (GHashTable*) tuple_value; - - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** key %p", tuple_key); - - g_hash_table_foreach (table, - g_relation_print_one, - rel); -} - -void -g_relation_print (GRelation *relation) -{ - gint i; - GRealRelation* rel = (GRealRelation*) relation; - - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** all tuples (%d)", rel->count); - - g_hash_table_foreach (rel->all_tuples, - g_relation_print_one, - rel); - - for (i = 0; i < rel->fields; i += 1) - { - if (rel->hashed_tuple_tables[i] == NULL) - continue; - - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** index %d", i); - - g_hash_table_foreach (rel->hashed_tuple_tables[i], - g_relation_print_index, - rel); - } - -} diff --git a/grel.h b/grel.h deleted file mode 100644 index fcf8eab4..00000000 --- a/grel.h +++ /dev/null @@ -1,94 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_REL_H__ -#define __G_REL_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GRelation GRelation; -typedef struct _GTuples GTuples; - -struct _GTuples -{ - guint len; -}; - -/* GRelation - * - * Indexed Relations. Imagine a really simple table in a - * database. Relations are not ordered. This data type is meant for - * maintaining a N-way mapping. - * - * g_relation_new() creates a relation with FIELDS fields - * - * g_relation_destroy() frees all resources - * g_tuples_destroy() frees the result of g_relation_select() - * - * g_relation_index() indexes relation FIELD with the provided - * equality and hash functions. this must be done before any - * calls to insert are made. - * - * g_relation_insert() inserts a new tuple. you are expected to - * provide the right number of fields. - * - * g_relation_delete() deletes all relations with KEY in FIELD - * g_relation_select() returns ... - * g_relation_count() counts ... - */ - -GRelation* g_relation_new (gint fields); -void g_relation_destroy (GRelation *relation); -void g_relation_index (GRelation *relation, - gint field, - GHashFunc hash_func, - GEqualFunc key_equal_func); -void g_relation_insert (GRelation *relation, - ...); -gint g_relation_delete (GRelation *relation, - gconstpointer key, - gint field); -GTuples* g_relation_select (GRelation *relation, - gconstpointer key, - gint field); -gint g_relation_count (GRelation *relation, - gconstpointer key, - gint field); -gboolean g_relation_exists (GRelation *relation, - ...); -void g_relation_print (GRelation *relation); - -void g_tuples_destroy (GTuples *tuples); -gpointer g_tuples_index (GTuples *tuples, - gint index, - gint field); - -G_END_DECLS - -#endif /* __G_REL_H__ */ - diff --git a/gscanner.c b/gscanner.c deleted file mode 100644 index e73034a7..00000000 --- a/gscanner.c +++ /dev/null @@ -1,1728 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GScanner: Flexible lexical scanner for general purpose. - * Copyright (C) 1997, 1998 Tim Janik - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#define __gscanner_c__ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include "glib.h" -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include /* needed for sys/stat.h */ -#include -#ifdef G_OS_WIN32 -#include /* For _read() */ -#endif - -/* --- defines --- */ -#define to_lower(c) ( \ - (guchar) ( \ - ( (((guchar)(c))>='A' && ((guchar)(c))<='Z') * ('a'-'A') ) | \ - ( (((guchar)(c))>=192 && ((guchar)(c))<=214) * (224-192) ) | \ - ( (((guchar)(c))>=216 && ((guchar)(c))<=222) * (248-216) ) | \ - ((guchar)(c)) \ - ) \ -) -#define READ_BUFFER_SIZE (4000) - - -/* --- typedefs --- */ -typedef struct _GScannerKey GScannerKey; - -struct _GScannerKey -{ - guint scope_id; - gchar *symbol; - gpointer value; -}; - - - -/* --- variables --- */ -static GScannerConfig g_scanner_config_template = -{ - ( - " \t\r\n" - ) /* cset_skip_characters */, - ( - G_CSET_a_2_z - "_" - G_CSET_A_2_Z - ) /* cset_identifier_first */, - ( - G_CSET_a_2_z - "_" - G_CSET_A_2_Z - G_CSET_DIGITS - G_CSET_LATINS - G_CSET_LATINC - ) /* cset_identifier_nth */, - ( "#\n" ) /* cpair_comment_single */, - - FALSE /* case_sensitive */, - - TRUE /* skip_comment_multi */, - TRUE /* skip_comment_single */, - TRUE /* scan_comment_multi */, - TRUE /* scan_identifier */, - FALSE /* scan_identifier_1char */, - FALSE /* scan_identifier_NULL */, - TRUE /* scan_symbols */, - FALSE /* scan_binary */, - TRUE /* scan_octal */, - TRUE /* scan_float */, - TRUE /* scan_hex */, - FALSE /* scan_hex_dollar */, - TRUE /* scan_string_sq */, - TRUE /* scan_string_dq */, - TRUE /* numbers_2_int */, - FALSE /* int_2_float */, - FALSE /* identifier_2_string */, - TRUE /* char_2_token */, - FALSE /* symbol_2_token */, - FALSE /* scope_0_fallback */, -}; - - -/* --- prototypes --- */ -static inline -GScannerKey* g_scanner_lookup_internal (GScanner *scanner, - guint scope_id, - const gchar *symbol); -static gboolean g_scanner_key_equal (gconstpointer v1, - gconstpointer v2); -static guint g_scanner_key_hash (gconstpointer v); -static void g_scanner_get_token_ll (GScanner *scanner, - GTokenType *token_p, - GTokenValue *value_p, - guint *line_p, - guint *position_p); -static void g_scanner_get_token_i (GScanner *scanner, - GTokenType *token_p, - GTokenValue *value_p, - guint *line_p, - guint *position_p); - -static guchar g_scanner_peek_next_char (GScanner *scanner); -static guchar g_scanner_get_char (GScanner *scanner, - guint *line_p, - guint *position_p); -static void g_scanner_msg_handler (GScanner *scanner, - gchar *message, - gint is_error); - - -/* --- functions --- */ -static inline gint -g_scanner_char_2_num (guchar c, - guchar base) -{ - if (c >= '0' && c <= '9') - c -= '0'; - else if (c >= 'A' && c <= 'Z') - c -= 'A' - 10; - else if (c >= 'a' && c <= 'z') - c -= 'a' - 10; - else - return -1; - - if (c < base) - return c; - - return -1; -} - -GScanner* -g_scanner_new (const GScannerConfig *config_templ) -{ - GScanner *scanner; - - if (!config_templ) - config_templ = &g_scanner_config_template; - - scanner = g_new0 (GScanner, 1); - - scanner->user_data = NULL; - scanner->max_parse_errors = 0; - scanner->parse_errors = 0; - scanner->input_name = NULL; - g_datalist_init (&scanner->qdata); - - scanner->config = g_new0 (GScannerConfig, 1); - - scanner->config->case_sensitive = config_templ->case_sensitive; - scanner->config->cset_skip_characters = config_templ->cset_skip_characters; - if (!scanner->config->cset_skip_characters) - scanner->config->cset_skip_characters = ""; - scanner->config->cset_identifier_first = config_templ->cset_identifier_first; - scanner->config->cset_identifier_nth = config_templ->cset_identifier_nth; - scanner->config->cpair_comment_single = config_templ->cpair_comment_single; - scanner->config->skip_comment_multi = config_templ->skip_comment_multi; - scanner->config->skip_comment_single = config_templ->skip_comment_single; - scanner->config->scan_comment_multi = config_templ->scan_comment_multi; - scanner->config->scan_identifier = config_templ->scan_identifier; - scanner->config->scan_identifier_1char = config_templ->scan_identifier_1char; - scanner->config->scan_identifier_NULL = config_templ->scan_identifier_NULL; - scanner->config->scan_symbols = config_templ->scan_symbols; - scanner->config->scan_binary = config_templ->scan_binary; - scanner->config->scan_octal = config_templ->scan_octal; - scanner->config->scan_float = config_templ->scan_float; - scanner->config->scan_hex = config_templ->scan_hex; - scanner->config->scan_hex_dollar = config_templ->scan_hex_dollar; - scanner->config->scan_string_sq = config_templ->scan_string_sq; - scanner->config->scan_string_dq = config_templ->scan_string_dq; - scanner->config->numbers_2_int = config_templ->numbers_2_int; - scanner->config->int_2_float = config_templ->int_2_float; - scanner->config->identifier_2_string = config_templ->identifier_2_string; - scanner->config->char_2_token = config_templ->char_2_token; - scanner->config->symbol_2_token = config_templ->symbol_2_token; - scanner->config->scope_0_fallback = config_templ->scope_0_fallback; - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int = 0; - scanner->line = 1; - scanner->position = 0; - - scanner->next_token = G_TOKEN_NONE; - scanner->next_value.v_int = 0; - scanner->next_line = 1; - scanner->next_position = 0; - - scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal); - scanner->input_fd = -1; - scanner->text = NULL; - scanner->text_end = NULL; - scanner->buffer = NULL; - scanner->scope_id = 0; - - scanner->msg_handler = g_scanner_msg_handler; - - return scanner; -} - -static inline void -g_scanner_free_value (GTokenType *token_p, - GTokenValue *value_p) -{ - switch (*token_p) - { - case G_TOKEN_STRING: - case G_TOKEN_IDENTIFIER: - case G_TOKEN_IDENTIFIER_NULL: - case G_TOKEN_COMMENT_SINGLE: - case G_TOKEN_COMMENT_MULTI: - g_free (value_p->v_string); - break; - - default: - break; - } - - *token_p = G_TOKEN_NONE; -} - -static void -g_scanner_destroy_symbol_table_entry (gpointer _key, - gpointer _value, - gpointer _data) -{ - GScannerKey *key = _key; - - g_free (key->symbol); - g_free (key); -} - -void -g_scanner_destroy (GScanner *scanner) -{ - g_return_if_fail (scanner != NULL); - - g_datalist_clear (&scanner->qdata); - g_hash_table_foreach (scanner->symbol_table, - g_scanner_destroy_symbol_table_entry, NULL); - g_hash_table_destroy (scanner->symbol_table); - g_scanner_free_value (&scanner->token, &scanner->value); - g_scanner_free_value (&scanner->next_token, &scanner->next_value); - g_free (scanner->config); - g_free (scanner->buffer); - g_free (scanner); -} - -static void -g_scanner_msg_handler (GScanner *scanner, - gchar *message, - gint is_error) -{ - g_return_if_fail (scanner != NULL); - - fprintf (stdout, "%s:%d: ", scanner->input_name, scanner->line); - if (is_error) - fprintf (stdout, "error: "); - fprintf (stdout, "%s\n", message); -} - -void -g_scanner_error (GScanner *scanner, - const gchar *format, - ...) -{ - g_return_if_fail (scanner != NULL); - g_return_if_fail (format != NULL); - - scanner->parse_errors++; - - if (scanner->msg_handler) - { - va_list args; - gchar *string; - - va_start (args, format); - string = g_strdup_vprintf (format, args); - va_end (args); - - scanner->msg_handler (scanner, string, TRUE); - - g_free (string); - } -} - -void -g_scanner_warn (GScanner *scanner, - const gchar *format, - ...) -{ - g_return_if_fail (scanner != NULL); - g_return_if_fail (format != NULL); - - if (scanner->msg_handler) - { - va_list args; - gchar *string; - - va_start (args, format); - string = g_strdup_vprintf (format, args); - va_end (args); - - scanner->msg_handler (scanner, string, FALSE); - - g_free (string); - } -} - -static gboolean -g_scanner_key_equal (gconstpointer v1, - gconstpointer v2) -{ - const GScannerKey *key1 = v1; - const GScannerKey *key2 = v2; - - return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0); -} - -static guint -g_scanner_key_hash (gconstpointer v) -{ - const GScannerKey *key = v; - gchar *c; - guint h; - - h = key->scope_id; - for (c = key->symbol; *c; c++) - h = (h << 5) - h + *c; - - return h; -} - -static inline GScannerKey* -g_scanner_lookup_internal (GScanner *scanner, - guint scope_id, - const gchar *symbol) -{ - GScannerKey *key_p; - GScannerKey key; - - key.scope_id = scope_id; - - if (!scanner->config->case_sensitive) - { - gchar *d; - const gchar *c; - - key.symbol = g_new (gchar, strlen (symbol) + 1); - for (d = key.symbol, c = symbol; *c; c++, d++) - *d = to_lower (*c); - *d = 0; - key_p = g_hash_table_lookup (scanner->symbol_table, &key); - g_free (key.symbol); - } - else - { - key.symbol = (gchar*) symbol; - key_p = g_hash_table_lookup (scanner->symbol_table, &key); - } - - return key_p; -} - -void -g_scanner_scope_add_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol, - gpointer value) -{ - GScannerKey *key; - - g_return_if_fail (scanner != NULL); - g_return_if_fail (symbol != NULL); - - key = g_scanner_lookup_internal (scanner, scope_id, symbol); - - if (!key) - { - key = g_new (GScannerKey, 1); - key->scope_id = scope_id; - key->symbol = g_strdup (symbol); - key->value = value; - if (!scanner->config->case_sensitive) - { - gchar *c; - - c = key->symbol; - while (*c != 0) - { - *c = to_lower (*c); - c++; - } - } - g_hash_table_insert (scanner->symbol_table, key, key); - } - else - key->value = value; -} - -void -g_scanner_scope_remove_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol) -{ - GScannerKey *key; - - g_return_if_fail (scanner != NULL); - g_return_if_fail (symbol != NULL); - - key = g_scanner_lookup_internal (scanner, scope_id, symbol); - - if (key) - { - g_hash_table_remove (scanner->symbol_table, key); - g_free (key->symbol); - g_free (key); - } -} - -gpointer -g_scanner_lookup_symbol (GScanner *scanner, - const gchar *symbol) -{ - GScannerKey *key; - guint scope_id; - - g_return_val_if_fail (scanner != NULL, NULL); - - if (!symbol) - return NULL; - - scope_id = scanner->scope_id; - key = g_scanner_lookup_internal (scanner, scope_id, symbol); - if (!key && scope_id && scanner->config->scope_0_fallback) - key = g_scanner_lookup_internal (scanner, 0, symbol); - - if (key) - return key->value; - else - return NULL; -} - -gpointer -g_scanner_scope_lookup_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol) -{ - GScannerKey *key; - - g_return_val_if_fail (scanner != NULL, NULL); - - if (!symbol) - return NULL; - - key = g_scanner_lookup_internal (scanner, scope_id, symbol); - - if (key) - return key->value; - else - return NULL; -} - -guint -g_scanner_set_scope (GScanner *scanner, - guint scope_id) -{ - guint old_scope_id; - - g_return_val_if_fail (scanner != NULL, 0); - - old_scope_id = scanner->scope_id; - scanner->scope_id = scope_id; - - return old_scope_id; -} - -static void -g_scanner_foreach_internal (gpointer _key, - gpointer _value, - gpointer _user_data) -{ - GScannerKey *key; - gpointer *d; - GHFunc func; - gpointer user_data; - guint *scope_id; - - d = _user_data; - func = (GHFunc) d[0]; - user_data = d[1]; - scope_id = d[2]; - key = _value; - - if (key->scope_id == *scope_id) - func (key->symbol, key->value, user_data); -} - -void -g_scanner_scope_foreach_symbol (GScanner *scanner, - guint scope_id, - GHFunc func, - gpointer user_data) -{ - gpointer d[3]; - - g_return_if_fail (scanner != NULL); - - d[0] = (gpointer) func; - d[1] = user_data; - d[2] = &scope_id; - - g_hash_table_foreach (scanner->symbol_table, g_scanner_foreach_internal, d); -} - -GTokenType -g_scanner_peek_next_token (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); - - if (scanner->next_token == G_TOKEN_NONE) - { - scanner->next_line = scanner->line; - scanner->next_position = scanner->position; - g_scanner_get_token_i (scanner, - &scanner->next_token, - &scanner->next_value, - &scanner->next_line, - &scanner->next_position); - } - - return scanner->next_token; -} - -GTokenType -g_scanner_get_next_token (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); - - if (scanner->next_token != G_TOKEN_NONE) - { - g_scanner_free_value (&scanner->token, &scanner->value); - - scanner->token = scanner->next_token; - scanner->value = scanner->next_value; - scanner->line = scanner->next_line; - scanner->position = scanner->next_position; - scanner->next_token = G_TOKEN_NONE; - } - else - g_scanner_get_token_i (scanner, - &scanner->token, - &scanner->value, - &scanner->line, - &scanner->position); - - return scanner->token; -} - -GTokenType -g_scanner_cur_token (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); - - return scanner->token; -} - -GTokenValue -g_scanner_cur_value (GScanner *scanner) -{ - GTokenValue v; - - v.v_int = 0; - - g_return_val_if_fail (scanner != NULL, v); - - /* MSC isn't capable of handling return scanner->value; ? */ - - v = scanner->value; - - return v; -} - -guint -g_scanner_cur_line (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, 0); - - return scanner->line; -} - -guint -g_scanner_cur_position (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, 0); - - return scanner->position; -} - -gboolean -g_scanner_eof (GScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, TRUE); - - return scanner->token == G_TOKEN_EOF; -} - -void -g_scanner_input_file (GScanner *scanner, - gint input_fd) -{ - g_return_if_fail (scanner != NULL); - g_return_if_fail (input_fd >= 0); - - if (scanner->input_fd >= 0) - g_scanner_sync_file_offset (scanner); - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int = 0; - scanner->line = 1; - scanner->position = 0; - scanner->next_token = G_TOKEN_NONE; - - scanner->input_fd = input_fd; - scanner->text = NULL; - scanner->text_end = NULL; - - if (!scanner->buffer) - scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1); -} - -void -g_scanner_input_text (GScanner *scanner, - const gchar *text, - guint text_len) -{ - g_return_if_fail (scanner != NULL); - if (text_len) - g_return_if_fail (text != NULL); - else - text = NULL; - - if (scanner->input_fd >= 0) - g_scanner_sync_file_offset (scanner); - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int = 0; - scanner->line = 1; - scanner->position = 0; - scanner->next_token = G_TOKEN_NONE; - - scanner->input_fd = -1; - scanner->text = text; - scanner->text_end = text + text_len; - - if (scanner->buffer) - { - g_free (scanner->buffer); - scanner->buffer = NULL; - } -} - -static guchar -g_scanner_peek_next_char (GScanner *scanner) -{ - if (scanner->text < scanner->text_end) - { - return *scanner->text; - } - else if (scanner->input_fd >= 0) - { - gint count; - gchar *buffer; - - buffer = scanner->buffer; - do - { - count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); - } - while (count == -1 && (errno == EINTR || errno == EAGAIN)); - - if (count < 1) - { - scanner->input_fd = -1; - - return 0; - } - else - { - scanner->text = buffer; - scanner->text_end = buffer + count; - - return *buffer; - } - } - else - return 0; -} - -void -g_scanner_sync_file_offset (GScanner *scanner) -{ - g_return_if_fail (scanner != NULL); - - /* for file input, rewind the filedescriptor to the current - * buffer position and blow the file read ahead buffer. usefull for - * third party uses of our filedescriptor, which hooks onto the current - * scanning position. - */ - - if (scanner->input_fd >= 0 && scanner->text_end > scanner->text) - { - gint buffered; - - buffered = scanner->text_end - scanner->text; - if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0) - { - /* we succeeded, blow our buffer's contents now */ - scanner->text = NULL; - scanner->text_end = NULL; - } - else - errno = 0; - } -} - -static guchar -g_scanner_get_char (GScanner *scanner, - guint *line_p, - guint *position_p) -{ - guchar fchar; - - if (scanner->text < scanner->text_end) - fchar = *(scanner->text++); - else if (scanner->input_fd >= 0) - { - gint count; - gchar *buffer; - - buffer = scanner->buffer; - do - { - count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); - } - while (count == -1 && (errno == EINTR || errno == EAGAIN)); - - if (count < 1) - { - scanner->input_fd = -1; - fchar = 0; - } - else - { - scanner->text = buffer + 1; - scanner->text_end = buffer + count; - fchar = *buffer; - if (!fchar) - { - g_scanner_sync_file_offset (scanner); - scanner->text_end = scanner->text; - scanner->input_fd = -1; - } - } - } - else - fchar = 0; - - if (fchar == '\n') - { - (*position_p) = 0; - (*line_p)++; - } - else if (fchar) - { - (*position_p)++; - } - - return fchar; -} - -void -g_scanner_unexp_token (GScanner *scanner, - GTokenType expected_token, - const gchar *identifier_spec, - const gchar *symbol_spec, - const gchar *symbol_name, - const gchar *message, - gint is_error) -{ - gchar *token_string; - guint token_string_len; - gchar *expected_string; - guint expected_string_len; - gchar *message_prefix; - gboolean print_unexp; - void (*msg_handler) (GScanner*, const gchar*, ...); - - g_return_if_fail (scanner != NULL); - - if (is_error) - msg_handler = g_scanner_error; - else - msg_handler = g_scanner_warn; - - if (!identifier_spec) - identifier_spec = "identifier"; - if (!symbol_spec) - symbol_spec = "symbol"; - - token_string_len = 56; - token_string = g_new (gchar, token_string_len + 1); - expected_string_len = 64; - expected_string = g_new (gchar, expected_string_len + 1); - print_unexp = TRUE; - - switch (scanner->token) - { - case G_TOKEN_EOF: - g_snprintf (token_string, token_string_len, "end of file"); - break; - - default: - if (scanner->token >= 1 && scanner->token <= 255) - { - if ((scanner->token >= ' ' && scanner->token <= '~') || - strchr (scanner->config->cset_identifier_first, scanner->token) || - strchr (scanner->config->cset_identifier_nth, scanner->token)) - g_snprintf (token_string, expected_string_len, "character `%c'", scanner->token); - else - g_snprintf (token_string, expected_string_len, "character `\\%o'", scanner->token); - break; - } - else if (!scanner->config->symbol_2_token) - { - g_snprintf (token_string, token_string_len, "(unknown) token <%d>", scanner->token); - break; - } - /* fall through */ - case G_TOKEN_SYMBOL: - if (expected_token == G_TOKEN_SYMBOL || - (scanner->config->symbol_2_token && - expected_token > G_TOKEN_LAST)) - print_unexp = FALSE; - if (symbol_name) - g_snprintf (token_string, - token_string_len, - "%s%s `%s'", - print_unexp ? "" : "invalid ", - symbol_spec, - symbol_name); - else - g_snprintf (token_string, - token_string_len, - "%s%s", - print_unexp ? "" : "invalid ", - symbol_spec); - break; - - case G_TOKEN_ERROR: - print_unexp = FALSE; - expected_token = G_TOKEN_NONE; - switch (scanner->value.v_error) - { - case G_ERR_UNEXP_EOF: - g_snprintf (token_string, token_string_len, "scanner: unexpected end of file"); - break; - - case G_ERR_UNEXP_EOF_IN_STRING: - g_snprintf (token_string, token_string_len, "scanner: unterminated string constant"); - break; - - case G_ERR_UNEXP_EOF_IN_COMMENT: - g_snprintf (token_string, token_string_len, "scanner: unterminated comment"); - break; - - case G_ERR_NON_DIGIT_IN_CONST: - g_snprintf (token_string, token_string_len, "scanner: non digit in constant"); - break; - - case G_ERR_FLOAT_RADIX: - g_snprintf (token_string, token_string_len, "scanner: invalid radix for floating constant"); - break; - - case G_ERR_FLOAT_MALFORMED: - g_snprintf (token_string, token_string_len, "scanner: malformed floating constant"); - break; - - case G_ERR_DIGIT_RADIX: - g_snprintf (token_string, token_string_len, "scanner: digit is beyond radix"); - break; - - case G_ERR_UNKNOWN: - default: - g_snprintf (token_string, token_string_len, "scanner: unknown error"); - break; - } - break; - - case G_TOKEN_CHAR: - g_snprintf (token_string, token_string_len, "character `%c'", scanner->value.v_char); - break; - - case G_TOKEN_IDENTIFIER: - case G_TOKEN_IDENTIFIER_NULL: - if (expected_token == G_TOKEN_IDENTIFIER || - expected_token == G_TOKEN_IDENTIFIER_NULL) - print_unexp = FALSE; - g_snprintf (token_string, - token_string_len, - "%s%s `%s'", - print_unexp ? "" : "invalid ", - identifier_spec, - scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null"); - break; - - case G_TOKEN_BINARY: - case G_TOKEN_OCTAL: - case G_TOKEN_INT: - case G_TOKEN_HEX: - g_snprintf (token_string, token_string_len, "number `%ld'", scanner->value.v_int); - break; - - case G_TOKEN_FLOAT: - g_snprintf (token_string, token_string_len, "number `%.3f'", scanner->value.v_float); - break; - - case G_TOKEN_STRING: - if (expected_token == G_TOKEN_STRING) - print_unexp = FALSE; - g_snprintf (token_string, - token_string_len, - "%s%sstring constant \"%s\"", - print_unexp ? "" : "invalid ", - scanner->value.v_string[0] == 0 ? "empty " : "", - scanner->value.v_string); - token_string[token_string_len - 2] = '"'; - token_string[token_string_len - 1] = 0; - break; - - case G_TOKEN_COMMENT_SINGLE: - case G_TOKEN_COMMENT_MULTI: - g_snprintf (token_string, token_string_len, "comment"); - break; - - case G_TOKEN_NONE: - /* somehow the user's parsing code is screwed, there isn't much - * we can do about it. - * Note, a common case to trigger this is - * g_scanner_peek_next_token(); g_scanner_unexp_token(); - * without an intermediate g_scanner_get_next_token(). - */ - g_assert_not_reached (); - break; - } - - - switch (expected_token) - { - gboolean need_valid; - - default: - if (expected_token >= 1 && expected_token <= 255) - { - if ((expected_token >= ' ' && expected_token <= '~') || - strchr (scanner->config->cset_identifier_first, expected_token) || - strchr (scanner->config->cset_identifier_nth, expected_token)) - g_snprintf (expected_string, expected_string_len, "character `%c'", expected_token); - else - g_snprintf (expected_string, expected_string_len, "character `\\%o'", expected_token); - break; - } - else if (!scanner->config->symbol_2_token) - { - g_snprintf (expected_string, expected_string_len, "(unknown) token <%d>", expected_token); - break; - } - /* fall through */ - case G_TOKEN_SYMBOL: - need_valid = (scanner->token == G_TOKEN_SYMBOL || - (scanner->config->symbol_2_token && - scanner->token > G_TOKEN_LAST)); - g_snprintf (expected_string, - expected_string_len, - "%s%s", - need_valid ? "valid " : "", - symbol_spec); - /* FIXME: should we attempt to lookup the symbol_name for symbol_2_token? */ - break; - - case G_TOKEN_INT: - g_snprintf (expected_string, expected_string_len, "number (integer)"); - break; - - case G_TOKEN_FLOAT: - g_snprintf (expected_string, expected_string_len, "number (float)"); - break; - - case G_TOKEN_STRING: - g_snprintf (expected_string, - expected_string_len, - "%sstring constant", - scanner->token == G_TOKEN_STRING ? "valid " : ""); - break; - - case G_TOKEN_IDENTIFIER: - case G_TOKEN_IDENTIFIER_NULL: - g_snprintf (expected_string, - expected_string_len, - "%s%s", - (scanner->token == G_TOKEN_IDENTIFIER_NULL || - scanner->token == G_TOKEN_IDENTIFIER ? "valid " : ""), - identifier_spec); - break; - - case G_TOKEN_EOF: - g_snprintf (expected_string, expected_string_len, "end of file"); - break; - - case G_TOKEN_NONE: - break; - } - - if (message && message[0] != 0) - message_prefix = " - "; - else - { - message_prefix = ""; - message = ""; - } - - if (expected_token != G_TOKEN_NONE) - { - if (print_unexp) - msg_handler (scanner, - "unexpected %s, expected %s%s%s", - token_string, - expected_string, - message_prefix, - message); - else - msg_handler (scanner, - "%s, expected %s%s%s", - token_string, - expected_string, - message_prefix, - message); - } - else - { - if (print_unexp) - msg_handler (scanner, - "unexpected %s%s%s", - token_string, - message_prefix, - message); - else - msg_handler (scanner, - "%s%s%s", - token_string, - message_prefix, - message); - } - - g_free (token_string); - g_free (expected_string); -} - -gint -g_scanner_stat_mode (const gchar *filename) -{ - struct stat *stat_buf; - gint st_mode; - - stat_buf = g_new0 (struct stat, 1); -#ifdef HAVE_LSTAT - lstat (filename, stat_buf); -#else - stat (filename, stat_buf); -#endif - st_mode = stat_buf->st_mode; - - g_free (stat_buf); - - return st_mode; -} - -static void -g_scanner_get_token_i (GScanner *scanner, - GTokenType *token_p, - GTokenValue *value_p, - guint *line_p, - guint *position_p) -{ - do - { - g_scanner_free_value (token_p, value_p); - g_scanner_get_token_ll (scanner, token_p, value_p, line_p, position_p); - } - while (((*token_p > 0 && *token_p < 256) && - strchr (scanner->config->cset_skip_characters, *token_p)) || - (*token_p == G_TOKEN_CHAR && - strchr (scanner->config->cset_skip_characters, value_p->v_char)) || - (*token_p == G_TOKEN_COMMENT_MULTI && - scanner->config->skip_comment_multi) || - (*token_p == G_TOKEN_COMMENT_SINGLE && - scanner->config->skip_comment_single)); - - switch (*token_p) - { - case G_TOKEN_IDENTIFIER: - if (scanner->config->identifier_2_string) - *token_p = G_TOKEN_STRING; - break; - - case G_TOKEN_SYMBOL: - if (scanner->config->symbol_2_token) - *token_p = (GTokenType) value_p->v_symbol; - break; - - case G_TOKEN_BINARY: - case G_TOKEN_OCTAL: - case G_TOKEN_HEX: - if (scanner->config->numbers_2_int) - *token_p = G_TOKEN_INT; - break; - - default: - break; - } - - if (*token_p == G_TOKEN_INT && - scanner->config->int_2_float) - { - *token_p = G_TOKEN_FLOAT; - value_p->v_float = value_p->v_int; - } - - errno = 0; -} - -static void -g_scanner_get_token_ll (GScanner *scanner, - GTokenType *token_p, - GTokenValue *value_p, - guint *line_p, - guint *position_p) -{ - GScannerConfig *config; - GTokenType token; - gboolean in_comment_multi; - gboolean in_comment_single; - gboolean in_string_sq; - gboolean in_string_dq; - GString *gstring; - GTokenValue value; - guchar ch; - - config = scanner->config; - (*value_p).v_int = 0; - - if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || - scanner->token == G_TOKEN_EOF) - { - *token_p = G_TOKEN_EOF; - return; - } - - in_comment_multi = FALSE; - in_comment_single = FALSE; - in_string_sq = FALSE; - in_string_dq = FALSE; - gstring = NULL; - - do /* while (ch != 0) */ - { - gboolean dotted_float = FALSE; - - ch = g_scanner_get_char (scanner, line_p, position_p); - - value.v_int = 0; - token = G_TOKEN_NONE; - - /* this is *evil*, but needed ;( - * we first check for identifier first character, because it - * might interfere with other key chars like slashes or numbers - */ - if (config->scan_identifier && - ch && strchr (config->cset_identifier_first, ch)) - goto identifier_precedence; - - switch (ch) - { - case 0: - token = G_TOKEN_EOF; - (*position_p)++; - /* ch = 0; */ - break; - - case '/': - if (!config->scan_comment_multi || - g_scanner_peek_next_char (scanner) != '*') - goto default_case; - g_scanner_get_char (scanner, line_p, position_p); - token = G_TOKEN_COMMENT_MULTI; - in_comment_multi = TRUE; - gstring = g_string_new (""); - while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) - { - if (ch == '*' && g_scanner_peek_next_char (scanner) == '/') - { - g_scanner_get_char (scanner, line_p, position_p); - in_comment_multi = FALSE; - break; - } - else - gstring = g_string_append_c (gstring, ch); - } - ch = 0; - break; - - case '\'': - if (!config->scan_string_sq) - goto default_case; - token = G_TOKEN_STRING; - in_string_sq = TRUE; - gstring = g_string_new (""); - while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) - { - if (ch == '\'') - { - in_string_sq = FALSE; - break; - } - else - gstring = g_string_append_c (gstring, ch); - } - ch = 0; - break; - - case '"': - if (!config->scan_string_dq) - goto default_case; - token = G_TOKEN_STRING; - in_string_dq = TRUE; - gstring = g_string_new (""); - while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) - { - if (ch == '"') - { - in_string_dq = FALSE; - break; - } - else - { - if (ch == '\\') - { - ch = g_scanner_get_char (scanner, line_p, position_p); - switch (ch) - { - guint i; - guint fchar; - - case 0: - break; - - case '\\': - gstring = g_string_append_c (gstring, '\\'); - break; - - case 'n': - gstring = g_string_append_c (gstring, '\n'); - break; - - case 't': - gstring = g_string_append_c (gstring, '\t'); - break; - - case 'r': - gstring = g_string_append_c (gstring, '\r'); - break; - - case 'b': - gstring = g_string_append_c (gstring, '\b'); - break; - - case 'f': - gstring = g_string_append_c (gstring, '\f'); - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - i = ch - '0'; - fchar = g_scanner_peek_next_char (scanner); - if (fchar >= '0' && fchar <= '7') - { - ch = g_scanner_get_char (scanner, line_p, position_p); - i = i * 8 + ch - '0'; - fchar = g_scanner_peek_next_char (scanner); - if (fchar >= '0' && fchar <= '7') - { - ch = g_scanner_get_char (scanner, line_p, position_p); - i = i * 8 + ch - '0'; - } - } - gstring = g_string_append_c (gstring, i); - break; - - default: - gstring = g_string_append_c (gstring, ch); - break; - } - } - else - gstring = g_string_append_c (gstring, ch); - } - } - ch = 0; - break; - - case '.': - if (!config->scan_float) - goto default_case; - token = G_TOKEN_FLOAT; - dotted_float = TRUE; - ch = g_scanner_get_char (scanner, line_p, position_p); - goto number_parsing; - - case '$': - if (!config->scan_hex_dollar) - goto default_case; - token = G_TOKEN_HEX; - ch = g_scanner_get_char (scanner, line_p, position_p); - goto number_parsing; - - case '0': - if (config->scan_octal) - token = G_TOKEN_OCTAL; - else - token = G_TOKEN_INT; - ch = g_scanner_peek_next_char (scanner); - if (config->scan_hex && (ch == 'x' || ch == 'X')) - { - token = G_TOKEN_HEX; - g_scanner_get_char (scanner, line_p, position_p); - ch = g_scanner_get_char (scanner, line_p, position_p); - if (ch == 0) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_UNEXP_EOF; - (*position_p)++; - break; - } - if (g_scanner_char_2_num (ch, 16) < 0) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_DIGIT_RADIX; - ch = 0; - break; - } - } - else if (config->scan_binary && (ch == 'b' || ch == 'B')) - { - token = G_TOKEN_BINARY; - g_scanner_get_char (scanner, line_p, position_p); - ch = g_scanner_get_char (scanner, line_p, position_p); - if (ch == 0) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_UNEXP_EOF; - (*position_p)++; - break; - } - if (g_scanner_char_2_num (ch, 10) < 0) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - ch = 0; - break; - } - } - else - ch = '0'; - /* fall through */ - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - number_parsing: - { - gboolean in_number = TRUE; - gchar *endptr; - - if (token == G_TOKEN_NONE) - token = G_TOKEN_INT; - - gstring = g_string_new (dotted_float ? "0." : ""); - gstring = g_string_append_c (gstring, ch); - - do /* while (in_number) */ - { - gboolean is_E; - - is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E'); - - ch = g_scanner_peek_next_char (scanner); - - if (g_scanner_char_2_num (ch, 36) >= 0 || - (config->scan_float && ch == '.') || - (is_E && (ch == '+' || ch == '-'))) - { - ch = g_scanner_get_char (scanner, line_p, position_p); - - switch (ch) - { - case '.': - if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL) - { - value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX; - token = G_TOKEN_ERROR; - in_number = FALSE; - } - else - { - token = G_TOKEN_FLOAT; - gstring = g_string_append_c (gstring, ch); - } - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - gstring = g_string_append_c (gstring, ch); - break; - - case '-': - case '+': - if (token != G_TOKEN_FLOAT) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; - } - else - gstring = g_string_append_c (gstring, ch); - break; - - case 'e': - case 'E': - if ((token != G_TOKEN_HEX && !config->scan_float) || - (token != G_TOKEN_HEX && - token != G_TOKEN_OCTAL && - token != G_TOKEN_FLOAT && - token != G_TOKEN_INT)) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; - } - else - { - if (token != G_TOKEN_HEX) - token = G_TOKEN_FLOAT; - gstring = g_string_append_c (gstring, ch); - } - break; - - default: - if (token != G_TOKEN_HEX) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; - } - else - gstring = g_string_append_c (gstring, ch); - break; - } - } - else - in_number = FALSE; - } - while (in_number); - - endptr = NULL; - switch (token) - { - case G_TOKEN_BINARY: - value.v_binary = strtol (gstring->str, &endptr, 2); - break; - - case G_TOKEN_OCTAL: - value.v_octal = strtol (gstring->str, &endptr, 8); - break; - - case G_TOKEN_INT: - value.v_int = strtol (gstring->str, &endptr, 10); - break; - - case G_TOKEN_FLOAT: - value.v_float = g_strtod (gstring->str, &endptr); - break; - - case G_TOKEN_HEX: - value.v_hex = strtol (gstring->str, &endptr, 16); - break; - - default: - break; - } - if (endptr && *endptr) - { - token = G_TOKEN_ERROR; - if (*endptr == 'e' || *endptr == 'E') - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - else - value.v_error = G_ERR_DIGIT_RADIX; - } - g_string_free (gstring, TRUE); - gstring = NULL; - ch = 0; - } /* number_parsing:... */ - break; - - default: - default_case: - { - if (config->cpair_comment_single && - ch == config->cpair_comment_single[0]) - { - token = G_TOKEN_COMMENT_SINGLE; - in_comment_single = TRUE; - gstring = g_string_new (""); - ch = g_scanner_get_char (scanner, line_p, position_p); - while (ch != 0) - { - if (ch == config->cpair_comment_single[1]) - { - in_comment_single = FALSE; - ch = 0; - break; - } - - gstring = g_string_append_c (gstring, ch); - ch = g_scanner_get_char (scanner, line_p, position_p); - } - } - else if (config->scan_identifier && ch && - strchr (config->cset_identifier_first, ch)) - { - identifier_precedence: - - if (config->cset_identifier_nth && ch && - strchr (config->cset_identifier_nth, - g_scanner_peek_next_char (scanner))) - { - token = G_TOKEN_IDENTIFIER; - gstring = g_string_new (""); - gstring = g_string_append_c (gstring, ch); - do - { - ch = g_scanner_get_char (scanner, line_p, position_p); - gstring = g_string_append_c (gstring, ch); - ch = g_scanner_peek_next_char (scanner); - } - while (ch && strchr (config->cset_identifier_nth, ch)); - ch = 0; - } - else if (config->scan_identifier_1char) - { - token = G_TOKEN_IDENTIFIER; - value.v_identifier = g_new0 (gchar, 2); - value.v_identifier[0] = ch; - ch = 0; - } - } - if (ch) - { - if (config->char_2_token) - token = ch; - else - { - token = G_TOKEN_CHAR; - value.v_char = ch; - } - ch = 0; - } - } /* default_case:... */ - break; - } - g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */ - } - while (ch != 0); - - if (in_comment_multi || in_comment_single || - in_string_sq || in_string_dq) - { - token = G_TOKEN_ERROR; - if (gstring) - { - g_string_free (gstring, TRUE); - gstring = NULL; - } - (*position_p)++; - if (in_comment_multi || in_comment_single) - value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT; - else /* (in_string_sq || in_string_dq) */ - value.v_error = G_ERR_UNEXP_EOF_IN_STRING; - } - - if (gstring) - { - value.v_string = gstring->str; - g_string_free (gstring, FALSE); - gstring = NULL; - } - - if (token == G_TOKEN_IDENTIFIER) - { - if (config->scan_symbols) - { - GScannerKey *key; - guint scope_id; - - scope_id = scanner->scope_id; - key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier); - if (!key && scope_id && scanner->config->scope_0_fallback) - key = g_scanner_lookup_internal (scanner, 0, value.v_identifier); - - if (key) - { - g_free (value.v_identifier); - token = G_TOKEN_SYMBOL; - value.v_symbol = key->value; - } - } - - if (token == G_TOKEN_IDENTIFIER && - config->scan_identifier_NULL && - strlen (value.v_identifier) == 4) - { - gchar *null_upper = "NULL"; - gchar *null_lower = "null"; - - if (scanner->config->case_sensitive) - { - if (value.v_identifier[0] == null_upper[0] && - value.v_identifier[1] == null_upper[1] && - value.v_identifier[2] == null_upper[2] && - value.v_identifier[3] == null_upper[3]) - token = G_TOKEN_IDENTIFIER_NULL; - } - else - { - if ((value.v_identifier[0] == null_upper[0] || - value.v_identifier[0] == null_lower[0]) && - (value.v_identifier[1] == null_upper[1] || - value.v_identifier[1] == null_lower[1]) && - (value.v_identifier[2] == null_upper[2] || - value.v_identifier[2] == null_lower[2]) && - (value.v_identifier[3] == null_upper[3] || - value.v_identifier[3] == null_lower[3])) - token = G_TOKEN_IDENTIFIER_NULL; - } - } - } - - *token_p = token; - *value_p = value; -} diff --git a/gscanner.h b/gscanner.h deleted file mode 100644 index d71bbdea..00000000 --- a/gscanner.h +++ /dev/null @@ -1,271 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_SCANNER_H__ -#define __G_SCANNER_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GScanner GScanner; -typedef struct _GScannerConfig GScannerConfig; -typedef union _GTokenValue GTokenValue; - -typedef void (*GScannerMsgFunc) (GScanner *scanner, - gchar *message, - gint error); - -/* GScanner: Flexible lexical scanner for general purpose. - */ - -/* Character sets */ -#define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz" -#define G_CSET_DIGITS "0123456789" -#define G_CSET_LATINC "\300\301\302\303\304\305\306"\ - "\307\310\311\312\313\314\315\316\317\320"\ - "\321\322\323\324\325\326"\ - "\330\331\332\333\334\335\336" -#define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\ - "\347\350\351\352\353\354\355\356\357\360"\ - "\361\362\363\364\365\366"\ - "\370\371\372\373\374\375\376\377" - -/* Error types */ -typedef enum -{ - G_ERR_UNKNOWN, - G_ERR_UNEXP_EOF, - G_ERR_UNEXP_EOF_IN_STRING, - G_ERR_UNEXP_EOF_IN_COMMENT, - G_ERR_NON_DIGIT_IN_CONST, - G_ERR_DIGIT_RADIX, - G_ERR_FLOAT_RADIX, - G_ERR_FLOAT_MALFORMED -} GErrorType; - -/* Token types */ -typedef enum -{ - G_TOKEN_EOF = 0, - - G_TOKEN_LEFT_PAREN = '(', - G_TOKEN_RIGHT_PAREN = ')', - G_TOKEN_LEFT_CURLY = '{', - G_TOKEN_RIGHT_CURLY = '}', - G_TOKEN_LEFT_BRACE = '[', - G_TOKEN_RIGHT_BRACE = ']', - G_TOKEN_EQUAL_SIGN = '=', - G_TOKEN_COMMA = ',', - - G_TOKEN_NONE = 256, - - G_TOKEN_ERROR, - - G_TOKEN_CHAR, - G_TOKEN_BINARY, - G_TOKEN_OCTAL, - G_TOKEN_INT, - G_TOKEN_HEX, - G_TOKEN_FLOAT, - G_TOKEN_STRING, - - G_TOKEN_SYMBOL, - G_TOKEN_IDENTIFIER, - G_TOKEN_IDENTIFIER_NULL, - - G_TOKEN_COMMENT_SINGLE, - G_TOKEN_COMMENT_MULTI, - G_TOKEN_LAST -} GTokenType; - -union _GTokenValue -{ - gpointer v_symbol; - gchar *v_identifier; - gulong v_binary; - gulong v_octal; - gulong v_int; - gdouble v_float; - gulong v_hex; - gchar *v_string; - gchar *v_comment; - guchar v_char; - guint v_error; -}; - -struct _GScannerConfig -{ - /* Character sets - */ - gchar *cset_skip_characters; /* default: " \t\n" */ - gchar *cset_identifier_first; - gchar *cset_identifier_nth; - gchar *cpair_comment_single; /* default: "#\n" */ - - /* Should symbol lookup work case sensitive? - */ - guint case_sensitive : 1; - - /* Boolean values to be adjusted "on the fly" - * to configure scanning behaviour. - */ - guint skip_comment_multi : 1; /* C like comment */ - guint skip_comment_single : 1; /* single line comment */ - guint scan_comment_multi : 1; /* scan multi line comments? */ - guint scan_identifier : 1; - guint scan_identifier_1char : 1; - guint scan_identifier_NULL : 1; - guint scan_symbols : 1; - guint scan_binary : 1; - guint scan_octal : 1; - guint scan_float : 1; - guint scan_hex : 1; /* `0x0ff0' */ - guint scan_hex_dollar : 1; /* `$0ff0' */ - guint scan_string_sq : 1; /* string: 'anything' */ - guint scan_string_dq : 1; /* string: "\\-escapes!\n" */ - guint numbers_2_int : 1; /* bin, octal, hex => int */ - guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */ - guint identifier_2_string : 1; - guint char_2_token : 1; /* return G_TOKEN_CHAR? */ - guint symbol_2_token : 1; - guint scope_0_fallback : 1; /* try scope 0 on lookups? */ -}; - -struct _GScanner -{ - /* unused fields */ - gpointer user_data; - guint max_parse_errors; - - /* g_scanner_error() increments this field */ - guint parse_errors; - - /* name of input stream, featured by the default message handler */ - const gchar *input_name; - - /* quarked data */ - GData *qdata; - - /* link into the scanner configuration */ - GScannerConfig *config; - - /* fields filled in after g_scanner_get_next_token() */ - GTokenType token; - GTokenValue value; - guint line; - guint position; - - /* fields filled in after g_scanner_peek_next_token() */ - GTokenType next_token; - GTokenValue next_value; - guint next_line; - guint next_position; - - /* to be considered private */ - GHashTable *symbol_table; - gint input_fd; - const gchar *text; - const gchar *text_end; - gchar *buffer; - guint scope_id; - - /* handler function for _warn and _error */ - GScannerMsgFunc msg_handler; -}; - -GScanner* g_scanner_new (const GScannerConfig *config_templ); -void g_scanner_destroy (GScanner *scanner); -void g_scanner_input_file (GScanner *scanner, - gint input_fd); -void g_scanner_sync_file_offset (GScanner *scanner); -void g_scanner_input_text (GScanner *scanner, - const gchar *text, - guint text_len); -GTokenType g_scanner_get_next_token (GScanner *scanner); -GTokenType g_scanner_peek_next_token (GScanner *scanner); -GTokenType g_scanner_cur_token (GScanner *scanner); -GTokenValue g_scanner_cur_value (GScanner *scanner); -guint g_scanner_cur_line (GScanner *scanner); -guint g_scanner_cur_position (GScanner *scanner); -gboolean g_scanner_eof (GScanner *scanner); -guint g_scanner_set_scope (GScanner *scanner, - guint scope_id); -void g_scanner_scope_add_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol, - gpointer value); -void g_scanner_scope_remove_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol); -gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, - guint scope_id, - const gchar *symbol); -void g_scanner_scope_foreach_symbol (GScanner *scanner, - guint scope_id, - GHFunc func, - gpointer user_data); -gpointer g_scanner_lookup_symbol (GScanner *scanner, - const gchar *symbol); -void g_scanner_unexp_token (GScanner *scanner, - GTokenType expected_token, - const gchar *identifier_spec, - const gchar *symbol_spec, - const gchar *symbol_name, - const gchar *message, - gint is_error); -void g_scanner_error (GScanner *scanner, - const gchar *format, - ...) G_GNUC_PRINTF (2,3); -void g_scanner_warn (GScanner *scanner, - const gchar *format, - ...) G_GNUC_PRINTF (2,3); -gint g_scanner_stat_mode (const gchar *filename); -/* keep downward source compatibility */ -#define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \ - g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \ -} G_STMT_END -#define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \ - g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \ -} G_STMT_END -#define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \ - g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \ -} G_STMT_END - -#ifndef G_DISABLE_DEPRECATED - -/* The following two functions are deprecated and will be removed in - * the next major release. They do no good. */ -#define g_scanner_freeze_symbol_table(scanner) ((void)0) -#define g_scanner_thaw_symbol_table(scanner) ((void)0) - -#endif /* G_DISABLE_DEPRECATED */ - -G_END_DECLS - -#endif /* __G_SCANNER_H__ */ - diff --git a/gshell.c b/gshell.c deleted file mode 100644 index 79db9d36..00000000 --- a/gshell.c +++ /dev/null @@ -1,651 +0,0 @@ -/* gshell.c - Shell-related utilities - * - * Copyright 2000 Red Hat, Inc. - * g_execvpe implementation based on GNU libc execvp: - * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. - * - * GLib 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. - * - * GLib 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 GLib; 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 "glib.h" -#include - -#ifdef _ -#warning "FIXME remove gettext hack" -#endif - -#include "glibintl.h" - -GQuark -g_shell_error_quark (void) -{ - static GQuark quark = 0; - if (quark == 0) - quark = g_quark_from_static_string ("g-shell-error-quark"); - return quark; -} - -/* Single quotes preserve the literal string exactly. escape - * sequences are not allowed; not even \' - if you want a ' - * in the quoted text, you have to do something like 'foo'\''bar' - * - * Double quotes allow $ ` " \ and newline to be escaped with backslash. - * Otherwise double quotes preserve things literally. - */ - -static gboolean -unquote_string_inplace (gchar* str, gchar** end, GError** err) -{ - gchar* dest; - gchar* s; - gchar quote_char; - - g_return_val_if_fail(end != NULL, FALSE); - g_return_val_if_fail(err == NULL || *err == NULL, FALSE); - g_return_val_if_fail(str != NULL, FALSE); - - dest = s = str; - - quote_char = *s; - - if (!(*s == '"' || *s == '\'')) - { - if (err) - *err = g_error_new(G_SHELL_ERROR, - G_SHELL_ERROR_BAD_QUOTING, - _("Quoted text doesn't begin with a quotation mark")); - *end = str; - return FALSE; - } - - /* Skip the initial quote mark */ - ++s; - - if (quote_char == '"') - { - while (*s) - { - g_assert(s > dest); /* loop invariant */ - - switch (*s) - { - case '"': - /* End of the string, return now */ - *dest = '\0'; - ++s; - *end = s; - return TRUE; - break; - - case '\\': - /* Possible escaped quote or \ */ - ++s; - switch (*s) - { - case '"': - case '\\': - case '`': - case '$': - case '\n': - *dest = *s; - ++s; - ++dest; - break; - - default: - /* not an escaped char */ - *dest = '\\'; - ++dest; - /* ++s already done. */ - break; - } - break; - - default: - *dest = *s; - ++dest; - ++s; - break; - } - - g_assert(s > dest); /* loop invariant */ - } - } - else - { - while (*s) - { - g_assert(s > dest); /* loop invariant */ - - if (*s == '\'') - { - /* End of the string, return now */ - *dest = '\0'; - ++s; - *end = s; - return TRUE; - } - else - { - *dest = *s; - ++dest; - ++s; - } - - g_assert(s > dest); /* loop invariant */ - } - } - - /* If we reach here this means the close quote was never encountered */ - - *dest = '\0'; - - if (err) - *err = g_error_new(G_SHELL_ERROR, - G_SHELL_ERROR_BAD_QUOTING, - _("Unmatched quotation mark in command line or other shell-quoted text")); - *end = s; - return FALSE; -} - -/** - * g_shell_quote: - * @unquoted_string: a literal string - * - * Quotes a string so that the shell (/bin/sh) will interpret the - * quoted string to mean @unquoted_string. If you pass a filename to - * the shell, for example, you should first quote it with this - * function. The return value must be freed with g_free(). The - * quoting style used is undefined (single or double quotes may be - * used). - * - * Return value: quoted string - **/ -gchar* -g_shell_quote (const gchar *unquoted_string) -{ - /* We always use single quotes, because the algorithm is cheesier. - * We could use double if we felt like it, that might be more - * human-readable. - */ - - const gchar *p; - GString *dest; - - g_return_val_if_fail (unquoted_string != NULL, NULL); - - dest = g_string_new ("'"); - - p = unquoted_string; - - /* could speed this up a lot by appending chunks of text at a - * time. - */ - while (*p) - { - /* Replace literal ' with a close ', a \', and a open ' */ - if (*p == '\'') - g_string_append (dest, "'\''"); - else - g_string_append_c (dest, *p); - - ++p; - } - - /* close the quote */ - g_string_append_c (dest, '\''); - - return g_string_free (dest, FALSE); -} - -/** - * g_shell_unquote: - * @quoted_string: shell-quoted string - * @error: error return location or NULL - * - * Unquotes a string as the shell (/bin/sh) would. Only handles - * quotes; if a string contains file globs, arithmetic operators, - * variables, backticks, redirections, or other special-to-the-shell - * features, the result will be different from the result a real shell - * would produce (the variables, backticks, etc. will be passed - * through literally instead of being expanded). This function is - * guaranteed to succeed if applied to the result of - * g_shell_quote(). If it fails, it returns NULL and sets the - * error. The @quoted_string need not actually contain quoted or - * escaped text; g_shell_unquote() simply goes through the string and - * unquotes/unescapes anything that the shell would. Both single and - * double quotes are handled, as are escapes including escaped - * newlines. The return value must be freed with g_free(). Possible - * errors are in the #G_SHELL_ERROR domain. - * - * Return value: an unquoted string - **/ -gchar* -g_shell_unquote (const gchar *quoted_string, - GError **error) -{ - gchar *unquoted; - gchar *end; - gchar *start; - GString *retval; - - g_return_val_if_fail (quoted_string != NULL, NULL); - - unquoted = g_strdup (quoted_string); - - start = unquoted; - end = unquoted; - retval = g_string_new (""); - - /* The loop allows cases such as - * "foo"blah blah'bar'woo foo"baz"la la la\'\''foo' - */ - while (*start) - { - /* Append all non-quoted chars, honoring backslash escape - */ - - while (*start && !(*start == '"' || *start == '\'')) - { - if (*start == '\\') - { - /* all characters can get escaped by backslash, - * except newline, which is removed if it follows - * a backslash outside of quotes - */ - - ++start; - if (*start) - { - if (*start != '\n') - g_string_append_c (retval, *start); - ++start; - } - } - else - { - g_string_append_c (retval, *start); - ++start; - } - } - - if (*start) - { - if (!unquote_string_inplace (start, &end, error)) - { - goto error; - } - else - { - g_string_append (retval, start); - start = end; - } - } - } - - return g_string_free (retval, FALSE); - - error: - g_assert (error == NULL || *error != NULL); - - g_free (unquoted); - g_string_free (retval, TRUE); - return NULL; -} - -/* g_parse_argv() does a semi-arbitrary weird subset of the way - * the shell parses a command line. We don't do variable expansion, - * don't understand that operators are tokens, don't do tilde expansion, - * don't do command substitution, no arithmetic expansion, IFS gets ignored, - * don't do filename globs, don't remove redirection stuff, etc. - * - * READ THE UNIX98 SPEC on "Shell Command Language" before changing - * the behavior of this code. - * - * Steps to parsing the argv string: - * - * - tokenize the string (but since we ignore operators, - * our tokenization may diverge from what the shell would do) - * note that tokenization ignores the internals of a quoted - * word and it always splits on spaces, not on IFS even - * if we used IFS. We also ignore "end of input indicator" - * (I guess this is control-D?) - * - * Tokenization steps, from UNIX98 with operator stuff removed, - * are: - * - * 1) "If the current character is backslash, single-quote or - * double-quote (\, ' or ") and it is not quoted, it will affect - * quoting for subsequent characters up to the end of the quoted - * text. The rules for quoting are as described in Quoting - * . During token recognition no substitutions will be actually - * performed, and the result token will contain exactly the - * characters that appear in the input (except for newline - * character joining), unmodified, including any embedded or - * enclosing quotes or substitution operators, between the quote - * mark and the end of the quoted text. The token will not be - * delimited by the end of the quoted field." - * - * 2) "If the current character is an unquoted newline character, - * the current token will be delimited." - * - * 3) "If the current character is an unquoted blank character, any - * token containing the previous character is delimited and the - * current character will be discarded." - * - * 4) "If the previous character was part of a word, the current - * character will be appended to that word." - * - * 5) "If the current character is a "#", it and all subsequent - * characters up to, but excluding, the next newline character - * will be discarded as a comment. The newline character that - * ends the line is not considered part of the comment. The - * "#" starts a comment only when it is at the beginning of a - * token. Since the search for the end-of-comment does not - * consider an escaped newline character specially, a comment - * cannot be continued to the next line." - * - * 6) "The current character will be used as the start of a new word." - * - * - * - for each token (word), perform portions of word expansion, namely - * field splitting (using default whitespace IFS) and quote - * removal. Field splitting may increase the number of words. - * Quote removal does not increase the number of words. - * - * "If the complete expansion appropriate for a word results in an - * empty field, that empty field will be deleted from the list of - * fields that form the completely expanded command, unless the - * original word contained single-quote or double-quote characters." - * - UNIX98 spec - * - * - */ - -static inline void -ensure_token (GString **token) -{ - if (*token == NULL) - *token = g_string_new (""); -} - -static void -delimit_token (GString **token, - GSList **retval) -{ - if (*token == NULL) - return; - - *retval = g_slist_prepend (*retval, g_string_free (*token, FALSE)); - - *token = NULL; -} - -static GSList* -tokenize_command_line (const gchar *command_line, - GError **error) -{ - gchar current_quote; - const gchar *p; - GString *current_token = NULL; - GSList *retval = NULL; - - current_quote = '\0'; - p = command_line; - - while (*p) - { - if (current_quote == '\\') - { - if (*p == '\n') - { - /* we append nothing; backslash-newline become nothing */ - } - else - { - /* we append the backslash and the current char, - * to be interpreted later after tokenization - */ - ensure_token (¤t_token); - g_string_append_c (current_token, '\\'); - g_string_append_c (current_token, *p); - } - - current_quote = '\0'; - } - else if (current_quote == '#') - { - /* Discard up to and including next newline */ - while (*p && *p != '\n') - ++p; - - current_quote = '\0'; - - if (*p == '\0') - break; - } - else if (current_quote) - { - if (*p == current_quote && - /* check that it isn't an escaped double quote */ - !(current_quote == '"' && p != command_line && *(p - 1) == '\\')) - { - /* close the quote */ - current_quote = '\0'; - } - - /* Everything inside quotes, and the close quote, - * gets appended literally. - */ - - ensure_token (¤t_token); - g_string_append_c (current_token, *p); - } - else - { - switch (*p) - { - case '\n': - delimit_token (¤t_token, &retval); - break; - - case ' ': - case '\t': - /* If the current token contains the previous char, delimit - * the current token. A nonzero length - * token should always contain the previous char. - */ - if (current_token && - current_token->len > 0) - { - delimit_token (¤t_token, &retval); - } - - /* discard all unquoted blanks (don't add them to a token) */ - break; - - - /* single/double quotes are appended to the token, - * escapes are maybe appended next time through the loop, - * comment chars are never appended. - */ - - case '\'': - case '"': - ensure_token (¤t_token); - g_string_append_c (current_token, *p); - - /* FALL THRU */ - - case '#': - case '\\': - current_quote = *p; - break; - - default: - /* Combines rules 4) and 6) - if we have a token, append to it, - * otherwise create a new token. - */ - ensure_token (¤t_token); - g_string_append_c (current_token, *p); - break; - } - } - - ++p; - } - - delimit_token (¤t_token, &retval); - - if (current_quote) - { - if (current_quote == '\\') - g_set_error (error, - G_SHELL_ERROR, - G_SHELL_ERROR_BAD_QUOTING, - _("Text ended just after a '\' character." - " (The text was '%s')"), - command_line); - else - g_set_error (error, - G_SHELL_ERROR, - G_SHELL_ERROR_BAD_QUOTING, - _("Text ended before matching quote was found for %c." - " (The text was '%s')"), - current_quote, command_line); - - goto error; - } - - if (retval == NULL) - { - g_set_error (error, - G_SHELL_ERROR, - G_SHELL_ERROR_EMPTY_STRING, - _("Text was empty (or contained only whitespace)")); - - goto error; - } - - /* we appended backward */ - retval = g_slist_reverse (retval); - - return retval; - - error: - g_assert (error == NULL || *error != NULL); - - if (retval) - { - g_slist_foreach (retval, (GFunc)g_free, NULL); - g_slist_free (retval); - } - - return NULL; -} - -/** - * g_shell_parse_argv: - * @command_line: command line to parse - * @argcp: return location for number of args - * @argvp: return location for array of args - * @error: return location for error - * - * Parses a command line into an argument vector, in much the same way - * the shell would, but without many of the expansions the shell would - * perform (variable expansion, globs, operators, filename expansion, - * etc. are not supported). The results are defined to be the same as - * those you would get from a UNIX98 /bin/sh, as long as the input - * contains none of the unsupported shell expansions. If the input - * does contain such expansions, they are passed through - * literally. Possible errors are those from the #G_SHELL_ERROR - * domain. - * - * Return value: TRUE on success, FALSE if error set - **/ -gboolean -g_shell_parse_argv (const gchar *command_line, - gint *argcp, - gchar ***argvp, - GError **error) -{ - /* Code based on poptParseArgvString() from libpopt */ - gint argc = 0; - gchar **argv = NULL; - GSList *tokens = NULL; - gint i; - GSList *tmp_list; - - g_return_val_if_fail (command_line != NULL, FALSE); - - tokens = tokenize_command_line (command_line, error); - if (tokens == NULL) - return FALSE; - - /* Because we can't have introduced any new blank space into the - * tokens (we didn't do any new expansions), we don't need to - * perform field splitting. If we were going to honor IFS or do any - * expansions, we would have to do field splitting on each word - * here. Also, if we were going to do any expansion we would need to - * remove any zero-length words that didn't contain quotes - * originally; but since there's no expansion we know all words have - * nonzero length, unless they contain quotes. - * - * So, we simply remove quotes, and don't do any field splitting or - * empty word removal, since we know there was no way to introduce - * such things. - */ - - argc = g_slist_length (tokens); - argv = g_new0 (gchar*, argc + 1); - i = 0; - tmp_list = tokens; - while (tmp_list) - { - argv[i] = g_shell_unquote (tmp_list->data, error); - - /* Since we already checked that quotes matched up in the - * tokenizer, this shouldn't be possible to reach I guess. - */ - if (argv[i] == NULL) - goto failed; - - tmp_list = g_slist_next (tmp_list); - ++i; - } - - g_slist_foreach (tokens, (GFunc)g_free, NULL); - g_slist_free (tokens); - - if (argcp) - *argcp = argc; - - if (argvp) - *argvp = argv; - else - g_strfreev (argv); - - return TRUE; - - failed: - - g_assert (error == NULL || *error != NULL); - g_strfreev (argv); - g_slist_foreach (tokens, (GFunc) g_free, NULL); - g_slist_free (tokens); - - return FALSE; -} diff --git a/gshell.h b/gshell.h deleted file mode 100644 index c433cbae..00000000 --- a/gshell.h +++ /dev/null @@ -1,53 +0,0 @@ -/* gshell.h - Shell-related utilities - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, write - * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __G_SHELL_H__ -#define __G_SHELL_H__ - -#include - -G_BEGIN_DECLS - -#define G_SHELL_ERROR g_shell_error_quark () - -typedef enum -{ - /* mismatched or otherwise mangled quoting */ - G_SHELL_ERROR_BAD_QUOTING, - /* string to be parsed was empty */ - G_SHELL_ERROR_EMPTY_STRING, - G_SHELL_ERROR_FAILED -} GShellError; - -GQuark g_shell_error_quark (void); - -gchar* g_shell_quote (const gchar *unquoted_string); -gchar* g_shell_unquote (const gchar *quoted_string, - GError **error); -gboolean g_shell_parse_argv (const gchar *command_line, - gint *argcp, - gchar ***argvp, - GError **error); - -G_END_DECLS - -#endif /* __G_SHELL_H__ */ - - diff --git a/gslist.c b/gslist.c deleted file mode 100644 index 4dafb98b..00000000 --- a/gslist.c +++ /dev/null @@ -1,728 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - - -#ifndef DISABLE_MEM_POOLS -struct _GAllocator /* from gmem.c */ -{ - gchar *name; - guint16 n_preallocs; - guint is_unused : 1; - guint type : 4; - GAllocator *last; - GMemChunk *mem_chunk; - GSList *free_lists; /* implementation specific */ -}; - -G_LOCK_DEFINE_STATIC (current_allocator); -static GAllocator *current_allocator = NULL; - -/* HOLDS: current_allocator_lock */ -static void -g_slist_validate_allocator (GAllocator *allocator) -{ - g_return_if_fail (allocator != NULL); - g_return_if_fail (allocator->is_unused == TRUE); - - if (allocator->type != G_ALLOCATOR_SLIST) - { - allocator->type = G_ALLOCATOR_SLIST; - if (allocator->mem_chunk) - { - g_mem_chunk_destroy (allocator->mem_chunk); - allocator->mem_chunk = NULL; - } - } - - if (!allocator->mem_chunk) - { - allocator->mem_chunk = g_mem_chunk_new (allocator->name, - sizeof (GSList), - sizeof (GSList) * allocator->n_preallocs, - G_ALLOC_ONLY); - allocator->free_lists = NULL; - } - - allocator->is_unused = FALSE; -} - -void -g_slist_push_allocator (GAllocator *allocator) -{ - G_LOCK (current_allocator); - g_slist_validate_allocator (allocator); - allocator->last = current_allocator; - current_allocator = allocator; - G_UNLOCK (current_allocator); -} - -void -g_slist_pop_allocator (void) -{ - G_LOCK (current_allocator); - if (current_allocator) - { - GAllocator *allocator; - - allocator = current_allocator; - current_allocator = allocator->last; - allocator->last = NULL; - allocator->is_unused = TRUE; - } - G_UNLOCK (current_allocator); -} - -static inline GSList* -_g_slist_alloc (void) -{ - GSList *list; - - G_LOCK (current_allocator); - if (!current_allocator) - { - GAllocator *allocator = g_allocator_new ("GLib default GSList allocator", - 128); - g_slist_validate_allocator (allocator); - allocator->last = NULL; - current_allocator = allocator; - } - if (!current_allocator->free_lists) - { - list = g_chunk_new (GSList, current_allocator->mem_chunk); - list->data = NULL; - } - else - { - if (current_allocator->free_lists->data) - { - list = current_allocator->free_lists->data; - current_allocator->free_lists->data = list->next; - list->data = NULL; - } - else - { - list = current_allocator->free_lists; - current_allocator->free_lists = list->next; - } - } - G_UNLOCK (current_allocator); - - list->next = NULL; - - return list; -} - -GSList* -g_slist_alloc (void) -{ - return _g_slist_alloc (); -} - -void -g_slist_free (GSList *list) -{ - if (list) - { - GSList *last_node = list; - -#ifdef ENABLE_GC_FRIENDLY - while (last_node->next) - { - last_node->data = NULL; - last_node = last_node->next; - } - last_node->data = NULL; -#else /* !ENABLE_GC_FRIENDLY */ - list->data = list->next; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (current_allocator); - last_node->next = current_allocator->free_lists; - current_allocator->free_lists = list; - G_UNLOCK (current_allocator); - } -} - -static inline void -_g_slist_free_1 (GSList *list) -{ - if (list) - { - list->data = NULL; - G_LOCK (current_allocator); - list->next = current_allocator->free_lists; - current_allocator->free_lists = list; - G_UNLOCK (current_allocator); - } -} - -void -g_slist_free_1 (GSList *list) -{ - _g_slist_free_1 (list); -} -#else /* DISABLE_MEM_POOLS */ - -#define _g_slist_alloc g_slist_alloc -GSList* -g_slist_alloc (void) -{ - GSList *list; - - list = g_new0 (GSList, 1); - - return list; -} - -void -g_slist_free (GSList *list) -{ - GSList *last; - - while (list) - { - last = list; - list = list->next; - g_free (last); - } -} - -#define _g_slist_free_1 g_slist_free_1 -void -g_slist_free_1 (GSList *list) -{ - g_free (list); -} - -#endif - -GSList* -g_slist_append (GSList *list, - gpointer data) -{ - GSList *new_list; - GSList *last; - - new_list = _g_slist_alloc (); - new_list->data = data; - - if (list) - { - last = g_slist_last (list); - /* g_assert (last != NULL); */ - last->next = new_list; - - return list; - } - else - return new_list; -} - -GSList* -g_slist_prepend (GSList *list, - gpointer data) -{ - GSList *new_list; - - new_list = _g_slist_alloc (); - new_list->data = data; - new_list->next = list; - - return new_list; -} - -GSList* -g_slist_insert (GSList *list, - gpointer data, - gint position) -{ - GSList *prev_list; - GSList *tmp_list; - GSList *new_list; - - if (position < 0) - return g_slist_append (list, data); - else if (position == 0) - return g_slist_prepend (list, data); - - new_list = _g_slist_alloc (); - new_list->data = data; - - if (!list) - return new_list; - - prev_list = NULL; - tmp_list = list; - - while ((position-- > 0) && tmp_list) - { - prev_list = tmp_list; - tmp_list = tmp_list->next; - } - - if (prev_list) - { - new_list->next = prev_list->next; - prev_list->next = new_list; - } - else - { - new_list->next = list; - list = new_list; - } - - return list; -} - -GSList * -g_slist_concat (GSList *list1, GSList *list2) -{ - if (list2) - { - if (list1) - g_slist_last (list1)->next = list2; - else - list1 = list2; - } - - return list1; -} - -GSList* -g_slist_remove (GSList *list, - gconstpointer data) -{ - GSList *tmp, *prev = NULL; - - tmp = list; - while (tmp) - { - if (tmp->data == data) - { - if (prev) - prev->next = tmp->next; - else - list = tmp->next; - - g_slist_free_1 (tmp); - break; - } - prev = tmp; - tmp = prev->next; - } - - return list; -} - -GSList* -g_slist_remove_all (GSList *list, - gconstpointer data) -{ - GSList *tmp, *prev = NULL; - - tmp = list; - while (tmp) - { - if (tmp->data == data) - { - GSList *next = tmp->next; - - if (prev) - prev->next = next; - else - list = next; - - g_slist_free_1 (tmp); - tmp = next; - } - else - { - prev = tmp; - tmp = prev->next; - } - } - - return list; -} - -static inline GSList* -_g_slist_remove_link (GSList *list, - GSList *link) -{ - GSList *tmp; - GSList *prev; - - prev = NULL; - tmp = list; - - while (tmp) - { - if (tmp == link) - { - if (prev) - prev->next = tmp->next; - if (list == tmp) - list = list->next; - - tmp->next = NULL; - break; - } - - prev = tmp; - tmp = tmp->next; - } - - return list; -} - -GSList* -g_slist_remove_link (GSList *list, - GSList *link) -{ - return _g_slist_remove_link (list, link); -} - -GSList* -g_slist_delete_link (GSList *list, - GSList *link) -{ - list = _g_slist_remove_link (list, link); - _g_slist_free_1 (link); - - return list; -} - -GSList* -g_slist_copy (GSList *list) -{ - GSList *new_list = NULL; - - if (list) - { - GSList *last; - - new_list = _g_slist_alloc (); - new_list->data = list->data; - last = new_list; - list = list->next; - while (list) - { - last->next = _g_slist_alloc (); - last = last->next; - last->data = list->data; - list = list->next; - } - } - - return new_list; -} - -GSList* -g_slist_reverse (GSList *list) -{ - GSList *prev = NULL; - - while (list) - { - GSList *next = list->next; - - list->next = prev; - - prev = list; - list = next; - } - - return prev; -} - -GSList* -g_slist_nth (GSList *list, - guint n) -{ - while (n-- > 0 && list) - list = list->next; - - return list; -} - -gpointer -g_slist_nth_data (GSList *list, - guint n) -{ - while (n-- > 0 && list) - list = list->next; - - return list ? list->data : NULL; -} - -GSList* -g_slist_find (GSList *list, - gconstpointer data) -{ - while (list) - { - if (list->data == data) - break; - list = list->next; - } - - return list; -} - -GSList* -g_slist_find_custom (GSList *list, - gconstpointer data, - GCompareFunc func) -{ - g_return_val_if_fail (func != NULL, list); - - while (list) - { - if (! func (list->data, data)) - return list; - list = list->next; - } - - return NULL; -} - -gint -g_slist_position (GSList *list, - GSList *link) -{ - gint i; - - i = 0; - while (list) - { - if (list == link) - return i; - i++; - list = list->next; - } - - return -1; -} - -gint -g_slist_index (GSList *list, - gconstpointer data) -{ - gint i; - - i = 0; - while (list) - { - if (list->data == data) - return i; - i++; - list = list->next; - } - - return -1; -} - -GSList* -g_slist_last (GSList *list) -{ - if (list) - { - while (list->next) - list = list->next; - } - - return list; -} - -guint -g_slist_length (GSList *list) -{ - guint length; - - length = 0; - while (list) - { - length++; - list = list->next; - } - - return length; -} - -void -g_slist_foreach (GSList *list, - GFunc func, - gpointer user_data) -{ - while (list) - { - GSList *next = list->next; - (*func) (list->data, user_data); - list = next; - } -} - -GSList* -g_slist_insert_sorted (GSList *list, - gpointer data, - GCompareFunc func) -{ - GSList *tmp_list = list; - GSList *prev_list = NULL; - GSList *new_list; - gint cmp; - - g_return_val_if_fail (func != NULL, list); - - if (!list) - { - new_list = _g_slist_alloc (); - new_list->data = data; - return new_list; - } - - cmp = (*func) (data, tmp_list->data); - - while ((tmp_list->next) && (cmp > 0)) - { - prev_list = tmp_list; - tmp_list = tmp_list->next; - cmp = (*func) (data, tmp_list->data); - } - - new_list = _g_slist_alloc (); - new_list->data = data; - - if ((!tmp_list->next) && (cmp > 0)) - { - tmp_list->next = new_list; - return list; - } - - if (prev_list) - { - prev_list->next = new_list; - new_list->next = tmp_list; - return list; - } - else - { - new_list->next = list; - return new_list; - } -} - -static GSList * -g_slist_sort_merge (GSList *l1, - GSList *l2, - GFunc compare_func, - gboolean use_data, - gpointer user_data) -{ - GSList list, *l; - gint cmp; - - l=&list; - - while (l1 && l2) - { - if (use_data) - cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); - else - cmp = ((GCompareFunc) compare_func) (l1->data, l2->data); - - if (cmp <= 0) - { - l=l->next=l1; - l1=l1->next; - } - else - { - l=l->next=l2; - l2=l2->next; - } - } - l->next= l1 ? l1 : l2; - - return list.next; -} - -static GSList * -g_slist_sort_real (GSList *list, - GFunc compare_func, - gboolean use_data, - gpointer user_data) -{ - GSList *l1, *l2; - - if (!list) - return NULL; - if (!list->next) - return list; - - l1 = list; - l2 = list->next; - - while ((l2 = l2->next) != NULL) - { - if ((l2 = l2->next) == NULL) - break; - l1=l1->next; - } - l2 = l1->next; - l1->next = NULL; - - return g_slist_sort_merge (g_slist_sort_real (list, compare_func, use_data, user_data), - g_slist_sort_real (l2, compare_func, use_data, user_data), - compare_func, - use_data, - user_data); -} - -GSList * -g_slist_sort (GSList *list, - GCompareFunc compare_func) -{ - return g_slist_sort_real (list, (GFunc) compare_func, FALSE, NULL); -} - -GSList * -g_slist_sort_with_data (GSList *list, - GCompareDataFunc compare_func, - gpointer user_data) -{ - return g_slist_sort_real (list, (GFunc) compare_func, TRUE, user_data); -} diff --git a/gslist.h b/gslist.h deleted file mode 100644 index 00d3fc33..00000000 --- a/gslist.h +++ /dev/null @@ -1,102 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_SLIST_H__ -#define __G_SLIST_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GSList GSList; - -struct _GSList -{ - gpointer data; - GSList *next; -}; - -/* Singly linked lists - */ -void g_slist_push_allocator (GAllocator *allocator); -void g_slist_pop_allocator (void); -GSList* g_slist_alloc (void); -void g_slist_free (GSList *list); -void g_slist_free_1 (GSList *list); -GSList* g_slist_append (GSList *list, - gpointer data); -GSList* g_slist_prepend (GSList *list, - gpointer data); -GSList* g_slist_insert (GSList *list, - gpointer data, - gint position); -GSList* g_slist_insert_sorted (GSList *list, - gpointer data, - GCompareFunc func); -GSList* g_slist_insert_before (GSList *slist, - GSList *sibling, - gpointer data); -GSList* g_slist_concat (GSList *list1, - GSList *list2); -GSList* g_slist_remove (GSList *list, - gconstpointer data); -GSList* g_slist_remove_all (GSList *list, - gconstpointer data); -GSList* g_slist_remove_link (GSList *list, - GSList *link); -GSList* g_slist_delete_link (GSList *list, - GSList *link); -GSList* g_slist_reverse (GSList *list); -GSList* g_slist_copy (GSList *list); -GSList* g_slist_nth (GSList *list, - guint n); -GSList* g_slist_find (GSList *list, - gconstpointer data); -GSList* g_slist_find_custom (GSList *list, - gconstpointer data, - GCompareFunc func); -gint g_slist_position (GSList *list, - GSList *llink); -gint g_slist_index (GSList *list, - gconstpointer data); -GSList* g_slist_last (GSList *list); -guint g_slist_length (GSList *list); -void g_slist_foreach (GSList *list, - GFunc func, - gpointer user_data); -GSList* g_slist_sort (GSList *list, - GCompareFunc compare_func); -GSList* g_slist_sort_with_data (GSList *list, - GCompareDataFunc compare_func, - gpointer user_data); -gpointer g_slist_nth_data (GSList *list, - guint n); -#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) - -G_END_DECLS - -#endif /* __G_SLIST_H__ */ - diff --git a/gspawn-win32-helper.c b/gspawn-win32-helper.c deleted file mode 100644 index cd419b2f..00000000 --- a/gspawn-win32-helper.c +++ /dev/null @@ -1,218 +0,0 @@ -/* gspawn-win32-helper.c - Helper program for process launching on Win32. - * - * Copyright 2000 Red Hat, Inc. - * Copyright 2000 Tor Lillqvist - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, write - * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#undef G_LOG_DOMAIN -#include "glib.h" -#define GSPAWN_HELPER -#include "gspawn-win32.c" /* For shared definitions */ - -static void -write_err_and_exit (gint fd, - gint msg) -{ - gint en = errno; - - write (fd, &msg, sizeof(msg)); - write (fd, &en, sizeof(en)); - - _exit (1); -} - -#ifdef __GNUC__ -# ifndef _stdcall -# define _stdcall __attribute__((stdcall)) -# endif -#endif - -/* We build gspawn-win32-helper.exe as a Windows GUI application - * to avoid any temporarily flashing console windows in case - * the gspawn function is invoked by a GUI program. Thus, no main() - * but a WinMain(). We do, however, still use argc and argv tucked - * away in the global __argc and __argv by the C runtime startup code. - */ - -int _stdcall -WinMain (struct HINSTANCE__ *hInstance, - struct HINSTANCE__ *hPrevInstance, - char *lpszCmdLine, - int nCmdShow) -{ - int child_err_report_fd; - int i; - int fd; - int mode; - GString *debugstring; - - SETUP_DEBUG(); - - if (debug) - { - debugstring = g_string_new (""); - - g_string_append (debugstring, - g_strdup_printf ("g-spawn-win32-helper: " - "argc = %d, argv: ", - __argc)); - for (i = 0; i < __argc; i++) - { - if (i > 0) - g_string_append (debugstring, " "); - g_string_append (debugstring, __argv[i]); - } - - MessageBox (NULL, debugstring->str, "gspawn-win32-helper", 0); - } - - g_assert (__argc >= ARG_COUNT); - - /* argv[ARG_CHILD_ERR_REPORT] is the file descriptor onto which - * write error messages. - */ - child_err_report_fd = atoi (__argv[ARG_CHILD_ERR_REPORT]); - - /* argv[ARG_STDIN..ARG_STDERR] are the file descriptors that should - * be dup2'd to stdin, stdout and stderr, '-' if the corresponding - * std* should be let alone, and 'z' if it should be connected to - * the bit bucket NUL:. - */ - if (__argv[ARG_STDIN][0] == '-') - ; /* Nothing */ - else if (__argv[ARG_STDIN][0] == 'z') - { - fd = open ("NUL:", O_RDONLY); - if (fd != 0) - { - dup2 (fd, 0); - close (fd); - } - } - else - { - fd = atoi (__argv[ARG_STDIN]); - if (fd != 0) - { - dup2 (fd, 0); - close (fd); - } - } - - if (__argv[ARG_STDOUT][0] == '-') - ; /* Nothing */ - else if (__argv[ARG_STDOUT][0] == 'z') - { - fd = open ("NUL:", O_WRONLY); - if (fd != 1) - { - dup2 (fd, 1); - close (fd); - } - } - else - { - fd = atoi (__argv[ARG_STDOUT]); - if (fd != 1) - { - dup2 (fd, 1); - close (fd); - } - } - - if (__argv[ARG_STDERR][0] == '-') - ; /* Nothing */ - else if (__argv[ARG_STDERR][0] == 'z') - { - fd = open ("NUL:", O_WRONLY); - if (fd != 2) - { - dup2 (fd, 2); - close (fd); - } - } - else - { - fd = atoi (__argv[ARG_STDERR]); - if (fd != 2) - { - dup2 (fd, 2); - close (fd); - } - } - - /* __argv[ARG_WORKING_DIRECTORY] is the directory in which to run the - * process. If "-", don't change directory. - */ - if (__argv[ARG_WORKING_DIRECTORY][0] == '-' && - __argv[ARG_WORKING_DIRECTORY][1] == 0) - ; /* Nothing */ - else if (chdir (__argv[ARG_WORKING_DIRECTORY]) < 0) - write_err_and_exit (child_err_report_fd, - CHILD_CHDIR_FAILED); - - /* __argv[ARG_CLOSE_DESCRIPTORS] is "y" if file descriptors from 3 - * upwards should be closed - */ - - if (__argv[ARG_CLOSE_DESCRIPTORS][0] == 'y') - for (i = 3; i < 1000; i++) /* FIXME real limit? */ - if (i != child_err_report_fd) - close (i); - - /* __argv[ARG_WAIT] is "w" to wait for the program to exit */ - - if (__argv[ARG_WAIT][0] == 'w') - mode = P_WAIT; - else - mode = P_NOWAIT; - - /* __argv[ARG_USE_PATH] is "y" to use PATH, otherwise not */ - - /* __argv[ARG_PROGRAM] is program file to run, - * __argv[ARG_PROGRAM+1]... is its __argv. - */ - - if (debug) - { - debugstring = g_string_new (""); - g_string_append (debugstring, - g_strdup_printf ("calling %s on program %s, __argv: ", - (__argv[ARG_USE_PATH][0] == 'y' ? - "spawnvp" : "spawnv"), - __argv[ARG_PROGRAM])); - i = ARG_PROGRAM+1; - while (__argv[i]) - g_string_append (debugstring, __argv[i++]); - MessageBox (NULL, debugstring->str, "gspawn-win32-helper", 0); - } - - if (__argv[ARG_USE_PATH][0] == 'y') - { - if (spawnvp (mode, __argv[ARG_PROGRAM], __argv+ARG_PROGRAM) < 0) - write_err_and_exit (child_err_report_fd, CHILD_SPAWN_FAILED); - } - else - { - if (spawnv (mode, __argv[ARG_PROGRAM], __argv+ARG_PROGRAM) < 0) - write_err_and_exit (child_err_report_fd, CHILD_SPAWN_FAILED); - } - - return 0; -} - diff --git a/gspawn-win32.c b/gspawn-win32.c deleted file mode 100644 index d92744a9..00000000 --- a/gspawn-win32.c +++ /dev/null @@ -1,987 +0,0 @@ -/* gspawn-win32.c - Process launching on Win32 - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, write - * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Implementation details on Win32. - * - * - There is no way to set the no-inherit flag for - * a "file descriptor" in the MS C runtime. The flag is there, - * and the dospawn() function uses it, but unfortunately - * this flag can only be set when opening the file. - * - As there is no fork(), we cannot reliably change directory - * before starting the child process. (There might be several threads - * running, and the current directory is common for all threads.) - * - * Thus, we must in most cases use a helper program to handle closing - * of (inherited) file descriptors and changing of directory. In fact, - * we do it all the time. - * - * This source file contains the source for that helper program. - * To compile it, #define GSPAWN_HELPER. - */ - -/* Define this to get some logging all the time */ -/* #define G_SPAWN_WIN32_DEBUG */ - -#include "glib.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "glibintl.h" - -#ifdef G_SPAWN_WIN32_DEBUG - static int debug = 1; - #define SETUP_DEBUG() /* empty */ - -#else - static int debug = -1; - #define SETUP_DEBUG() \ - G_STMT_START \ - { \ - if (debug == -1) \ - { \ - if (getenv ("G_SPAWN_WIN32_DEBUG") != NULL) \ - debug = 1; \ - else \ - debug = 0; \ - } \ - } \ - G_STMT_END -#endif - -enum -{ - CHILD_NO_ERROR, - CHILD_CHDIR_FAILED, - CHILD_SPAWN_FAILED, -}; - -enum { - ARG_CHILD_ERR_REPORT = 1, - ARG_STDIN, - ARG_STDOUT, - ARG_STDERR, - ARG_WORKING_DIRECTORY, - ARG_CLOSE_DESCRIPTORS, - ARG_USE_PATH, - ARG_WAIT, - ARG_PROGRAM, - ARG_COUNT = ARG_PROGRAM -}; - -#ifndef GSPAWN_HELPER - -static gboolean make_pipe (gint p[2], - GError **error); -static gboolean fork_exec_with_pipes (gboolean dont_wait, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *standard_input, - gint *standard_output, - gint *standard_error, - gint *exit_status, - GError **error); - -GQuark -g_spawn_error_quark (void) -{ - static GQuark quark = 0; - if (quark == 0) - quark = g_quark_from_static_string ("g-exec-error-quark"); - return quark; -} - -/** - * g_spawn_async: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @child_pid: return location for child process ID, or NULL - * @error: return location for error - * - * See g_spawn_async_with_pipes() for a full description; this function - * simply calls the g_spawn_async_with_pipes() without any pipes. - * - * Return value: TRUE on success, FALSE if error is set - **/ -gboolean -g_spawn_async (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - GError **error) -{ - g_return_val_if_fail (argv != NULL, FALSE); - - return g_spawn_async_with_pipes (working_directory, - argv, envp, - flags, - child_setup, - user_data, - child_pid, - NULL, NULL, NULL, - error); -} - -/* Avoids a danger in threaded situations (calling close() - * on a file descriptor twice, and another thread has - * re-opened it since the first close) - */ -static gint -close_and_invalidate (gint *fd) -{ - gint ret; - - ret = close (*fd); - *fd = -1; - - return ret; -} - -typedef enum -{ - READ_FAILED = 0, /* FALSE */ - READ_OK, - READ_EOF -} ReadResult; - -static ReadResult -read_data (GString *str, - GIOChannel *iochannel, - GError **error) -{ - GIOError gioerror; - gint bytes; - gchar buf[4096]; - - again: - - gioerror = g_io_channel_read (iochannel, buf, sizeof (buf), &bytes); - - if (bytes == 0) - return READ_EOF; - else if (bytes > 0) - { - g_string_append_len (str, buf, bytes); - return READ_OK; - } - else if (gioerror == G_IO_ERROR_AGAIN) - goto again; - else if (gioerror != G_IO_ERROR_NONE) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_READ, - _("Failed to read data from child process")); - - return READ_FAILED; - } - else - return READ_OK; -} - -/** - * g_spawn_sync: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @standard_output: return location for child output - * @standard_error: return location for child error messages - * @exit_status: child exit status, as returned by waitpid() - * @error: return location for error - * - * Executes a child synchronously (waits for the child to exit before returning). - * All output from the child is stored in @standard_output and @standard_error, - * if those parameters are non-NULL. If @exit_status is non-NULL, the exit status - * of the child is stored there as it would be by waitpid(); standard UNIX - * macros such as WIFEXITED() and WEXITSTATUS() must be used to evaluate the - * exit status. If an error occurs, no data is returned in @standard_output, - * @standard_error, or @exit_status. - * - * This function calls g_spawn_async_with_pipes() internally; see that function - * for full details on the other parameters. - * - * Return value: TRUE on success, FALSE if an error was set. - **/ -gboolean -g_spawn_sync (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error) -{ - gint outpipe = -1; - gint errpipe = -1; - GIOChannel *outchannel = NULL; - GIOChannel *errchannel = NULL; - GPollFD outfd, errfd; - GPollFD fds[2]; - gint nfds; - gint outindex = -1; - gint errindex = -1; - gint ret; - GString *outstr = NULL; - GString *errstr = NULL; - gboolean failed; - gint status; - - g_return_val_if_fail (argv != NULL, FALSE); - g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); - g_return_val_if_fail (standard_output == NULL || - !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); - g_return_val_if_fail (standard_error == NULL || - !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); - - /* Just to ensure segfaults if callers try to use - * these when an error is reported. - */ - if (standard_output) - *standard_output = NULL; - - if (standard_error) - *standard_error = NULL; - - if (!fork_exec_with_pipes (FALSE, - working_directory, - argv, - envp, - !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), - (flags & G_SPAWN_SEARCH_PATH) != 0, - (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, - (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, - (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, - child_setup, - user_data, - NULL, - standard_output ? &outpipe : NULL, - standard_error ? &errpipe : NULL, - &status, - error)) - return FALSE; - - /* Read data from child. */ - - failed = FALSE; - - if (outpipe >= 0) - { - outstr = g_string_new (""); - outchannel = g_io_channel_win32_new_fd (outpipe); - g_io_channel_win32_make_pollfd (outchannel, - G_IO_IN | G_IO_ERR | G_IO_HUP, - &outfd); - } - - if (errpipe >= 0) - { - errstr = g_string_new (""); - errchannel = g_io_channel_win32_new_fd (errpipe); - g_io_channel_win32_make_pollfd (errchannel, - G_IO_IN | G_IO_ERR | G_IO_HUP, - &errfd); - } - - /* Read data until we get EOF on both pipes. */ - while (!failed && - (outpipe >= 0 || - errpipe >= 0)) - { - nfds = 0; - if (outpipe >= 0) - { - fds[nfds] = outfd; - outindex = nfds; - nfds++; - } - if (errpipe >= 0) - { - fds[nfds] = errfd; - errindex = nfds; - nfds++; - } - - if (debug) - g_print ("%s:g_spawn_sync: calling g_io_channel_win32_poll, nfds=%d\n", - __FILE__, nfds); - - ret = g_io_channel_win32_poll (fds, nfds, -1); - - if (ret < 0) - { - failed = TRUE; - - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_READ, - _("Unexpected error in g_io_channel_win32_poll() reading data from a child process")); - - break; - } - - if (outpipe >= 0 && (fds[outindex].revents & G_IO_IN)) - { - switch (read_data (outstr, outchannel, error)) - { - case READ_FAILED: - if (debug) - g_print ("g_spawn_sync: outchannel: READ_FAILED\n"); - failed = TRUE; - break; - case READ_EOF: - if (debug) - g_print ("g_spawn_sync: outchannel: READ_EOF\n"); - g_io_channel_unref (outchannel); - outchannel = NULL; - close_and_invalidate (&outpipe); - break; - default: - if (debug) - g_print ("g_spawn_sync: outchannel: OK\n"); - break; - } - - if (failed) - break; - } - - if (errpipe >= 0 && (fds[errindex].revents & G_IO_IN)) - { - switch (read_data (errstr, errchannel, error)) - { - case READ_FAILED: - if (debug) - g_print ("g_spawn_sync: errchannel: READ_FAILED\n"); - failed = TRUE; - break; - case READ_EOF: - if (debug) - g_print ("g_spawn_sync: errchannel: READ_EOF\n"); - g_io_channel_unref (errchannel); - errchannel = NULL; - close_and_invalidate (&errpipe); - break; - default: - if (debug) - g_print ("g_spawn_sync: errchannel: OK\n"); - break; - } - - if (failed) - break; - } - } - - /* These should only be open still if we had an error. */ - - if (outchannel != NULL) - g_io_channel_unref (outchannel); - if (errchannel != NULL) - g_io_channel_unref (errchannel); - if (outpipe >= 0) - close_and_invalidate (&outpipe); - if (errpipe >= 0) - close_and_invalidate (&errpipe); - - if (failed) - { - if (outstr) - g_string_free (outstr, TRUE); - if (errstr) - g_string_free (errstr, TRUE); - - return FALSE; - } - else - { - if (exit_status) - *exit_status = status; - - if (standard_output) - *standard_output = g_string_free (outstr, FALSE); - - if (standard_error) - *standard_error = g_string_free (errstr, FALSE); - - return TRUE; - } -} - -/** - * g_spawn_async_with_pipes: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @child_pid: return location for child process ID, or NULL - * @standard_input: return location for file descriptor to write to child's stdin, or NULL - * @standard_output: return location for file descriptor to read child's stdout, or NULL - * @standard_error: return location for file descriptor to read child's stderr, or NULL - * @error: return location for error - * - * Executes a child program asynchronously (your program will not - * block waiting for the child to exit). The child program is - * specified by the only argument that must be provided, @argv. @argv - * should be a NULL-terminated array of strings, to be passed as the - * argument vector for the child. The first string in @argv is of - * course the name of the program to execute. By default, the name of - * the program must be a full path; the PATH shell variable will only - * be searched if you pass the %G_SPAWN_SEARCH_PATH flag. - * - * @envp is a NULL-terminated array of strings, where each string - * has the form KEY=VALUE. This will become - * the child's environment. If @envp is NULL, the child inherits its - * parent's environment. - * - * @flags should be the bitwise OR of any flags you want to affect the - * function's behavior. The %G_SPAWN_DO_NOT_REAP_CHILD means that the - * child will not be automatically reaped; you must call waitpid() or - * handle SIGCHLD yourself, or the child will become a zombie. - * %G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file - * descriptors will be inherited by the child; otherwise all - * descriptors except stdin/stdout/stderr will be closed before - * calling exec() in the child. %G_SPAWN_SEARCH_PATH means that - * argv[0] need not be an absolute path, it - * will be looked for in the user's PATH. %G_SPAWN_STDOUT_TO_DEV_NULL - * means that the child's standad output will be discarded, instead - * of going to the same location as the parent's standard output. - * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error - * will be discarded. %G_SPAWN_CHILD_INHERITS_STDIN means that - * the child will inherit the parent's standard input (by default, - * the child's standard input is attached to /dev/null). - * - * @child_setup and @user_data are a function and user data to be - * called in the child after GLib has performed all the setup it plans - * to perform (including creating pipes, closing file descriptors, - * etc.) but before calling exec(). That is, @child_setup is called - * just before calling exec() in the child. Obviously actions taken in - * this function will only affect the child, not the parent. - * - * If non-NULL, @child_pid will be filled with the child's process - * ID. You can use the process ID to send signals to the child, or - * to waitpid() if you specified the %G_SPAWN_DO_NOT_REAP_CHILD flag. - * - * If non-NULL, the @standard_input, @standard_output, @standard_error - * locations will be filled with file descriptors for writing to the child's - * standard input or reading from its standard output or standard error. - * The caller of g_spawn_async_with_pipes() must close these file descriptors - * when they are no longer in use. If these parameters are NULL, the - * corresponding pipe won't be created. - * - * @error can be NULL to ignore errors, or non-NULL to report errors. - * If an error is set, the function returns FALSE. Errors - * are reported even if they occur in the child (for example if the - * executable in argv[0] is not found). Typically - * the message field of returned errors should be displayed - * to users. Possible errors are those from the #G_SPAWN_ERROR domain. - * - * If an error occurs, @child_pid, @standard_input, @standard_output, - * and @standard_error will not be filled with valid values. - * - * Return value: TRUE on success, FALSE if an error was set - **/ -gboolean -g_spawn_async_with_pipes (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - gint *standard_input, - gint *standard_output, - gint *standard_error, - GError **error) -{ - g_return_val_if_fail (argv != NULL, FALSE); - g_return_val_if_fail (standard_output == NULL || - !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); - g_return_val_if_fail (standard_error == NULL || - !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); - /* can't inherit stdin if we have an input pipe. */ - g_return_val_if_fail (standard_input == NULL || - !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); - - return fork_exec_with_pipes (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), - working_directory, - argv, - envp, - !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), - (flags & G_SPAWN_SEARCH_PATH) != 0, - (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, - (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, - (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, - child_setup, - user_data, - standard_input, - standard_output, - standard_error, - NULL, - error); -} - -/** - * g_spawn_command_line_sync: - * @command_line: a command line - * @standard_output: return location for child output - * @standard_error: return location for child errors - * @exit_status: return location for child exit status - * @error: return location for errors - * - * A simple version of g_spawn_sync() with little-used parameters - * removed, taking a command line instead of an argument vector. See - * g_spawn_sync() for full details. @command_line will be parsed by - * g_shell_parse_argv(). Unlike g_spawn_sync(), the %G_SPAWN_SEARCH_PATH flag - * is enabled. Note that %G_SPAWN_SEARCH_PATH can have security - * implications, so consider using g_spawn_sync() directly if - * appropriate. Possible errors are those from g_spawn_sync() and those - * from g_shell_parse_argv(). - * - * Return value: TRUE on success, FALSE if an error was set - **/ -gboolean -g_spawn_command_line_sync (const gchar *command_line, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error) -{ - gboolean retval; - gchar **argv = 0; - - g_return_val_if_fail (command_line != NULL, FALSE); - - if (!g_shell_parse_argv (command_line, - NULL, &argv, - error)) - return FALSE; - - retval = g_spawn_sync (NULL, - argv, - NULL, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - standard_output, - standard_error, - exit_status, - error); - g_strfreev (argv); - - return retval; -} - -/** - * g_spawn_command_line_async: - * @command_line: a command line - * @error: return location for errors - * - * A simple version of g_spawn_async() that parses a command line with - * g_shell_parse_argv() and passes it to g_spawn_async(). Runs a - * command line in the background. Unlike g_spawn_async(), the - * %G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note - * that %G_SPAWN_SEARCH_PATH can have security implications, so - * consider using g_spawn_async() directly if appropriate. Possible - * errors are those from g_shell_parse_argv() and g_spawn_async(). - * - * Return value: TRUE on success, FALSE if error is set. - **/ -gboolean -g_spawn_command_line_async (const gchar *command_line, - GError **error) -{ - gboolean retval; - gchar **argv = 0; - - g_return_val_if_fail (command_line != NULL, FALSE); - - if (!g_shell_parse_argv (command_line, - NULL, &argv, - error)) - return FALSE; - - retval = g_spawn_async (NULL, - argv, - NULL, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - NULL, - error); - g_strfreev (argv); - - return retval; -} - -static gint -do_exec (gboolean dont_wait, - gint child_err_report_fd, - gint stdin_fd, - gint stdout_fd, - gint stderr_fd, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - GSpawnChildSetupFunc child_setup, - gpointer user_data) -{ - gchar **new_argv; - gchar args[ARG_COUNT][10]; - gint i; - int argc = 0; - - SETUP_DEBUG(); - - while (argv[argc]) - ++argc; - - new_argv = g_new (gchar *, argc + 1 + ARG_COUNT); - - new_argv[0] = "gspawn-win32-helper"; - sprintf (args[ARG_CHILD_ERR_REPORT], "%d", child_err_report_fd); - new_argv[ARG_CHILD_ERR_REPORT] = args[ARG_CHILD_ERR_REPORT]; - - if (stdin_fd >= 0) - { - sprintf (args[ARG_STDIN], "%d", stdin_fd); - new_argv[ARG_STDIN] = args[ARG_STDIN]; - } - else if (child_inherits_stdin) - { - /* Let stdin be alone */ - new_argv[ARG_STDIN] = "-"; - } - else - { - /* Keep process from blocking on a read of stdin */ - new_argv[ARG_STDIN] = "z"; - } - - if (stdout_fd >= 0) - { - sprintf (args[ARG_STDOUT], "%d", stdout_fd); - new_argv[ARG_STDOUT] = args[ARG_STDOUT]; - } - else if (stdout_to_null) - { - new_argv[ARG_STDOUT] = "z"; - } - else - { - new_argv[ARG_STDOUT] = "-"; - } - - if (stderr_fd >= 0) - { - sprintf (args[ARG_STDERR], "%d", stderr_fd); - new_argv[ARG_STDERR] = args[ARG_STDERR]; - } - else if (stderr_to_null) - { - new_argv[ARG_STDERR] = "z"; - } - else - { - new_argv[ARG_STDERR] = "-"; - } - - if (working_directory && *working_directory) - new_argv[ARG_WORKING_DIRECTORY] = working_directory; - else - new_argv[ARG_WORKING_DIRECTORY] = "-"; - - if (close_descriptors) - new_argv[ARG_CLOSE_DESCRIPTORS] = "y"; - else - new_argv[ARG_CLOSE_DESCRIPTORS] = "-"; - - if (search_path) - new_argv[ARG_USE_PATH] = "y"; - else - new_argv[ARG_USE_PATH] = "-"; - - if (dont_wait) - new_argv[ARG_WAIT] = "-"; - else - new_argv[ARG_WAIT] = "w"; - - for (i = 0; i <= argc; i++) - new_argv[ARG_PROGRAM + i] = argv[i]; - - /* Call user function just before we execute the helper program, - * which executes the program. Dunno what's the usefulness of this. - * A child setup function used on Unix probably isn't of much use - * as such on Win32, anyhow. - */ - if (child_setup) - { - (* child_setup) (user_data); - } - - if (debug) - { - g_print ("calling gspawn-win32-helper with argv:\n"); - for (i = 0; i < argc + 1 + ARG_COUNT; i++) - g_print ("argv[%d]: %s\n", i, (new_argv[i] ? new_argv[i] : "NULL")); - } - - if (envp != NULL) - /* Let's hope envp hasn't mucked with PATH so that - * gspawn-win32-helper.exe isn't found. - */ - spawnvpe (P_NOWAIT, "gspawn-win32-helper", new_argv, envp); - else - spawnvp (P_NOWAIT, "gspawn-win32-helper", new_argv); - - /* FIXME: What if gspawn-win32-helper.exe isn't found? */ - - /* Close the child_err_report_fd and the other process's ends of the - * pipes in this process, otherwise the reader will never get - * EOF. - */ - close (child_err_report_fd); - if (stdin_fd >= 0) - close (stdin_fd); - if (stdout_fd >= 0) - close (stdout_fd); - if (stderr_fd >= 0) - close (stderr_fd); - - g_free (new_argv); - - return 0; -} - -static gboolean -read_ints (int fd, - gint* buf, - gint n_ints_in_buf, - gint *n_ints_read, - GError **error) -{ - gint bytes = 0; - - while (bytes < sizeof(gint)*n_ints_in_buf) - { - gint chunk; - - if (debug) - g_print ("%s:read_ints: trying to read %d bytes from pipe...\n", - __FILE__, - sizeof(gint)*n_ints_in_buf - bytes); - - chunk = read (fd, ((gchar*)buf) + bytes, - sizeof(gint)*n_ints_in_buf - bytes); - - if (debug) - g_print ("... got %d bytes\n", chunk); - - if (chunk < 0) - { - /* Some weird shit happened, bail out */ - - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to read from child pipe (%s)"), - g_strerror (errno)); - - return FALSE; - } - else if (chunk == 0) - break; /* EOF */ - else - bytes += chunk; - } - - *n_ints_read = bytes/sizeof(gint); - - return TRUE; -} - -static gboolean -fork_exec_with_pipes (gboolean dont_wait, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *standard_input, - gint *standard_output, - gint *standard_error, - gint *exit_status, - GError **error) -{ - gint stdin_pipe[2] = { -1, -1 }; - gint stdout_pipe[2] = { -1, -1 }; - gint stderr_pipe[2] = { -1, -1 }; - gint child_err_report_pipe[2] = { -1, -1 }; - gint status; - gint bytes; - gint buf[2]; - gint n_ints = 0; - - if (!make_pipe (child_err_report_pipe, error)) - return FALSE; - - if (standard_input && !make_pipe (stdin_pipe, error)) - goto cleanup_and_fail; - - if (standard_output && !make_pipe (stdout_pipe, error)) - goto cleanup_and_fail; - - if (standard_error && !make_pipe (stderr_pipe, error)) - goto cleanup_and_fail; - - status = do_exec (dont_wait, - child_err_report_pipe[1], - stdin_pipe[0], - stdout_pipe[1], - stderr_pipe[1], - working_directory, - argv, - envp, - close_descriptors, - search_path, - stdout_to_null, - stderr_to_null, - child_inherits_stdin, - child_setup, - user_data); - - if (!read_ints (child_err_report_pipe[0], - buf, 2, &n_ints, - error)) - goto cleanup_and_fail; - - if (n_ints == 2) - { - /* Error from the child. */ - - switch (buf[0]) - { - case CHILD_NO_ERROR: - break; - - case CHILD_CHDIR_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_CHDIR, - _("Failed to change to directory '%s' (%s)"), - working_directory, - g_strerror (buf[1])); - goto cleanup_and_fail; - - case CHILD_SPAWN_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to execute child process (%s)"), - g_strerror (buf[1])); - goto cleanup_and_fail; - } - } - - /* Success against all odds! return the information */ - - if (standard_input) - *standard_input = stdin_pipe[1]; - if (standard_output) - *standard_output = stdout_pipe[0]; - if (standard_error) - *standard_error = stderr_pipe[0]; - if (exit_status) - *exit_status = status; - - return TRUE; - - cleanup_and_fail: - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_err_report_pipe[1]); - close_and_invalidate (&stdin_pipe[0]); - close_and_invalidate (&stdin_pipe[1]); - close_and_invalidate (&stdout_pipe[0]); - close_and_invalidate (&stdout_pipe[1]); - close_and_invalidate (&stderr_pipe[0]); - close_and_invalidate (&stderr_pipe[1]); - - return FALSE; -} - -static gboolean -make_pipe (gint p[2], - GError **error) -{ - if (pipe (p) < 0) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to create pipe for communicating with child process (%s)"), - g_strerror (errno)); - return FALSE; - } - else - return TRUE; -} - -#endif /* !GSPAWN_HELPER */ diff --git a/gspawn.c b/gspawn.c deleted file mode 100644 index 8dc0e4b1..00000000 --- a/gspawn.c +++ /dev/null @@ -1,1404 +0,0 @@ -/* gspawn.c - Process launching - * - * Copyright 2000 Red Hat, Inc. - * g_execvpe implementation based on GNU libc execvp: - * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. - * - * GLib 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. - * - * GLib 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 GLib; 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 "glib.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* HAVE_SYS_SELECT_H */ - -#include "glibintl.h" - -static gint g_execute (const gchar *file, - gchar **argv, - gchar **envp, - gboolean search_path); - -static gboolean make_pipe (gint p[2], - GError **error); -static gboolean fork_exec_with_pipes (gboolean intermediate_child, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - gboolean file_and_argv_zero, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - gint *standard_input, - gint *standard_output, - gint *standard_error, - GError **error); - -GQuark -g_spawn_error_quark (void) -{ - static GQuark quark = 0; - if (quark == 0) - quark = g_quark_from_static_string ("g-exec-error-quark"); - return quark; -} - -/** - * g_spawn_async: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @child_pid: return location for child process ID, or NULL - * @error: return location for error - * - * See g_spawn_async_with_pipes() for a full description; this function - * simply calls the g_spawn_async_with_pipes() without any pipes. - * - * Return value: TRUE on success, FALSE if error is set - **/ -gboolean -g_spawn_async (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - GError **error) -{ - g_return_val_if_fail (argv != NULL, FALSE); - - return g_spawn_async_with_pipes (working_directory, - argv, envp, - flags, - child_setup, - user_data, - child_pid, - NULL, NULL, NULL, - error); -} - -/* Avoids a danger in threaded situations (calling close() - * on a file descriptor twice, and another thread has - * re-opened it since the first close) - */ -static gint -close_and_invalidate (gint *fd) -{ - gint ret; - - ret = close (*fd); - *fd = -1; - - return ret; -} - -typedef enum -{ - READ_FAILED = 0, /* FALSE */ - READ_OK, - READ_EOF -} ReadResult; - -static ReadResult -read_data (GString *str, - gint fd, - GError **error) -{ - gssize bytes; - gchar buf[4096]; - - again: - - bytes = read (fd, &buf, 4096); - - if (bytes == 0) - return READ_EOF; - else if (bytes > 0) - { - g_string_append_len (str, buf, bytes); - return READ_OK; - } - else if (bytes < 0 && errno == EINTR) - goto again; - else if (bytes < 0) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_READ, - _("Failed to read data from child process (%s)"), - g_strerror (errno)); - - return READ_FAILED; - } - else - return READ_OK; -} - -/** - * g_spawn_sync: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @standard_output: return location for child output - * @standard_error: return location for child error messages - * @exit_status: child exit status, as returned by waitpid() - * @error: return location for error - * - * Executes a child synchronously (waits for the child to exit before returning). - * All output from the child is stored in @standard_output and @standard_error, - * if those parameters are non-NULL. If @exit_status is non-NULL, the exit status - * of the child is stored there as it would be by waitpid(); standard UNIX - * macros such as WIFEXITED() and WEXITSTATUS() must be used to evaluate the - * exit status. If an error occurs, no data is returned in @standard_output, - * @standard_error, or @exit_status. - * - * This function calls g_spawn_async_with_pipes() internally; see that function - * for full details on the other parameters. - * - * Return value: TRUE on success, FALSE if an error was set. - **/ -gboolean -g_spawn_sync (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error) -{ - gint outpipe = -1; - gint errpipe = -1; - gint pid; - fd_set fds; - gint ret; - GString *outstr = NULL; - GString *errstr = NULL; - gboolean failed; - gint status; - - g_return_val_if_fail (argv != NULL, FALSE); - g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); - g_return_val_if_fail (standard_output == NULL || - !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); - g_return_val_if_fail (standard_error == NULL || - !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); - - /* Just to ensure segfaults if callers try to use - * these when an error is reported. - */ - if (standard_output) - *standard_output = NULL; - - if (standard_error) - *standard_error = NULL; - - if (!fork_exec_with_pipes (FALSE, - working_directory, - argv, - envp, - !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), - (flags & G_SPAWN_SEARCH_PATH) != 0, - (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, - (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, - (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, - (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, - child_setup, - user_data, - &pid, - NULL, - standard_output ? &outpipe : NULL, - standard_error ? &errpipe : NULL, - error)) - return FALSE; - - /* Read data from child. */ - - failed = FALSE; - - if (outpipe >= 0) - { - outstr = g_string_new (""); - } - - if (errpipe >= 0) - { - errstr = g_string_new (""); - } - - /* Read data until we get EOF on both pipes. */ - while (!failed && - (outpipe >= 0 || - errpipe >= 0)) - { - ret = 0; - - FD_ZERO (&fds); - if (outpipe >= 0) - FD_SET (outpipe, &fds); - if (errpipe >= 0) - FD_SET (errpipe, &fds); - - ret = select (MAX (outpipe, errpipe) + 1, - &fds, - NULL, NULL, - NULL /* no timeout */); - - if (ret < 0 && errno != EINTR) - { - failed = TRUE; - - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_READ, - _("Unexpected error in select() reading data from a child process (%s)"), - g_strerror (errno)); - - break; - } - - if (outpipe >= 0 && FD_ISSET (outpipe, &fds)) - { - switch (read_data (outstr, outpipe, error)) - { - case READ_FAILED: - failed = TRUE; - break; - case READ_EOF: - close_and_invalidate (&outpipe); - outpipe = -1; - break; - default: - break; - } - - if (failed) - break; - } - - if (errpipe >= 0 && FD_ISSET (errpipe, &fds)) - { - switch (read_data (errstr, errpipe, error)) - { - case READ_FAILED: - failed = TRUE; - break; - case READ_EOF: - close_and_invalidate (&errpipe); - errpipe = -1; - break; - default: - break; - } - - if (failed) - break; - } - } - - /* These should only be open still if we had an error. */ - - if (outpipe >= 0) - close_and_invalidate (&outpipe); - if (errpipe >= 0) - close_and_invalidate (&errpipe); - - /* Wait for child to exit, even if we have - * an error pending. - */ - again: - - ret = waitpid (pid, &status, 0); - - if (ret < 0) - { - if (errno == EINTR) - goto again; - else if (errno == ECHILD) - { - if (exit_status) - { - g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but SIGCHLD action was set to SIG_IGN and ECHILD was received by waitpid(), so exit status can't be returned. This is a bug in the program calling g_spawn_sync(); either don't request the exit status, or don't set the SIGCHLD action."); - } - else - { - /* We don't need the exit status. */ - } - } - else - { - if (!failed) /* avoid error pileups */ - { - failed = TRUE; - - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_READ, - _("Unexpected error in waitpid() (%s)"), - g_strerror (errno)); - } - } - } - - if (failed) - { - if (outstr) - g_string_free (outstr, TRUE); - if (errstr) - g_string_free (errstr, TRUE); - - return FALSE; - } - else - { - if (exit_status) - *exit_status = status; - - if (standard_output) - *standard_output = g_string_free (outstr, FALSE); - - if (standard_error) - *standard_error = g_string_free (errstr, FALSE); - - return TRUE; - } -} - -/** - * g_spawn_async_with_pipes: - * @working_directory: child's current working directory, or NULL to inherit parent's - * @argv: child's argument vector - * @envp: child's environment, or NULL to inherit parent's - * @flags: flags from #GSpawnFlags - * @child_setup: function to run in the child just before exec() - * @user_data: user data for @child_setup - * @child_pid: return location for child process ID, or NULL - * @standard_input: return location for file descriptor to write to child's stdin, or NULL - * @standard_output: return location for file descriptor to read child's stdout, or NULL - * @standard_error: return location for file descriptor to read child's stderr, or NULL - * @error: return location for error - * - * Executes a child program asynchronously (your program will not - * block waiting for the child to exit). The child program is - * specified by the only argument that must be provided, @argv. @argv - * should be a NULL-terminated array of strings, to be passed as the - * argument vector for the child. The first string in @argv is of - * course the name of the program to execute. By default, the name of - * the program must be a full path; the PATH shell variable will only - * be searched if you pass the %G_SPAWN_SEARCH_PATH flag. - * - * @envp is a NULL-terminated array of strings, where each string - * has the form KEY=VALUE. This will become - * the child's environment. If @envp is NULL, the child inherits its - * parent's environment. - * - * @flags should be the bitwise OR of any flags you want to affect the - * function's behavior. The %G_SPAWN_DO_NOT_REAP_CHILD means that the - * child will not be automatically reaped; you must call waitpid() or - * handle SIGCHLD yourself, or the child will become a zombie. - * %G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file - * descriptors will be inherited by the child; otherwise all - * descriptors except stdin/stdout/stderr will be closed before - * calling exec() in the child. %G_SPAWN_SEARCH_PATH means that - * argv[0] need not be an absolute path, it - * will be looked for in the user's PATH. %G_SPAWN_STDOUT_TO_DEV_NULL - * means that the child's standad output will be discarded, instead - * of going to the same location as the parent's standard output. - * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error - * will be discarded. %G_SPAWN_CHILD_INHERITS_STDIN means that - * the child will inherit the parent's standard input (by default, - * the child's standard input is attached to /dev/null). - * %G_SPAWN_FILE_AND_ARGV_ZERO means that the first element of @argv is - * the file to execute, while the remaining elements are the - * actual argument vector to pass to the file. Normally - * g_spawn_async_with_pipes() uses @argv[0] as the file to execute, and - * passes all of @argv to the child. - * - * @child_setup and @user_data are a function and user data to be - * called in the child after GLib has performed all the setup it plans - * to perform (including creating pipes, closing file descriptors, - * etc.) but before calling exec(). That is, @child_setup is called - * just before calling exec() in the child. Obviously actions taken in - * this function will only affect the child, not the parent. - * - * If non-NULL, @child_pid will be filled with the child's process - * ID. You can use the process ID to send signals to the child, or - * to waitpid() if you specified the %G_SPAWN_DO_NOT_REAP_CHILD flag. - * - * If non-NULL, the @standard_input, @standard_output, @standard_error - * locations will be filled with file descriptors for writing to the child's - * standard input or reading from its standard output or standard error. - * The caller of g_spawn_async_with_pipes() must close these file descriptors - * when they are no longer in use. If these parameters are NULL, the - * corresponding pipe won't be created. - * - * @error can be NULL to ignore errors, or non-NULL to report errors. - * If an error is set, the function returns FALSE. Errors - * are reported even if they occur in the child (for example if the - * executable in argv[0] is not found). Typically - * the message field of returned errors should be displayed - * to users. Possible errors are those from the #G_SPAWN_ERROR domain. - * - * If an error occurs, @child_pid, @standard_input, @standard_output, - * and @standard_error will not be filled with valid values. - * - * Return value: TRUE on success, FALSE if an error was set - **/ -gboolean -g_spawn_async_with_pipes (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - gint *standard_input, - gint *standard_output, - gint *standard_error, - GError **error) -{ - g_return_val_if_fail (argv != NULL, FALSE); - g_return_val_if_fail (standard_output == NULL || - !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); - g_return_val_if_fail (standard_error == NULL || - !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); - /* can't inherit stdin if we have an input pipe. */ - g_return_val_if_fail (standard_input == NULL || - !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); - - return fork_exec_with_pipes (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), - working_directory, - argv, - envp, - !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), - (flags & G_SPAWN_SEARCH_PATH) != 0, - (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, - (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, - (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, - (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, - child_setup, - user_data, - child_pid, - standard_input, - standard_output, - standard_error, - error); -} - -/** - * g_spawn_command_line_sync: - * @command_line: a command line - * @standard_output: return location for child output - * @standard_error: return location for child errors - * @exit_status: return location for child exit status - * @error: return location for errors - * - * A simple version of g_spawn_sync() with little-used parameters - * removed, taking a command line instead of an argument vector. See - * g_spawn_sync() for full details. @command_line will be parsed by - * g_shell_parse_argv(). Unlike g_spawn_sync(), the %G_SPAWN_SEARCH_PATH flag - * is enabled. Note that %G_SPAWN_SEARCH_PATH can have security - * implications, so consider using g_spawn_sync() directly if - * appropriate. Possible errors are those from g_spawn_sync() and those - * from g_shell_parse_argv(). - * - * Return value: TRUE on success, FALSE if an error was set - **/ -gboolean -g_spawn_command_line_sync (const gchar *command_line, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error) -{ - gboolean retval; - gchar **argv = 0; - - g_return_val_if_fail (command_line != NULL, FALSE); - - if (!g_shell_parse_argv (command_line, - NULL, &argv, - error)) - return FALSE; - - retval = g_spawn_sync (NULL, - argv, - NULL, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - standard_output, - standard_error, - exit_status, - error); - g_strfreev (argv); - - return retval; -} - -/** - * g_spawn_command_line_async: - * @command_line: a command line - * @error: return location for errors - * - * A simple version of g_spawn_async() that parses a command line with - * g_shell_parse_argv() and passes it to g_spawn_async(). Runs a - * command line in the background. Unlike g_spawn_async(), the - * %G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note - * that %G_SPAWN_SEARCH_PATH can have security implications, so - * consider using g_spawn_async() directly if appropriate. Possible - * errors are those from g_shell_parse_argv() and g_spawn_async(). - * - * Return value: TRUE on success, FALSE if error is set. - **/ -gboolean -g_spawn_command_line_async (const gchar *command_line, - GError **error) -{ - gboolean retval; - gchar **argv = 0; - - g_return_val_if_fail (command_line != NULL, FALSE); - - if (!g_shell_parse_argv (command_line, - NULL, &argv, - error)) - return FALSE; - - retval = g_spawn_async (NULL, - argv, - NULL, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - NULL, - error); - g_strfreev (argv); - - return retval; -} - -static gint -exec_err_to_g_error (gint en) -{ - switch (en) - { -#ifdef EACCES - case EACCES: - return G_SPAWN_ERROR_ACCES; - break; -#endif - -#ifdef EPERM - case EPERM: - return G_SPAWN_ERROR_PERM; - break; -#endif - -#ifdef E2BIG - case E2BIG: - return G_SPAWN_ERROR_2BIG; - break; -#endif - -#ifdef ENOEXEC - case ENOEXEC: - return G_SPAWN_ERROR_NOEXEC; - break; -#endif - -#ifdef ENAMETOOLONG - case ENAMETOOLONG: - return G_SPAWN_ERROR_NAMETOOLONG; - break; -#endif - -#ifdef ENOENT - case ENOENT: - return G_SPAWN_ERROR_NOENT; - break; -#endif - -#ifdef ENOMEM - case ENOMEM: - return G_SPAWN_ERROR_NOMEM; - break; -#endif - -#ifdef ENOTDIR - case ENOTDIR: - return G_SPAWN_ERROR_NOTDIR; - break; -#endif - -#ifdef ELOOP - case ELOOP: - return G_SPAWN_ERROR_LOOP; - break; -#endif - -#ifdef ETXTBUSY - case ETXTBUSY: - return G_SPAWN_ERROR_TXTBUSY; - break; -#endif - -#ifdef EIO - case EIO: - return G_SPAWN_ERROR_IO; - break; -#endif - -#ifdef ENFILE - case ENFILE: - return G_SPAWN_ERROR_NFILE; - break; -#endif - -#ifdef EMFILE - case EMFILE: - return G_SPAWN_ERROR_MFILE; - break; -#endif - -#ifdef EINVAL - case EINVAL: - return G_SPAWN_ERROR_INVAL; - break; -#endif - -#ifdef EISDIR - case EISDIR: - return G_SPAWN_ERROR_ISDIR; - break; -#endif - -#ifdef ELIBBAD - case ELIBBAD: - return G_SPAWN_ERROR_LIBBAD; - break; -#endif - - default: - return G_SPAWN_ERROR_FAILED; - break; - } -} - -static void -write_err_and_exit (gint fd, gint msg) -{ - gint en = errno; - - write (fd, &msg, sizeof(msg)); - write (fd, &en, sizeof(en)); - - _exit (1); -} - -static void -set_cloexec (gint fd) -{ - fcntl (fd, F_SETFD, FD_CLOEXEC); -} - -static gint -sane_dup2 (gint fd1, gint fd2) -{ - gint ret; - - retry: - ret = dup2 (fd1, fd2); - if (ret < 0 && errno == EINTR) - goto retry; - - return ret; -} - -enum -{ - CHILD_CHDIR_FAILED, - CHILD_EXEC_FAILED, - CHILD_DUP2_FAILED, - CHILD_FORK_FAILED -}; - -static void -do_exec (gint child_err_report_fd, - gint stdin_fd, - gint stdout_fd, - gint stderr_fd, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - gboolean file_and_argv_zero, - GSpawnChildSetupFunc child_setup, - gpointer user_data) -{ - if (working_directory && chdir (working_directory) < 0) - write_err_and_exit (child_err_report_fd, - CHILD_CHDIR_FAILED); - - /* Close all file descriptors but stdin stdout and stderr as - * soon as we exec. Note that this includes - * child_err_report_fd, which keeps the parent from blocking - * forever on the other end of that pipe. - */ - if (close_descriptors) - { - gint open_max; - gint i; - - open_max = sysconf (_SC_OPEN_MAX); - for (i = 3; i < open_max; i++) - set_cloexec (i); - } - else - { - /* We need to do child_err_report_fd anyway */ - set_cloexec (child_err_report_fd); - } - - /* Redirect pipes as required */ - - if (stdin_fd >= 0) - { - /* dup2 can't actually fail here I don't think */ - - if (sane_dup2 (stdin_fd, 0) < 0) - write_err_and_exit (child_err_report_fd, - CHILD_DUP2_FAILED); - - /* ignore this if it doesn't work */ - close_and_invalidate (&stdin_fd); - } - else if (!child_inherits_stdin) - { - /* Keep process from blocking on a read of stdin */ - gint read_null = open ("/dev/null", O_RDONLY); - sane_dup2 (read_null, 0); - close_and_invalidate (&read_null); - } - - if (stdout_fd >= 0) - { - /* dup2 can't actually fail here I don't think */ - - if (sane_dup2 (stdout_fd, 1) < 0) - write_err_and_exit (child_err_report_fd, - CHILD_DUP2_FAILED); - - /* ignore this if it doesn't work */ - close_and_invalidate (&stdout_fd); - } - else if (stdout_to_null) - { - gint write_null = open ("/dev/null", O_WRONLY); - sane_dup2 (write_null, 1); - close_and_invalidate (&write_null); - } - - if (stderr_fd >= 0) - { - /* dup2 can't actually fail here I don't think */ - - if (sane_dup2 (stderr_fd, 2) < 0) - write_err_and_exit (child_err_report_fd, - CHILD_DUP2_FAILED); - - /* ignore this if it doesn't work */ - close_and_invalidate (&stderr_fd); - } - else if (stderr_to_null) - { - gint write_null = open ("/dev/null", O_WRONLY); - sane_dup2 (write_null, 2); - close_and_invalidate (&write_null); - } - - /* Call user function just before we exec */ - if (child_setup) - { - (* child_setup) (user_data); - } - - g_execute (argv[0], - file_and_argv_zero ? argv + 1 : argv, - envp, search_path); - - /* Exec failed */ - write_err_and_exit (child_err_report_fd, - CHILD_EXEC_FAILED); -} - -static gboolean -read_ints (int fd, - gint* buf, - gint n_ints_in_buf, - gint *n_ints_read, - GError **error) -{ - gsize bytes = 0; - - while (TRUE) - { - gssize chunk; - - if (bytes >= sizeof(gint)*2) - break; /* give up, who knows what happened, should not be - * possible. - */ - - again: - chunk = read (fd, - ((gchar*)buf) + bytes, - sizeof(gint) * n_ints_in_buf - bytes); - if (chunk < 0 && errno == EINTR) - goto again; - - if (chunk < 0) - { - /* Some weird shit happened, bail out */ - - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to read from child pipe (%s)"), - g_strerror (errno)); - - return FALSE; - } - else if (chunk == 0) - break; /* EOF */ - else /* chunk > 0 */ - bytes += chunk; - } - - *n_ints_read = (gint)(bytes / sizeof(gint)); - - return TRUE; -} - -static gboolean -fork_exec_with_pipes (gboolean intermediate_child, - const gchar *working_directory, - gchar **argv, - gchar **envp, - gboolean close_descriptors, - gboolean search_path, - gboolean stdout_to_null, - gboolean stderr_to_null, - gboolean child_inherits_stdin, - gboolean file_and_argv_zero, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - gint *standard_input, - gint *standard_output, - gint *standard_error, - GError **error) -{ - gint pid; - gint stdin_pipe[2] = { -1, -1 }; - gint stdout_pipe[2] = { -1, -1 }; - gint stderr_pipe[2] = { -1, -1 }; - gint child_err_report_pipe[2] = { -1, -1 }; - gint child_pid_report_pipe[2] = { -1, -1 }; - gint status; - - if (!make_pipe (child_err_report_pipe, error)) - return FALSE; - - if (intermediate_child && !make_pipe (child_pid_report_pipe, error)) - goto cleanup_and_fail; - - if (standard_input && !make_pipe (stdin_pipe, error)) - goto cleanup_and_fail; - - if (standard_output && !make_pipe (stdout_pipe, error)) - goto cleanup_and_fail; - - if (standard_error && !make_pipe (stderr_pipe, error)) - goto cleanup_and_fail; - - pid = fork (); - - if (pid < 0) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FORK, - _("Failed to fork (%s)"), - g_strerror (errno)); - - goto cleanup_and_fail; - } - else if (pid == 0) - { - /* Immediate child. This may or may not be the child that - * actually execs the new process. - */ - - /* Be sure we crash if the parent exits - * and we write to the err_report_pipe - */ - signal (SIGPIPE, SIG_DFL); - - /* Close the parent's end of the pipes; - * not needed in the close_descriptors case, - * though - */ - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_pid_report_pipe[0]); - close_and_invalidate (&stdin_pipe[1]); - close_and_invalidate (&stdout_pipe[0]); - close_and_invalidate (&stderr_pipe[0]); - - if (intermediate_child) - { - /* We need to fork an intermediate child that launches the - * final child. The purpose of the intermediate child - * is to exit, so we can waitpid() it immediately. - * Then the grandchild will not become a zombie. - */ - gint grandchild_pid; - - grandchild_pid = fork (); - - if (grandchild_pid < 0) - { - /* report -1 as child PID */ - write (child_pid_report_pipe[1], &grandchild_pid, - sizeof(grandchild_pid)); - - write_err_and_exit (child_err_report_pipe[1], - CHILD_FORK_FAILED); - } - else if (grandchild_pid == 0) - { - do_exec (child_err_report_pipe[1], - stdin_pipe[0], - stdout_pipe[1], - stderr_pipe[1], - working_directory, - argv, - envp, - close_descriptors, - search_path, - stdout_to_null, - stderr_to_null, - child_inherits_stdin, - file_and_argv_zero, - child_setup, - user_data); - } - else - { - write (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid)); - close_and_invalidate (&child_pid_report_pipe[1]); - - _exit (0); - } - } - else - { - /* Just run the child. - */ - - do_exec (child_err_report_pipe[1], - stdin_pipe[0], - stdout_pipe[1], - stderr_pipe[1], - working_directory, - argv, - envp, - close_descriptors, - search_path, - stdout_to_null, - stderr_to_null, - child_inherits_stdin, - file_and_argv_zero, - child_setup, - user_data); - } - } - else - { - /* Parent */ - - gint buf[2]; - gint n_ints = 0; - - /* Close the uncared-about ends of the pipes */ - close_and_invalidate (&child_err_report_pipe[1]); - close_and_invalidate (&child_pid_report_pipe[1]); - close_and_invalidate (&stdin_pipe[0]); - close_and_invalidate (&stdout_pipe[1]); - close_and_invalidate (&stderr_pipe[1]); - - /* If we had an intermediate child, reap it */ - if (intermediate_child) - { - wait_again: - if (waitpid (pid, &status, 0) < 0) - { - if (errno == EINTR) - goto wait_again; - else if (errno == ECHILD) - ; /* do nothing, child already reaped */ - else - g_warning ("waitpid() should not fail in " - "'fork_exec_with_pipes'"); - } - } - - - if (!read_ints (child_err_report_pipe[0], - buf, 2, &n_ints, - error)) - goto cleanup_and_fail; - - if (n_ints >= 2) - { - /* Error from the child. */ - - switch (buf[0]) - { - case CHILD_CHDIR_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_CHDIR, - _("Failed to change to directory '%s' (%s)"), - working_directory, - g_strerror (buf[1])); - - break; - - case CHILD_EXEC_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - exec_err_to_g_error (buf[1]), - _("Failed to execute child process (%s)"), - g_strerror (buf[1])); - - break; - - case CHILD_DUP2_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to redirect output or input of child process (%s)"), - g_strerror (buf[1])); - - break; - - case CHILD_FORK_FAILED: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FORK, - _("Failed to fork child process (%s)"), - g_strerror (buf[1])); - break; - - default: - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Unknown error executing child process")); - break; - } - - goto cleanup_and_fail; - } - - /* Get child pid from intermediate child pipe. */ - if (intermediate_child) - { - n_ints = 0; - - if (!read_ints (child_pid_report_pipe[0], - buf, 1, &n_ints, error)) - goto cleanup_and_fail; - - if (n_ints < 1) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to read enough data from child pid pipe (%s)"), - g_strerror (errno)); - goto cleanup_and_fail; - } - else - { - /* we have the child pid */ - pid = buf[0]; - } - } - - /* Success against all odds! return the information */ - - if (child_pid) - *child_pid = pid; - - if (standard_input) - *standard_input = stdin_pipe[1]; - if (standard_output) - *standard_output = stdout_pipe[0]; - if (standard_error) - *standard_error = stderr_pipe[0]; - - return TRUE; - } - - cleanup_and_fail: - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_err_report_pipe[1]); - close_and_invalidate (&child_pid_report_pipe[0]); - close_and_invalidate (&child_pid_report_pipe[1]); - close_and_invalidate (&stdin_pipe[0]); - close_and_invalidate (&stdin_pipe[1]); - close_and_invalidate (&stdout_pipe[0]); - close_and_invalidate (&stdout_pipe[1]); - close_and_invalidate (&stderr_pipe[0]); - close_and_invalidate (&stderr_pipe[1]); - - return FALSE; -} - -static gboolean -make_pipe (gint p[2], - GError **error) -{ - if (pipe (p) < 0) - { - g_set_error (error, - G_SPAWN_ERROR, - G_SPAWN_ERROR_FAILED, - _("Failed to create pipe for communicating with child process (%s)"), - g_strerror (errno)); - return FALSE; - } - else - return TRUE; -} - -/* Based on execvp from GNU C Library */ - -static void -script_execute (const gchar *file, - gchar **argv, - gchar **envp, - gboolean search_path) -{ - /* Count the arguments. */ - int argc = 0; - while (argv[argc]) - ++argc; - - /* Construct an argument list for the shell. */ - { - gchar **new_argv; - - new_argv = g_new0 (gchar*, argc + 1); - - new_argv[0] = (char *) "/bin/sh"; - new_argv[1] = (char *) file; - while (argc > 1) - { - new_argv[argc] = argv[argc - 1]; - --argc; - } - - /* Execute the shell. */ - if (envp) - execve (new_argv[0], new_argv, envp); - else - execv (new_argv[0], new_argv); - - g_free (new_argv); - } -} - -static gchar* -my_strchrnul (const gchar *str, gchar c) -{ - gchar *p = (gchar*) str; - while (*p && (*p != c)) - ++p; - - return p; -} - -static gint -g_execute (const gchar *file, - gchar **argv, - gchar **envp, - gboolean search_path) -{ - if (*file == '\0') - { - /* We check the simple case first. */ - errno = ENOENT; - return -1; - } - - if (!search_path || strchr (file, '/') != NULL) - { - /* Don't search when it contains a slash. */ - if (envp) - execve (file, argv, envp); - else - execv (file, argv); - - if (errno == ENOEXEC) - script_execute (file, argv, envp, FALSE); - } - else - { - gboolean got_eacces = 0; - const gchar *path, *p; - gchar *name, *freeme; - size_t len; - size_t pathlen; - - path = g_getenv ("PATH"); - if (path == NULL) - { - /* There is no `PATH' in the environment. The default - * search path in libc is the current directory followed by - * the path `confstr' returns for `_CS_PATH'. - */ - - /* In GLib we put . last, for security, and don't use the - * unportable confstr(); UNIX98 does not actually specify - * what to search if PATH is unset. POSIX may, dunno. - */ - - path = "/bin:/usr/bin:."; - } - - len = strlen (file) + 1; - pathlen = strlen (path); - freeme = name = g_malloc (pathlen + len + 1); - - /* Copy the file name at the top, including '\0' */ - memcpy (name + pathlen + 1, file, len); - name = name + pathlen; - /* And add the slash before the filename */ - *name = '/'; - - p = path; - do - { - char *startp; - - path = p; - p = my_strchrnul (path, ':'); - - if (p == path) - /* Two adjacent colons, or a colon at the beginning or the end - * of `PATH' means to search the current directory. - */ - startp = name + 1; - else - startp = memcpy (name - (p - path), path, p - path); - - /* Try to execute this name. If it works, execv will not return. */ - if (envp) - execve (startp, argv, envp); - else - execv (startp, argv); - - if (errno == ENOEXEC) - script_execute (startp, argv, envp, search_path); - - switch (errno) - { - case EACCES: - /* Record the we got a `Permission denied' error. If we end - * up finding no executable we can use, we want to diagnose - * that we did find one but were denied access. - */ - got_eacces = TRUE; - - /* FALL THRU */ - - case ENOENT: -#ifdef ESTALE - case ESTALE: -#endif -#ifdef ENOTDIR - case ENOTDIR: -#endif - /* Those errors indicate the file is missing or not executable - * by us, in which case we want to just try the next path - * directory. - */ - break; - - default: - /* Some other error means we found an executable file, but - * something went wrong executing it; return the error to our - * caller. - */ - g_free (freeme); - return -1; - } - } - while (*p++ != '\0'); - - /* We tried every element and none of them worked. */ - if (got_eacces) - /* At least one failure was due to permissions, so report that - * error. - */ - errno = EACCES; - - g_free (freeme); - } - - /* Return the error from the last attempt (probably ENOENT). */ - return -1; -} diff --git a/gspawn.h b/gspawn.h deleted file mode 100644 index dcebc3a8..00000000 --- a/gspawn.h +++ /dev/null @@ -1,128 +0,0 @@ -/* gspawn.h - Process launching - * - * Copyright 2000 Red Hat, Inc. - * - * GLib 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. - * - * GLib 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 GLib; see the file COPYING.LIB. If not, write - * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __G_SPAWN_H__ -#define __G_SPAWN_H__ - -#include - -G_BEGIN_DECLS - -/* I'm not sure I remember our proposed naming convention here. */ -#define G_SPAWN_ERROR g_spawn_error_quark () - -typedef enum -{ - G_SPAWN_ERROR_FORK, /* fork failed due to lack of memory */ - G_SPAWN_ERROR_READ, /* read or select on pipes failed */ - G_SPAWN_ERROR_CHDIR, /* changing to working dir failed */ - G_SPAWN_ERROR_ACCES, /* execv() returned EACCES */ - G_SPAWN_ERROR_PERM, /* execv() returned EPERM */ - G_SPAWN_ERROR_2BIG, /* execv() returned E2BIG */ - G_SPAWN_ERROR_NOEXEC, /* execv() returned ENOEXEC */ - G_SPAWN_ERROR_NAMETOOLONG, /* "" "" ENAMETOOLONG */ - G_SPAWN_ERROR_NOENT, /* "" "" ENOENT */ - G_SPAWN_ERROR_NOMEM, /* "" "" ENOMEM */ - G_SPAWN_ERROR_NOTDIR, /* "" "" ENOTDIR */ - G_SPAWN_ERROR_LOOP, /* "" "" ELOOP */ - G_SPAWN_ERROR_TXTBUSY, /* "" "" ETXTBUSY */ - G_SPAWN_ERROR_IO, /* "" "" EIO */ - G_SPAWN_ERROR_NFILE, /* "" "" ENFILE */ - G_SPAWN_ERROR_MFILE, /* "" "" EMFLE */ - G_SPAWN_ERROR_INVAL, /* "" "" EINVAL */ - G_SPAWN_ERROR_ISDIR, /* "" "" EISDIR */ - G_SPAWN_ERROR_LIBBAD, /* "" "" ELIBBAD */ - G_SPAWN_ERROR_FAILED /* other fatal failure, error->message - * should explain - */ -} GSpawnError; - -typedef void (* GSpawnChildSetupFunc) (gpointer user_data); - -typedef enum -{ - G_SPAWN_LEAVE_DESCRIPTORS_OPEN = 1 << 0, - G_SPAWN_DO_NOT_REAP_CHILD = 1 << 1, - /* look for argv[0] in the path i.e. use execvp() */ - G_SPAWN_SEARCH_PATH = 1 << 2, - /* Dump output to /dev/null */ - G_SPAWN_STDOUT_TO_DEV_NULL = 1 << 3, - G_SPAWN_STDERR_TO_DEV_NULL = 1 << 4, - G_SPAWN_CHILD_INHERITS_STDIN = 1 << 5, - G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6 -} GSpawnFlags; - -GQuark g_spawn_error_quark (void); - -gboolean g_spawn_async (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - GError **error); - - -/* Opens pipes for non-NULL standard_output, standard_input, standard_error, - * and returns the parent's end of the pipes. - */ -gboolean g_spawn_async_with_pipes (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gint *child_pid, - gint *standard_input, - gint *standard_output, - gint *standard_error, - GError **error); - - -/* If standard_output or standard_error are non-NULL, the full - * standard output or error of the command will be placed there. - */ - -gboolean g_spawn_sync (const gchar *working_directory, - gchar **argv, - gchar **envp, - GSpawnFlags flags, - GSpawnChildSetupFunc child_setup, - gpointer user_data, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error); - -gboolean g_spawn_command_line_sync (const gchar *command_line, - gchar **standard_output, - gchar **standard_error, - gint *exit_status, - GError **error); -gboolean g_spawn_command_line_async (const gchar *command_line, - GError **error); - - -G_END_DECLS - -#endif /* __G_SPAWN_H__ */ - - diff --git a/gstrfuncs.c b/gstrfuncs.c deleted file mode 100644 index f570fc70..00000000 --- a/gstrfuncs.c +++ /dev/null @@ -1,1660 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#define _GNU_SOURCE /* For stpcpy */ - -#include -#include -#include -#include -#include -#include /* For tolower() */ -#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL) -#include -#endif -#include "glib.h" - -#ifdef G_OS_WIN32 -#include -#endif - -/* do not include in this place since it - * inteferes with g_strsignal() on some OSes - */ - -gchar* -g_strdup (const gchar *str) -{ - gchar *new_str; - - if (str) - { - new_str = g_new (char, strlen (str) + 1); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -gpointer -g_memdup (gconstpointer mem, - guint byte_size) -{ - gpointer new_mem; - - if (mem) - { - new_mem = g_malloc (byte_size); - memcpy (new_mem, mem, byte_size); - } - else - new_mem = NULL; - - return new_mem; -} - -gchar* -g_strndup (const gchar *str, - gsize n) -{ - gchar *new_str; - - if (str) - { - new_str = g_new (gchar, n + 1); - strncpy (new_str, str, n); - new_str[n] = '\0'; - } - else - new_str = NULL; - - return new_str; -} - -gchar* -g_strnfill (gsize length, - gchar fill_char) -{ - register gchar *str, *s, *end; - - str = g_new (gchar, length + 1); - s = str; - end = str + length; - while (s < end) - *(s++) = fill_char; - *s = 0; - - return str; -} - -/** - * g_stpcpy: - * @dest: destination buffer - * @src: source string - * - * Copies a nul-terminated string into the dest buffer, include the - * trailing nul, and return a pointer to the trailing nul byte. - * This is useful for concatenating multiple strings together - * without having to repeatedly scan for the end. - * - * Return value: a pointer to trailing nul byte. - **/ -gchar * -g_stpcpy (gchar *dest, - const gchar *src) -{ -#ifdef HAVE_STPCPY - g_return_val_if_fail (dest != NULL, NULL); - g_return_val_if_fail (src != NULL, NULL); - return stpcpy (dest, src); -#else - register gchar *d = dest; - register const gchar *s = src; - - g_return_val_if_fail (dest != NULL, NULL); - g_return_val_if_fail (src != NULL, NULL); - do - *d++ = *s; - while (*s++ != '\0'); - - return d - 1; -#endif -} - -gchar* -g_strdup_vprintf (const gchar *format, - va_list args1) -{ - gchar *buffer; - va_list args2; - - G_VA_COPY (args2, args1); - - buffer = g_new (gchar, g_printf_string_upper_bound (format, args1)); - - vsprintf (buffer, format, args2); - va_end (args2); - - return buffer; -} - -gchar* -g_strdup_printf (const gchar *format, - ...) -{ - gchar *buffer; - va_list args; - - va_start (args, format); - buffer = g_strdup_vprintf (format, args); - va_end (args); - - return buffer; -} - -gchar* -g_strconcat (const gchar *string1, ...) -{ - gsize l; - va_list args; - gchar *s; - gchar *concat; - gchar *ptr; - - g_return_val_if_fail (string1 != NULL, NULL); - - l = 1 + strlen (string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - l += strlen (s); - s = va_arg (args, gchar*); - } - va_end (args); - - concat = g_new (gchar, l); - ptr = concat; - - ptr = g_stpcpy (ptr, string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - ptr = g_stpcpy (ptr, s); - s = va_arg (args, gchar*); - } - va_end (args); - - return concat; -} - -gdouble -g_strtod (const gchar *nptr, - gchar **endptr) -{ - gchar *fail_pos_1; - gchar *fail_pos_2; - gdouble val_1; - gdouble val_2 = 0; - - g_return_val_if_fail (nptr != NULL, 0); - - fail_pos_1 = NULL; - fail_pos_2 = NULL; - - val_1 = strtod (nptr, &fail_pos_1); - - if (fail_pos_1 && fail_pos_1[0] != 0) - { - gchar *old_locale; - - old_locale = g_strdup (setlocale (LC_NUMERIC, NULL)); - setlocale (LC_NUMERIC, "C"); - val_2 = strtod (nptr, &fail_pos_2); - setlocale (LC_NUMERIC, old_locale); - g_free (old_locale); - } - - if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2) - { - if (endptr) - *endptr = fail_pos_1; - return val_1; - } - else - { - if (endptr) - *endptr = fail_pos_2; - return val_2; - } -} - -G_CONST_RETURN gchar* -g_strerror (gint errnum) -{ - static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; - char *msg; - -#ifdef HAVE_STRERROR - return strerror (errnum); -#elif NO_SYS_ERRLIST - switch (errnum) - { -#ifdef E2BIG - case E2BIG: return "argument list too long"; -#endif -#ifdef EACCES - case EACCES: return "permission denied"; -#endif -#ifdef EADDRINUSE - case EADDRINUSE: return "address already in use"; -#endif -#ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return "can't assign requested address"; -#endif -#ifdef EADV - case EADV: return "advertise error"; -#endif -#ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return "address family not supported by protocol family"; -#endif -#ifdef EAGAIN - case EAGAIN: return "try again"; -#endif -#ifdef EALIGN - case EALIGN: return "EALIGN"; -#endif -#ifdef EALREADY - case EALREADY: return "operation already in progress"; -#endif -#ifdef EBADE - case EBADE: return "bad exchange descriptor"; -#endif -#ifdef EBADF - case EBADF: return "bad file number"; -#endif -#ifdef EBADFD - case EBADFD: return "file descriptor in bad state"; -#endif -#ifdef EBADMSG - case EBADMSG: return "not a data message"; -#endif -#ifdef EBADR - case EBADR: return "bad request descriptor"; -#endif -#ifdef EBADRPC - case EBADRPC: return "RPC structure is bad"; -#endif -#ifdef EBADRQC - case EBADRQC: return "bad request code"; -#endif -#ifdef EBADSLT - case EBADSLT: return "invalid slot"; -#endif -#ifdef EBFONT - case EBFONT: return "bad font file format"; -#endif -#ifdef EBUSY - case EBUSY: return "mount device busy"; -#endif -#ifdef ECHILD - case ECHILD: return "no children"; -#endif -#ifdef ECHRNG - case ECHRNG: return "channel number out of range"; -#endif -#ifdef ECOMM - case ECOMM: return "communication error on send"; -#endif -#ifdef ECONNABORTED - case ECONNABORTED: return "software caused connection abort"; -#endif -#ifdef ECONNREFUSED - case ECONNREFUSED: return "connection refused"; -#endif -#ifdef ECONNRESET - case ECONNRESET: return "connection reset by peer"; -#endif -#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK)) - case EDEADLK: return "resource deadlock avoided"; -#endif -#ifdef EDEADLOCK - case EDEADLOCK: return "resource deadlock avoided"; -#endif -#ifdef EDESTADDRREQ - case EDESTADDRREQ: return "destination address required"; -#endif -#ifdef EDIRTY - case EDIRTY: return "mounting a dirty fs w/o force"; -#endif -#ifdef EDOM - case EDOM: return "math argument out of range"; -#endif -#ifdef EDOTDOT - case EDOTDOT: return "cross mount point"; -#endif -#ifdef EDQUOT - case EDQUOT: return "disk quota exceeded"; -#endif -#ifdef EDUPPKG - case EDUPPKG: return "duplicate package name"; -#endif -#ifdef EEXIST - case EEXIST: return "file already exists"; -#endif -#ifdef EFAULT - case EFAULT: return "bad address in system call argument"; -#endif -#ifdef EFBIG - case EFBIG: return "file too large"; -#endif -#ifdef EHOSTDOWN - case EHOSTDOWN: return "host is down"; -#endif -#ifdef EHOSTUNREACH - case EHOSTUNREACH: return "host is unreachable"; -#endif -#ifdef EIDRM - case EIDRM: return "identifier removed"; -#endif -#ifdef EINIT - case EINIT: return "initialization error"; -#endif -#ifdef EINPROGRESS - case EINPROGRESS: return "operation now in progress"; -#endif -#ifdef EINTR - case EINTR: return "interrupted system call"; -#endif -#ifdef EINVAL - case EINVAL: return "invalid argument"; -#endif -#ifdef EIO - case EIO: return "I/O error"; -#endif -#ifdef EISCONN - case EISCONN: return "socket is already connected"; -#endif -#ifdef EISDIR - case EISDIR: return "illegal operation on a directory"; -#endif -#ifdef EISNAME - case EISNAM: return "is a name file"; -#endif -#ifdef ELBIN - case ELBIN: return "ELBIN"; -#endif -#ifdef EL2HLT - case EL2HLT: return "level 2 halted"; -#endif -#ifdef EL2NSYNC - case EL2NSYNC: return "level 2 not synchronized"; -#endif -#ifdef EL3HLT - case EL3HLT: return "level 3 halted"; -#endif -#ifdef EL3RST - case EL3RST: return "level 3 reset"; -#endif -#ifdef ELIBACC - case ELIBACC: return "can not access a needed shared library"; -#endif -#ifdef ELIBBAD - case ELIBBAD: return "accessing a corrupted shared library"; -#endif -#ifdef ELIBEXEC - case ELIBEXEC: return "can not exec a shared library directly"; -#endif -#ifdef ELIBMAX - case ELIBMAX: return "attempting to link in more shared libraries than system limit"; -#endif -#ifdef ELIBSCN - case ELIBSCN: return ".lib section in a.out corrupted"; -#endif -#ifdef ELNRNG - case ELNRNG: return "link number out of range"; -#endif -#ifdef ELOOP - case ELOOP: return "too many levels of symbolic links"; -#endif -#ifdef EMFILE - case EMFILE: return "too many open files"; -#endif -#ifdef EMLINK - case EMLINK: return "too many links"; -#endif -#ifdef EMSGSIZE - case EMSGSIZE: return "message too long"; -#endif -#ifdef EMULTIHOP - case EMULTIHOP: return "multihop attempted"; -#endif -#ifdef ENAMETOOLONG - case ENAMETOOLONG: return "file name too long"; -#endif -#ifdef ENAVAIL - case ENAVAIL: return "not available"; -#endif -#ifdef ENET - case ENET: return "ENET"; -#endif -#ifdef ENETDOWN - case ENETDOWN: return "network is down"; -#endif -#ifdef ENETRESET - case ENETRESET: return "network dropped connection on reset"; -#endif -#ifdef ENETUNREACH - case ENETUNREACH: return "network is unreachable"; -#endif -#ifdef ENFILE - case ENFILE: return "file table overflow"; -#endif -#ifdef ENOANO - case ENOANO: return "anode table overflow"; -#endif -#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR)) - case ENOBUFS: return "no buffer space available"; -#endif -#ifdef ENOCSI - case ENOCSI: return "no CSI structure available"; -#endif -#ifdef ENODATA - case ENODATA: return "no data available"; -#endif -#ifdef ENODEV - case ENODEV: return "no such device"; -#endif -#ifdef ENOENT - case ENOENT: return "no such file or directory"; -#endif -#ifdef ENOEXEC - case ENOEXEC: return "exec format error"; -#endif -#ifdef ENOLCK - case ENOLCK: return "no locks available"; -#endif -#ifdef ENOLINK - case ENOLINK: return "link has be severed"; -#endif -#ifdef ENOMEM - case ENOMEM: return "not enough memory"; -#endif -#ifdef ENOMSG - case ENOMSG: return "no message of desired type"; -#endif -#ifdef ENONET - case ENONET: return "machine is not on the network"; -#endif -#ifdef ENOPKG - case ENOPKG: return "package not installed"; -#endif -#ifdef ENOPROTOOPT - case ENOPROTOOPT: return "bad proocol option"; -#endif -#ifdef ENOSPC - case ENOSPC: return "no space left on device"; -#endif -#ifdef ENOSR - case ENOSR: return "out of stream resources"; -#endif -#ifdef ENOSTR - case ENOSTR: return "not a stream device"; -#endif -#ifdef ENOSYM - case ENOSYM: return "unresolved symbol name"; -#endif -#ifdef ENOSYS - case ENOSYS: return "function not implemented"; -#endif -#ifdef ENOTBLK - case ENOTBLK: return "block device required"; -#endif -#ifdef ENOTCONN - case ENOTCONN: return "socket is not connected"; -#endif -#ifdef ENOTDIR - case ENOTDIR: return "not a directory"; -#endif -#ifdef ENOTEMPTY - case ENOTEMPTY: return "directory not empty"; -#endif -#ifdef ENOTNAM - case ENOTNAM: return "not a name file"; -#endif -#ifdef ENOTSOCK - case ENOTSOCK: return "socket operation on non-socket"; -#endif -#ifdef ENOTTY - case ENOTTY: return "inappropriate device for ioctl"; -#endif -#ifdef ENOTUNIQ - case ENOTUNIQ: return "name not unique on network"; -#endif -#ifdef ENXIO - case ENXIO: return "no such device or address"; -#endif -#ifdef EOPNOTSUPP - case EOPNOTSUPP: return "operation not supported on socket"; -#endif -#ifdef EPERM - case EPERM: return "not owner"; -#endif -#ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return "protocol family not supported"; -#endif -#ifdef EPIPE - case EPIPE: return "broken pipe"; -#endif -#ifdef EPROCLIM - case EPROCLIM: return "too many processes"; -#endif -#ifdef EPROCUNAVAIL - case EPROCUNAVAIL: return "bad procedure for program"; -#endif -#ifdef EPROGMISMATCH - case EPROGMISMATCH: return "program version wrong"; -#endif -#ifdef EPROGUNAVAIL - case EPROGUNAVAIL: return "RPC program not available"; -#endif -#ifdef EPROTO - case EPROTO: return "protocol error"; -#endif -#ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return "protocol not suppored"; -#endif -#ifdef EPROTOTYPE - case EPROTOTYPE: return "protocol wrong type for socket"; -#endif -#ifdef ERANGE - case ERANGE: return "math result unrepresentable"; -#endif -#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED)) - case EREFUSED: return "EREFUSED"; -#endif -#ifdef EREMCHG - case EREMCHG: return "remote address changed"; -#endif -#ifdef EREMDEV - case EREMDEV: return "remote device"; -#endif -#ifdef EREMOTE - case EREMOTE: return "pathname hit remote file system"; -#endif -#ifdef EREMOTEIO - case EREMOTEIO: return "remote i/o error"; -#endif -#ifdef EREMOTERELEASE - case EREMOTERELEASE: return "EREMOTERELEASE"; -#endif -#ifdef EROFS - case EROFS: return "read-only file system"; -#endif -#ifdef ERPCMISMATCH - case ERPCMISMATCH: return "RPC version is wrong"; -#endif -#ifdef ERREMOTE - case ERREMOTE: return "object is remote"; -#endif -#ifdef ESHUTDOWN - case ESHUTDOWN: return "can't send afer socket shutdown"; -#endif -#ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return "socket type not supported"; -#endif -#ifdef ESPIPE - case ESPIPE: return "invalid seek"; -#endif -#ifdef ESRCH - case ESRCH: return "no such process"; -#endif -#ifdef ESRMNT - case ESRMNT: return "srmount error"; -#endif -#ifdef ESTALE - case ESTALE: return "stale remote file handle"; -#endif -#ifdef ESUCCESS - case ESUCCESS: return "Error 0"; -#endif -#ifdef ETIME - case ETIME: return "timer expired"; -#endif -#ifdef ETIMEDOUT - case ETIMEDOUT: return "connection timed out"; -#endif -#ifdef ETOOMANYREFS - case ETOOMANYREFS: return "too many references: can't splice"; -#endif -#ifdef ETXTBSY - case ETXTBSY: return "text file or pseudo-device busy"; -#endif -#ifdef EUCLEAN - case EUCLEAN: return "structure needs cleaning"; -#endif -#ifdef EUNATCH - case EUNATCH: return "protocol driver not attached"; -#endif -#ifdef EUSERS - case EUSERS: return "too many users"; -#endif -#ifdef EVERSION - case EVERSION: return "version mismatch"; -#endif -#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) - case EWOULDBLOCK: return "operation would block"; -#endif -#ifdef EXDEV - case EXDEV: return "cross-domain link"; -#endif -#ifdef EXFULL - case EXFULL: return "message tables full"; -#endif - } -#else /* NO_SYS_ERRLIST */ - extern int sys_nerr; - extern char *sys_errlist[]; - - if ((errnum > 0) && (errnum <= sys_nerr)) - return sys_errlist [errnum]; -#endif /* NO_SYS_ERRLIST */ - - msg = g_static_private_get (&msg_private); - if (!msg) - { - msg = g_new (gchar, 64); - g_static_private_set (&msg_private, msg, g_free); - } - - sprintf (msg, "unknown error (%d)", errnum); - - return msg; -} - -G_CONST_RETURN gchar* -g_strsignal (gint signum) -{ - static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; - char *msg; - -#ifdef HAVE_STRSIGNAL -#if defined(G_OS_BEOS) || defined(G_WITH_CYGWIN) -extern const char *strsignal(int); -#else - /* this is declared differently (const) in string.h on BeOS */ - extern char *strsignal (int sig); -#endif /* !G_OS_BEOS && !G_WITH_CYGWIN */ - return strsignal (signum); -#elif NO_SYS_SIGLIST - switch (signum) - { -#ifdef SIGHUP - case SIGHUP: return "Hangup"; -#endif -#ifdef SIGINT - case SIGINT: return "Interrupt"; -#endif -#ifdef SIGQUIT - case SIGQUIT: return "Quit"; -#endif -#ifdef SIGILL - case SIGILL: return "Illegal instruction"; -#endif -#ifdef SIGTRAP - case SIGTRAP: return "Trace/breakpoint trap"; -#endif -#ifdef SIGABRT - case SIGABRT: return "IOT trap/Abort"; -#endif -#ifdef SIGBUS - case SIGBUS: return "Bus error"; -#endif -#ifdef SIGFPE - case SIGFPE: return "Floating point exception"; -#endif -#ifdef SIGKILL - case SIGKILL: return "Killed"; -#endif -#ifdef SIGUSR1 - case SIGUSR1: return "User defined signal 1"; -#endif -#ifdef SIGSEGV - case SIGSEGV: return "Segmentation fault"; -#endif -#ifdef SIGUSR2 - case SIGUSR2: return "User defined signal 2"; -#endif -#ifdef SIGPIPE - case SIGPIPE: return "Broken pipe"; -#endif -#ifdef SIGALRM - case SIGALRM: return "Alarm clock"; -#endif -#ifdef SIGTERM - case SIGTERM: return "Terminated"; -#endif -#ifdef SIGSTKFLT - case SIGSTKFLT: return "Stack fault"; -#endif -#ifdef SIGCHLD - case SIGCHLD: return "Child exited"; -#endif -#ifdef SIGCONT - case SIGCONT: return "Continued"; -#endif -#ifdef SIGSTOP - case SIGSTOP: return "Stopped (signal)"; -#endif -#ifdef SIGTSTP - case SIGTSTP: return "Stopped"; -#endif -#ifdef SIGTTIN - case SIGTTIN: return "Stopped (tty input)"; -#endif -#ifdef SIGTTOU - case SIGTTOU: return "Stopped (tty output)"; -#endif -#ifdef SIGURG - case SIGURG: return "Urgent condition"; -#endif -#ifdef SIGXCPU - case SIGXCPU: return "CPU time limit exceeded"; -#endif -#ifdef SIGXFSZ - case SIGXFSZ: return "File size limit exceeded"; -#endif -#ifdef SIGVTALRM - case SIGVTALRM: return "Virtual time alarm"; -#endif -#ifdef SIGPROF - case SIGPROF: return "Profile signal"; -#endif -#ifdef SIGWINCH - case SIGWINCH: return "Window size changed"; -#endif -#ifdef SIGIO - case SIGIO: return "Possible I/O"; -#endif -#ifdef SIGPWR - case SIGPWR: return "Power failure"; -#endif -#ifdef SIGUNUSED - case SIGUNUSED: return "Unused signal"; -#endif - } -#else /* NO_SYS_SIGLIST */ - -#ifdef NO_SYS_SIGLIST_DECL - extern char *sys_siglist[]; /*(see Tue Jan 19 00:44:24 1999 in changelog)*/ -#endif - - return (char*) /* this function should return const --josh */ sys_siglist [signum]; -#endif /* NO_SYS_SIGLIST */ - - msg = g_static_private_get (&msg_private); - if (!msg) - { - msg = g_new (gchar, 64); - g_static_private_set (&msg_private, msg, g_free); - } - - sprintf (msg, "unknown signal (%d)", signum); - - return msg; -} - -/* Functions g_strlcpy and g_strlcat were originally developed by - * Todd C. Miller to simplify writing secure code. - * See ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3 - * for more information. - */ - -#ifdef HAVE_STRLCPY -/* Use the native ones, if available; they might be implemented in assembly */ -gsize -g_strlcpy (gchar *dest, - const gchar *src, - gsize dest_size) -{ - g_return_val_if_fail (dest != NULL, 0); - g_return_val_if_fail (src != NULL, 0); - - return strlcpy (dest, src, dest_size); -} - -gsize -g_strlcat (gchar *dest, - const gchar *src, - gsize dest_size) -{ - g_return_val_if_fail (dest != NULL, 0); - g_return_val_if_fail (src != NULL, 0); - - return strlcat (dest, src, dest_size); -} - -#else /* ! HAVE_STRLCPY */ -/* g_strlcpy - * - * Copy string src to buffer dest (of buffer size dest_size). At most - * dest_size-1 characters will be copied. Always NUL terminates - * (unless dest_size == 0). This function does NOT allocate memory. - * Unlike strncpy, this function doesn't pad dest (so it's often faster). - * Returns size of attempted result, strlen(src), - * so if retval >= dest_size, truncation occurred. - */ -gsize -g_strlcpy (gchar *dest, - const gchar *src, - gsize dest_size) -{ - register gchar *d = dest; - register const gchar *s = src; - register gsize n = dest_size; - - g_return_val_if_fail (dest != NULL, 0); - g_return_val_if_fail (src != NULL, 0); - - /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) - do - { - register gchar c = *s++; - - *d++ = c; - if (c == 0) - break; - } - while (--n != 0); - - /* If not enough room in dest, add NUL and traverse rest of src */ - if (n == 0) - { - if (dest_size != 0) - *d = 0; - while (*s++) - ; - } - - return s - src - 1; /* count does not include NUL */ -} - -/* g_strlcat - * - * Appends string src to buffer dest (of buffer size dest_size). - * At most dest_size-1 characters will be copied. - * Unlike strncat, dest_size is the full size of dest, not the space left over. - * This function does NOT allocate memory. - * This always NUL terminates (unless siz == 0 or there were no NUL characters - * in the dest_size characters of dest to start with). - * Returns size of attempted result, which is - * MIN (dest_size, strlen (original dest)) + strlen (src), - * so if retval >= dest_size, truncation occurred. - */ -gsize -g_strlcat (gchar *dest, - const gchar *src, - gsize dest_size) -{ - register gchar *d = dest; - register const gchar *s = src; - register gsize bytes_left = dest_size; - gsize dlength; /* Logically, MIN (strlen (d), dest_size) */ - - g_return_val_if_fail (dest != NULL, 0); - g_return_val_if_fail (src != NULL, 0); - - /* Find the end of dst and adjust bytes left but don't go past end */ - while (*d != 0 && bytes_left-- != 0) - d++; - dlength = d - dest; - bytes_left = dest_size - dlength; - - if (bytes_left == 0) - return dlength + strlen (s); - - while (*s != 0) - { - if (bytes_left != 1) - { - *d++ = *s; - bytes_left--; - } - s++; - } - *d = 0; - - return dlength + (s - src); /* count does not include NUL */ -} -#endif /* ! HAVE_STRLCPY */ - -gchar* -g_strdown (gchar *string) -{ - register guchar *s; - - g_return_val_if_fail (string != NULL, NULL); - - s = (guchar *) string; - - while (*s) - { - if (isupper (*s)) - *s = tolower (*s); - s++; - } - - return (gchar *) string; -} - -gchar* -g_strup (gchar *string) -{ - register guchar *s; - - g_return_val_if_fail (string != NULL, NULL); - - s = (guchar *) string; - - while (*s) - { - if (islower (*s)) - *s = toupper (*s); - s++; - } - - return (gchar *) string; -} - -gchar* -g_strreverse (gchar *string) -{ - g_return_val_if_fail (string != NULL, NULL); - - if (*string) - { - register gchar *h, *t; - - h = string; - t = string + strlen (string) - 1; - - while (h < t) - { - register gchar c; - - c = *h; - *h = *t; - h++; - *t = c; - t--; - } - } - - return string; -} - -gint -g_strcasecmp (const gchar *s1, - const gchar *s2) -{ -#ifdef HAVE_STRCASECMP - g_return_val_if_fail (s1 != NULL, 0); - g_return_val_if_fail (s2 != NULL, 0); - - return strcasecmp (s1, s2); -#else - gint c1, c2; - - g_return_val_if_fail (s1 != NULL, 0); - g_return_val_if_fail (s2 != NULL, 0); - - while (*s1 && *s2) - { - /* According to A. Cox, some platforms have islower's that - * don't work right on non-uppercase - */ - c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; - c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; - if (c1 != c2) - return (c1 - c2); - s1++; s2++; - } - - return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); -#endif -} - -gint -g_strncasecmp (const gchar *s1, - const gchar *s2, - gsize n) -{ -#ifdef HAVE_STRNCASECMP - return strncasecmp (s1, s2, n); -#else - gint c1, c2; - - g_return_val_if_fail (s1 != NULL, 0); - g_return_val_if_fail (s2 != NULL, 0); - - while (n && *s1 && *s2) - { - n -= 1; - /* According to A. Cox, some platforms have islower's that - * don't work right on non-uppercase - */ - c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; - c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; - if (c1 != c2) - return (c1 - c2); - s1++; s2++; - } - - if (n) - return (((gint) (guchar) *s1) - ((gint) (guchar) *s2)); - else - return 0; -#endif -} - -gchar* -g_strdelimit (gchar *string, - const gchar *delimiters, - gchar new_delim) -{ - register gchar *c; - - g_return_val_if_fail (string != NULL, NULL); - - if (!delimiters) - delimiters = G_STR_DELIMITERS; - - for (c = string; *c; c++) - { - if (strchr (delimiters, *c)) - *c = new_delim; - } - - return string; -} - -gchar* -g_strcanon (gchar *string, - const gchar *valid_chars, - gchar substitutor) -{ - register gchar *c; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (valid_chars != NULL, NULL); - - for (c = string; *c; c++) - { - if (!strchr (valid_chars, *c)) - *c = substitutor; - } - - return string; -} - -gchar* -g_strcompress (const gchar *source) -{ - const gchar *p = source, *octal; - gchar *dest = g_malloc (strlen (source) + 1); - gchar *q = dest; - - while (*p) - { - if (*p == '\\') - { - p++; - switch (*p) - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': - *q = 0; - octal = p; - while ((p < octal + 3) && (*p >= '0') && (*p <= '7')) - { - *q = (*q * 8) + (*p - '0'); - p++; - } - q++; - p--; - break; - case 'b': - *q++ = '\b'; - break; - case 'f': - *q++ = '\f'; - break; - case 'n': - *q++ = '\n'; - break; - case 'r': - *q++ = '\r'; - break; - case 't': - *q++ = '\t'; - break; - default: /* Also handles \" and \\ */ - *q++ = *p; - break; - } - } - else - *q++ = *p; - p++; - } - *q = 0; - - return dest; -} - -gchar * -g_strescape (const gchar *source, - const gchar *exceptions) -{ - const guchar *p; - gchar *dest; - gchar *q; - guchar excmap[256]; - - g_return_val_if_fail (source != NULL, NULL); - - p = (guchar *) source; - /* Each source byte needs maximally four destination chars (\777) */ - q = dest = g_malloc (strlen (source) * 4 + 1); - - memset (excmap, 0, 256); - if (exceptions) - { - guchar *e = (guchar *) exceptions; - - while (*e) - { - excmap[*e] = 1; - e++; - } - } - - while (*p) - { - if (excmap[*p]) - *q++ = *p; - else - { - switch (*p) - { - case '\b': - *q++ = '\\'; - *q++ = 'b'; - break; - case '\f': - *q++ = '\\'; - *q++ = 'f'; - break; - case '\n': - *q++ = '\\'; - *q++ = 'n'; - break; - case '\r': - *q++ = '\\'; - *q++ = 'r'; - break; - case '\t': - *q++ = '\\'; - *q++ = 't'; - break; - case '\\': - *q++ = '\\'; - *q++ = '\\'; - break; - case '"': - *q++ = '\\'; - *q++ = '"'; - break; - default: - if ((*p < ' ') || (*p >= 0177)) - { - *q++ = '\\'; - *q++ = '0' + (((*p) >> 6) & 07); - *q++ = '0' + (((*p) >> 3) & 07); - *q++ = '0' + ((*p) & 07); - } - else - *q++ = *p; - break; - } - } - p++; - } - *q = 0; - return dest; -} - -gchar* -g_strchug (gchar *string) -{ - guchar *start; - - g_return_val_if_fail (string != NULL, NULL); - - for (start = (guchar*) string; *start && isspace (*start); start++) - ; - - g_memmove (string, start, strlen ((gchar *) start) + 1); - - return string; -} - -gchar* -g_strchomp (gchar *string) -{ - gchar *s; - - g_return_val_if_fail (string != NULL, NULL); - - if (!*string) - return string; - - for (s = string + strlen (string) - 1; s >= string && isspace ((guchar)*s); - s--) - *s = '\0'; - - return string; -} - -gchar** -g_strsplit (const gchar *string, - const gchar *delimiter, - gint max_tokens) -{ - GSList *string_list = NULL, *slist; - gchar **str_array, *s; - guint n = 1; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (delimiter != NULL, NULL); - - if (max_tokens < 1) - max_tokens = G_MAXINT; - - s = strstr (string, delimiter); - if (s) - { - gsize delimiter_len = strlen (delimiter); - - do - { - gsize len; - gchar *new_string; - - len = s - string; - new_string = g_new (gchar, len + 1); - strncpy (new_string, string, len); - new_string[len] = 0; - string_list = g_slist_prepend (string_list, new_string); - n++; - string = s + delimiter_len; - s = strstr (string, delimiter); - } - while (--max_tokens && s); - } - string_list = g_slist_prepend (string_list, g_strdup (string)); - - str_array = g_new (gchar*, n + 1); - - str_array[n--] = NULL; - for (slist = string_list; slist; slist = slist->next) - str_array[n--] = slist->data; - - g_slist_free (string_list); - - return str_array; -} - -void -g_strfreev (gchar **str_array) -{ - if (str_array) - { - int i; - - for(i = 0; str_array[i] != NULL; i++) - g_free(str_array[i]); - - g_free (str_array); - } -} - -/** - * g_strdupv: - * @str_array: %NULL-terminated array of strings - * - * Copies %NULL-terminated array of strings. The copy is a deep copy; - * the new array should be freed by first freeing each string, then - * the array itself. g_strfreev() does this for you. If called - * on a %NULL value, g_strdupv() simply returns %NULL. - * - * Return value: a new %NULL-terminated array of strings - **/ -gchar** -g_strdupv (gchar **str_array) -{ - if (str_array) - { - gint i; - gchar **retval; - - i = 0; - while (str_array[i]) - ++i; - - retval = g_new (gchar*, i + 1); - - i = 0; - while (str_array[i]) - { - retval[i] = g_strdup (str_array[i]); - ++i; - } - retval[i] = NULL; - - return retval; - } - else - return NULL; -} - -gchar* -g_strjoinv (const gchar *separator, - gchar **str_array) -{ - gchar *string; - gchar *ptr; - - g_return_val_if_fail (str_array != NULL, NULL); - - if (separator == NULL) - separator = ""; - - if (*str_array) - { - gint i; - gsize len; - gsize separator_len; - - separator_len = strlen (separator); - /* First part, getting length */ - len = 1 + strlen (str_array[0]); - for (i = 1; str_array[i] != NULL; i++) - len += strlen (str_array[i]); - len += separator_len * (i - 1); - - /* Second part, building string */ - string = g_new (gchar, len); - ptr = g_stpcpy (string, *str_array); - for (i = 1; str_array[i] != NULL; i++) - { - ptr = g_stpcpy (ptr, separator); - ptr = g_stpcpy (ptr, str_array[i]); - } - } - else - string = g_strdup (""); - - return string; -} - -gchar* -g_strjoin (const gchar *separator, - ...) -{ - gchar *string, *s; - va_list args; - gsize len; - gsize separator_len; - gchar *ptr; - - if (separator == NULL) - separator = ""; - - separator_len = strlen (separator); - - va_start (args, separator); - - s = va_arg (args, gchar*); - - if (s) - { - /* First part, getting length */ - len = 1 + strlen (s); - - s = va_arg (args, gchar*); - while (s) - { - len += separator_len + strlen (s); - s = va_arg (args, gchar*); - } - va_end (args); - - /* Second part, building string */ - string = g_new (gchar, len); - - va_start (args, separator); - - s = va_arg (args, gchar*); - ptr = g_stpcpy (string, s); - - s = va_arg (args, gchar*); - while (s) - { - ptr = g_stpcpy (ptr, separator); - ptr = g_stpcpy (ptr, s); - s = va_arg (args, gchar*); - } - } - else - string = g_strdup (""); - - va_end (args); - - return string; -} - - -/** - * g_strstr_len: - * @haystack: a string - * @haystack_len: The maximum length of haystack - * @needle: The string to search for. - * - * Searches the string haystack for the first occurrence - * of the string needle, limiting the length of the search - * to haystack_len. - * - * Return value: A pointer to the found occurrence, or - * NULL if not found. - **/ -gchar * -g_strstr_len (const gchar *haystack, - gssize haystack_len, - const gchar *needle) -{ - g_return_val_if_fail (haystack != NULL, NULL); - g_return_val_if_fail (needle != NULL, NULL); - - if (haystack_len < 0) - return strstr (haystack, needle); - else - { - const gchar *p = haystack; - gsize needle_len = strlen (needle); - const gchar *end; - gsize i; - - if (needle_len == 0) - return (gchar *)haystack; - - if (haystack_len < needle_len) - return NULL; - - end = haystack + haystack_len - needle_len; - - while (*p && p <= end) - { - for (i = 0; i < needle_len; i++) - if (p[i] != needle[i]) - goto next; - - return (gchar *)p; - - next: - p++; - } - - return NULL; - } -} - -/** - * g_strrstr_len: - * @haystack: a nul-terminated string - * @needle: The nul-terminated string to search for. - * - * Searches the string haystack for the last occurrence - * of the string needle. - * - * Return value: A pointer to the found occurrence, or - * NULL if not found. - **/ -gchar * -g_strrstr (const gchar *haystack, - const gchar *needle) -{ - gsize i; - gsize needle_len; - gsize haystack_len; - const gchar *p; - - g_return_val_if_fail (haystack != NULL, NULL); - g_return_val_if_fail (needle != NULL, NULL); - - needle_len = strlen (needle); - haystack_len = strlen (haystack); - - if (needle_len == 0) - return (gchar *)haystack; - - if (haystack_len < needle_len) - return NULL; - - p = haystack + haystack_len - needle_len; - - while (p >= haystack) - { - for (i = 0; i < needle_len; i++) - if (p[i] != needle[i]) - goto next; - - return (gchar *)p; - - next: - p--; - } - - return NULL; -} - -/** - * g_strrstr_len: - * @haystack: a nul-terminated string - * @haystack_len: The maximum length of haystack - * @needle: The nul-terminated string to search for. - * - * Searches the string haystack for the last occurrence - * of the string needle, limiting the length of the search - * to haystack_len. - * - * Return value: A pointer to the found occurrence, or - * NULL if not found. - **/ -gchar * -g_strrstr_len (const gchar *haystack, - gint haystack_len, - const gchar *needle) -{ - g_return_val_if_fail (haystack != NULL, NULL); - g_return_val_if_fail (needle != NULL, NULL); - - if (haystack_len < 0) - return g_strrstr (haystack, needle); - else - { - gsize needle_len = strlen (needle); - const gchar *haystack_max = haystack + haystack_len; - const gchar *p = haystack; - gsize i; - - while (p < haystack_max && *p) - p++; - - if (p < haystack + needle_len) - return NULL; - - p -= needle_len; - - while (p >= haystack) - { - for (i = 0; i < needle_len; i++) - if (p[i] != needle[i]) - goto next; - - return (gchar *)p; - - next: - p--; - } - - return NULL; - } -} - - diff --git a/gstrfuncs.h b/gstrfuncs.h deleted file mode 100644 index 1c6ba9bd..00000000 --- a/gstrfuncs.h +++ /dev/null @@ -1,136 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_STRFUNCS_H__ -#define __G_STRFUNCS_H__ - -#include -#include - -G_BEGIN_DECLS - -/* String utility functions that modify a string argument or - * return a constant string that must not be freed. - */ -#define G_STR_DELIMITERS "_-|> <." -gchar* g_strdelimit (gchar *string, - const gchar *delimiters, - gchar new_delimiter); -gchar* g_strcanon (gchar *string, - const gchar *valid_chars, - gchar substitutor); -gdouble g_strtod (const gchar *nptr, - gchar **endptr); -G_CONST_RETURN gchar* g_strerror (gint errnum) G_GNUC_CONST; -G_CONST_RETURN gchar* g_strsignal (gint signum) G_GNUC_CONST; -gint g_strcasecmp (const gchar *s1, - const gchar *s2); -gint g_strncasecmp (const gchar *s1, - const gchar *s2, - gsize n); -gchar* g_strdown (gchar *string); -gchar* g_strup (gchar *string); -gchar* g_strreverse (gchar *string); -gsize g_strlcpy (gchar *dest, - const gchar *src, - gsize dest_size); -gsize g_strlcat (gchar *dest, - const gchar *src, - gsize dest_size); -gchar * g_strstr_len (const gchar *haystack, - gssize haystack_len, - const gchar *needle); -gchar * g_strrstr (const gchar *haystack, - const gchar *needle); -gchar * g_strrstr_len (const gchar *haystack, - gssize haystack_len, - const gchar *needle); - -/* removes leading spaces */ -gchar* g_strchug (gchar *string); -/* removes trailing spaces */ -gchar* g_strchomp (gchar *string); -/* removes leading & trailing spaces */ -#define g_strstrip( string ) g_strchomp (g_strchug (string)) - -/* String utility functions that return a newly allocated string which - * ought to be freed with g_free from the caller at some point. - */ -gchar* g_strdup (const gchar *str); -gchar* g_strdup_printf (const gchar *format, - ...) G_GNUC_PRINTF (1, 2); -gchar* g_strdup_vprintf (const gchar *format, - va_list args); -gchar* g_strndup (const gchar *str, - gsize n); -gchar* g_strnfill (gsize length, - gchar fill_char); -gchar* g_strconcat (const gchar *string1, - ...); /* NULL terminated */ -gchar* g_strjoin (const gchar *separator, - ...); /* NULL terminated */ -/* Make a copy of a string interpreting C string -style escape - * sequences. Inverse of g_strescape. The recognized sequences are \b - * \f \n \r \t \\ \" and the octal format. - */ -gchar* g_strcompress (const gchar *source); - -/* Copy a string escaping nonprintable characters like in C strings. - * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points - * to a string containing characters that are not to be escaped. - * - * Deprecated API: gchar* g_strescape (const gchar *source); - * Luckily this function wasn't used much, using NULL as second parameter - * provides mostly identical semantics. - */ -gchar* g_strescape (const gchar *source, - const gchar *exceptions); - -gpointer g_memdup (gconstpointer mem, - guint byte_size); - -/* NULL terminated string arrays. - * g_strsplit() splits up string into max_tokens tokens at delim and - * returns a newly allocated string array. - * g_strjoinv() concatenates all of str_array's strings, sliding in an - * optional separator, the returned string is newly allocated. - * g_strfreev() frees the array itself and all of its strings. - * g_strdupv() copies a NULL-terminated array of strings - */ -gchar** g_strsplit (const gchar *string, - const gchar *delimiter, - gint max_tokens); -gchar* g_strjoinv (const gchar *separator, - gchar **str_array); -void g_strfreev (gchar **str_array); -gchar** g_strdupv (gchar **str_array); - -gchar* g_stpcpy (gchar *dest, - const char *src); - -G_END_DECLS - -#endif /* __G_STRFUNCS_H__ */ diff --git a/gstring.c b/gstring.c deleted file mode 100644 index df64869a..00000000 --- a/gstring.c +++ /dev/null @@ -1,616 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include -#include -#include -#include "glib.h" - -typedef struct _GRealStringChunk GRealStringChunk; -typedef struct _GRealString GRealString; - -struct _GRealStringChunk -{ - GHashTable *const_table; - GSList *storage_list; - gsize storage_next; - gsize this_size; - gsize default_size; -}; - -struct _GRealString -{ - gchar *str; - gsize len; - gsize alloc; -}; - -G_LOCK_DEFINE_STATIC (string_mem_chunk); -static GMemChunk *string_mem_chunk = NULL; - -/* Hash Functions. - */ - -gboolean -g_str_equal (gconstpointer v1, - gconstpointer v2) -{ - const gchar *string1 = v1; - const gchar *string2 = v2; - - return strcmp (string1, string2) == 0; -} - -/* 31 bit hash function */ -guint -g_str_hash (gconstpointer key) -{ - const char *p = key; - guint h = *p; - - if (h) - for (p += 1; *p != '\0'; p++) - h = (h << 5) - h + *p; - - return h; -} - -#define MY_MAXSIZE ((gsize)-1) - -static inline gsize -nearest_power (gsize base, gsize num) -{ - if (num > MY_MAXSIZE / 2) - { - return MY_MAXSIZE; - } - else - { - gsize n = base; - - while (n < num) - n <<= 1; - - return n; - } -} - -/* String Chunks. - */ - -GStringChunk* -g_string_chunk_new (gsize default_size) -{ - GRealStringChunk *new_chunk = g_new (GRealStringChunk, 1); - gsize size = 1; - - size = nearest_power (1, default_size); - - new_chunk->const_table = NULL; - new_chunk->storage_list = NULL; - new_chunk->storage_next = size; - new_chunk->default_size = size; - new_chunk->this_size = size; - - return (GStringChunk*) new_chunk; -} - -void -g_string_chunk_free (GStringChunk *fchunk) -{ - GRealStringChunk *chunk = (GRealStringChunk*) fchunk; - GSList *tmp_list; - - g_return_if_fail (chunk != NULL); - - if (chunk->storage_list) - { - for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next) - g_free (tmp_list->data); - - g_slist_free (chunk->storage_list); - } - - if (chunk->const_table) - g_hash_table_destroy (chunk->const_table); - - g_free (chunk); -} - -gchar* -g_string_chunk_insert (GStringChunk *fchunk, - const gchar *string) -{ - GRealStringChunk *chunk = (GRealStringChunk*) fchunk; - gsize len = strlen (string); - char* pos; - - g_return_val_if_fail (chunk != NULL, NULL); - - if ((chunk->storage_next + len + 1) > chunk->this_size) - { - gsize new_size = nearest_power (chunk->default_size, len + 1); - - chunk->storage_list = g_slist_prepend (chunk->storage_list, - g_new (char, new_size)); - - chunk->this_size = new_size; - chunk->storage_next = 0; - } - - pos = ((char *) chunk->storage_list->data) + chunk->storage_next; - - strcpy (pos, string); - - chunk->storage_next += len + 1; - - return pos; -} - -gchar* -g_string_chunk_insert_const (GStringChunk *fchunk, - const gchar *string) -{ - GRealStringChunk *chunk = (GRealStringChunk*) fchunk; - char* lookup; - - g_return_val_if_fail (chunk != NULL, NULL); - - if (!chunk->const_table) - chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal); - - lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string); - - if (!lookup) - { - lookup = g_string_chunk_insert (fchunk, string); - g_hash_table_insert (chunk->const_table, lookup, lookup); - } - - return lookup; -} - -/* Strings. - */ -static void -g_string_maybe_expand (GRealString* string, - gsize len) -{ - if (string->len + len >= string->alloc) - { - string->alloc = nearest_power (1, string->len + len + 1); - string->str = g_realloc (string->str, string->alloc); - } -} - -GString* -g_string_sized_new (gsize dfl_size) -{ - GRealString *string; - - G_LOCK (string_mem_chunk); - if (!string_mem_chunk) - string_mem_chunk = g_mem_chunk_new ("string mem chunk", - sizeof (GRealString), - 1024, G_ALLOC_AND_FREE); - - string = g_chunk_new (GRealString, string_mem_chunk); - G_UNLOCK (string_mem_chunk); - - string->alloc = 0; - string->len = 0; - string->str = NULL; - - g_string_maybe_expand (string, MAX (dfl_size, 2)); - string->str[0] = 0; - - return (GString*) string; -} - -GString* -g_string_new (const gchar *init) -{ - GString *string; - - string = g_string_sized_new (init ? strlen (init) + 2 : 2); - - if (init) - g_string_append (string, init); - - return string; -} - -GString* -g_string_new_len (const gchar *init, - gssize len) -{ - GString *string; - - if (len < 0) - return g_string_new (init); - else - { - string = g_string_sized_new (len); - - if (init) - g_string_append_len (string, init, len); - - return string; - } -} - -gchar* -g_string_free (GString *string, - gboolean free_segment) -{ - gchar *segment; - - g_return_val_if_fail (string != NULL, NULL); - - if (free_segment) - { - g_free (string->str); - segment = NULL; - } - else - segment = string->str; - - G_LOCK (string_mem_chunk); - g_mem_chunk_free (string_mem_chunk, string); - G_UNLOCK (string_mem_chunk); - - return segment; -} - -gboolean -g_string_equal (const GString *v, - const GString *v2) -{ - gchar *p, *q; - GRealString *string1 = (GRealString *) v; - GRealString *string2 = (GRealString *) v2; - gsize i = string1->len; - - if (i != string2->len) - return FALSE; - - p = string1->str; - q = string2->str; - while (i) - { - if (*p != *q) - return FALSE; - p++; - q++; - i--; - } - return TRUE; -} - -/* 31 bit hash function */ -guint -g_string_hash (const GString *str) -{ - const gchar *p = str->str; - gsize n = str->len; - guint h = 0; - - while (n--) - { - h = (h << 5) - h + *p; - p++; - } - - return h; -} - -GString* -g_string_assign (GString *string, - const gchar *rval) -{ - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (rval != NULL, string); - - g_string_truncate (string, 0); - g_string_append (string, rval); - - return string; -} - -GString* -g_string_truncate (GString *fstring, - gsize len) -{ - GRealString *string = (GRealString *) fstring; - - g_return_val_if_fail (string != NULL, NULL); - - string->len = MIN (len, string->len); - - string->str[string->len] = 0; - - return fstring; -} - -GString* -g_string_insert_len (GString *fstring, - gssize pos, - const gchar *val, - gssize len) -{ - GRealString *string = (GRealString *) fstring; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (val != NULL, fstring); - - if (len < 0) - len = strlen (val); - - if (pos < 0) - pos = string->len; - else - g_return_val_if_fail (pos <= string->len, fstring); - - g_string_maybe_expand (string, len); - - /* If we aren't appending at the end, move a hunk - * of the old string to the end, opening up space - */ - if (pos < string->len) - g_memmove (string->str + pos + len, string->str + pos, string->len - pos); - - /* insert the new string */ - g_memmove (string->str + pos, val, len); - - string->len += len; - - string->str[string->len] = 0; - - return fstring; -} - -GString* -g_string_append (GString *fstring, - const gchar *val) -{ - g_return_val_if_fail (fstring != NULL, NULL); - g_return_val_if_fail (val != NULL, fstring); - - return g_string_insert_len (fstring, -1, val, -1); -} - -GString* -g_string_append_len (GString *string, - const gchar *val, - gssize len) -{ - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (val != NULL, string); - - return g_string_insert_len (string, -1, val, len); -} - -GString* -g_string_append_c (GString *fstring, - gchar c) -{ - g_return_val_if_fail (fstring != NULL, NULL); - - return g_string_insert_c (fstring, -1, c); -} - -GString* -g_string_prepend (GString *fstring, - const gchar *val) -{ - g_return_val_if_fail (fstring != NULL, NULL); - g_return_val_if_fail (val != NULL, fstring); - - return g_string_insert_len (fstring, 0, val, -1); -} - -GString* -g_string_prepend_len (GString *string, - const gchar *val, - gssize len) -{ - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (val != NULL, string); - - return g_string_insert_len (string, 0, val, len); -} - -GString* -g_string_prepend_c (GString *fstring, - gchar c) -{ - g_return_val_if_fail (fstring != NULL, NULL); - - return g_string_insert_c (fstring, 0, c); -} - -GString* -g_string_insert (GString *fstring, - gssize pos, - const gchar *val) -{ - g_return_val_if_fail (fstring != NULL, NULL); - g_return_val_if_fail (val != NULL, fstring); - if (pos >= 0) - g_return_val_if_fail (pos <= fstring->len, fstring); - - return g_string_insert_len (fstring, pos, val, -1); -} - -GString* -g_string_insert_c (GString *fstring, - gssize pos, - gchar c) -{ - GRealString *string = (GRealString *) fstring; - - g_return_val_if_fail (string != NULL, NULL); - - g_string_maybe_expand (string, 1); - - if (pos < 0) - pos = string->len; - else - g_return_val_if_fail (pos <= string->len, fstring); - - /* If not just an append, move the old stuff */ - if (pos < string->len) - g_memmove (string->str + pos + 1, string->str + pos, string->len - pos); - - string->str[pos] = c; - - string->len += 1; - - string->str[string->len] = 0; - - return fstring; -} - -GString* -g_string_erase (GString *fstring, - gsize pos, - gsize len) -{ - GRealString *string = (GRealString*)fstring; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (pos >= 0, fstring); - g_return_val_if_fail (pos <= string->len, fstring); - - if (len < 0) - len = string->len - pos; - else - { - g_return_val_if_fail (pos + len <= string->len, fstring); - - if (pos + len < string->len) - g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len)); - } - - string->len -= len; - - string->str[string->len] = 0; - - return fstring; -} - -GString* -g_string_down (GString *fstring) -{ - GRealString *string = (GRealString *) fstring; - guchar *s; - glong n = string->len; - - g_return_val_if_fail (string != NULL, NULL); - - s = (guchar *) string->str; - - while (n) - { - *s = tolower (*s); - s++; - n--; - } - - return fstring; -} - -GString* -g_string_up (GString *fstring) -{ - GRealString *string = (GRealString *) fstring; - guchar *s; - glong n = string->len; - - g_return_val_if_fail (string != NULL, NULL); - - s = (guchar *) string->str; - - while (n) - { - *s = toupper (*s); - s++; - n--; - } - - return fstring; -} - -static void -g_string_printfa_internal (GString *string, - const gchar *fmt, - va_list args) -{ - gchar *buffer; - - buffer = g_strdup_vprintf (fmt, args); - g_string_append (string, buffer); - g_free (buffer); -} - -void -g_string_printf (GString *string, - const gchar *fmt, - ...) -{ - va_list args; - - g_string_truncate (string, 0); - - va_start (args, fmt); - g_string_printfa_internal (string, fmt, args); - va_end (args); -} - -void -g_string_printfa (GString *string, - const gchar *fmt, - ...) -{ - va_list args; - - va_start (args, fmt); - g_string_printfa_internal (string, fmt, args); - va_end (args); -} diff --git a/gstring.h b/gstring.h deleted file mode 100644 index 6c2360db..00000000 --- a/gstring.h +++ /dev/null @@ -1,110 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_STRING_H__ -#define __G_STRING_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GString GString; -typedef struct _GStringChunk GStringChunk; - -struct _GString -{ - gchar *str; - gssize len; -}; - -/* String Chunks - */ -GStringChunk* g_string_chunk_new (gsize size); -void g_string_chunk_free (GStringChunk *chunk); -gchar* g_string_chunk_insert (GStringChunk *chunk, - const gchar *string); -gchar* g_string_chunk_insert_const (GStringChunk *chunk, - const gchar *string); - - -/* Strings - */ -GString* g_string_new (const gchar *init); -GString* g_string_new_len (const gchar *init, - gssize len); -GString* g_string_sized_new (gsize dfl_size); -gchar* g_string_free (GString *string, - gboolean free_segment); -gboolean g_string_equal (const GString *v, - const GString *v2); -guint g_string_hash (const GString *str); -GString* g_string_assign (GString *string, - const gchar *rval); -GString* g_string_truncate (GString *string, - gsize len); -GString* g_string_insert_len (GString *string, - gssize pos, - const gchar *val, - gssize len); -GString* g_string_append (GString *string, - const gchar *val); -GString* g_string_append_len (GString *string, - const gchar *val, - gssize len); -GString* g_string_append_c (GString *string, - gchar c); -GString* g_string_prepend (GString *string, - const gchar *val); -GString* g_string_prepend_c (GString *string, - gchar c); -GString* g_string_prepend_len (GString *string, - const gchar *val, - gssize len); -GString* g_string_insert (GString *string, - gssize pos, - const gchar *val); -GString* g_string_insert_c (GString *string, - gssize pos, - gchar c); -GString* g_string_erase (GString *string, - gsize pos, - gsize len); -GString* g_string_down (GString *string); -GString* g_string_up (GString *string); -void g_string_printf (GString *string, - const gchar *format, - ...) G_GNUC_PRINTF (2, 3); -void g_string_printfa (GString *string, - const gchar *format, - ...) G_GNUC_PRINTF (2, 3); -/* compatibility */ -#define g_string_sprintf g_string_printf -#define g_string_sprintfa g_string_printfa - -G_END_DECLS - -#endif /* __G_STRING_H__ */ - diff --git a/gthread.c b/gthread.c deleted file mode 100644 index c906916e..00000000 --- a/gthread.c +++ /dev/null @@ -1,823 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * gmutex.c: MT safety related functions - * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe - * Owen Taylor - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#include "config.h" -#include "glib.h" - -#ifdef G_THREAD_USE_PID_SURROGATE -#include -#include -#include -#include -#endif /* G_THREAD_USE_PID_SURROGATE */ - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include - -#if GLIB_SIZEOF_SYSTEM_THREAD == SIZEOF_VOID_P -# define g_system_thread_equal(thread1, thread2) \ - (thread1.dummy_pointer == thread2.dummy_pointer) -# define g_system_thread_assign(dest, src) \ - (dest.dummy_pointer = src.dummy_pointer) -#else /* GLIB_SIZEOF_SYSTEM_THREAD != SIZEOF_VOID_P */ -# define g_system_thread_equal(thread1, thread2) \ - (memcmp (&thread1, &thread2, GLIB_SIZEOF_SYSTEM_THREAD) == 0) -# define g_system_thread_assign(dest, src) \ - (memcpy (&dest, &src, GLIB_SIZEOF_SYSTEM_THREAD)) -#endif /* GLIB_SIZEOF_SYSTEM_THREAD == SIZEOF_VOID_P */ - -GQuark -g_thread_error_quark (void) -{ - static GQuark quark; - if (!quark) - quark = g_quark_from_static_string ("g_thread_error"); - return quark; -} - -/* Keep this in sync with GRealThread in gmain.c! */ -typedef struct _GRealThread GRealThread; -struct _GRealThread -{ - GThread thread; - GMainContext *context; - gpointer private_data; - gpointer retval; - GSystemThread system_thread; -#ifdef G_THREAD_USE_PID_SURROGATE - pid_t pid; -#endif /* G_THREAD_USE_PID_SURROGATE */ -}; - -#ifdef G_THREAD_USE_PID_SURROGATE -static gint priority_map[] = { 15, 0, -15, -20 }; -static gboolean prio_warned = FALSE; -# define SET_PRIO(pid, prio) G_STMT_START{ \ - gint error = setpriority (PRIO_PROCESS, (pid), priority_map[prio]); \ - if (error == -1 && errno == EACCES && !prio_warned) \ - { \ - prio_warned = TRUE; \ - g_warning ("Priorities can only be increased by root."); \ - } \ - }G_STMT_END -#endif /* G_THREAD_USE_PID_SURROGATE */ - -typedef struct _GStaticPrivateNode GStaticPrivateNode; -struct _GStaticPrivateNode -{ - gpointer data; - GDestroyNotify destroy; -}; - -static void g_thread_cleanup (gpointer data); -static void g_thread_fail (void); - -/* Global variables */ - -static GSystemThread zero_thread; /* This is initialized to all zero */ -gboolean g_thread_use_default_impl = TRUE; -gboolean g_threads_got_initialized = FALSE; - -#if defined(G_PLATFORM_WIN32) && defined(__GNUC__) -__declspec(dllexport) -#endif -GThreadFunctions g_thread_functions_for_glib_use = { - (GMutex*(*)())g_thread_fail, /* mutex_new */ - NULL, /* mutex_lock */ - NULL, /* mutex_trylock */ - NULL, /* mutex_unlock */ - NULL, /* mutex_free */ - (GCond*(*)())g_thread_fail, /* cond_new */ - NULL, /* cond_signal */ - NULL, /* cond_broadcast */ - NULL, /* cond_wait */ - NULL, /* cond_timed_wait */ - NULL, /* cond_free */ - (GPrivate*(*)(GDestroyNotify))g_thread_fail, /* private_new */ - NULL, /* private_get */ - NULL, /* private_set */ - (void(*)(GThreadFunc, gpointer, gulong, - gboolean, gboolean, GThreadPriority, - gpointer, GError**))g_thread_fail, /* thread_create */ - NULL, /* thread_yield */ - NULL, /* thread_join */ - NULL, /* thread_exit */ - NULL, /* thread_set_priority */ - NULL /* thread_self */ -}; - -/* Local data */ - -static GMutex *g_mutex_protect_static_mutex_allocation = NULL; -static GPrivate *g_thread_specific_private = NULL; -static GSList *g_thread_all_threads = NULL; -static GSList *g_thread_free_indeces = NULL; - -G_LOCK_DEFINE_STATIC (g_thread); - -/* This must be called only once, before any threads are created. - * It will only be called from g_thread_init() in -lgthread. - */ -void -g_mutex_init (void) -{ - GRealThread* main_thread; - - /* We let the main thread (the one that calls g_thread_init) inherit - * the data, that it set before calling g_thread_init - */ - main_thread = (GRealThread*) g_thread_self (); - - g_thread_specific_private = g_private_new (g_thread_cleanup); - G_THREAD_UF (private_set, (g_thread_specific_private, main_thread)); - G_THREAD_UF (thread_self, (&main_thread->system_thread)); - - g_mutex_protect_static_mutex_allocation = g_mutex_new (); -} - -void -g_static_mutex_init (GStaticMutex *mutex) -{ - static GStaticMutex init_mutex = G_STATIC_MUTEX_INIT; - - g_return_if_fail (mutex); - - *mutex = init_mutex; -} - -GMutex * -g_static_mutex_get_mutex_impl (GMutex** mutex) -{ - if (!g_thread_supported ()) - return NULL; - - g_assert (g_mutex_protect_static_mutex_allocation); - - g_mutex_lock (g_mutex_protect_static_mutex_allocation); - - if (!(*mutex)) - *mutex = g_mutex_new (); - - g_mutex_unlock (g_mutex_protect_static_mutex_allocation); - - return *mutex; -} - -void -g_static_mutex_free (GStaticMutex* mutex) -{ - GMutex **runtime_mutex; - - g_return_if_fail (mutex); - - /* The runtime_mutex is the first (or only) member of GStaticMutex, - * see both versions (of glibconfig.h) in configure.in */ - runtime_mutex = ((GMutex**)mutex); - - if (*runtime_mutex) - g_mutex_free (*runtime_mutex); - - *runtime_mutex = NULL; -} - -void -g_static_rec_mutex_init (GStaticRecMutex *mutex) -{ - static GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT; - - g_return_if_fail (mutex); - - *mutex = init_mutex; -} - -void -g_static_rec_mutex_lock (GStaticRecMutex* mutex) -{ - GSystemThread self; - - g_return_if_fail (mutex); - - if (!g_thread_supported ()) - return; - - G_THREAD_UF (thread_self, (&self)); - - if (g_system_thread_equal (self, mutex->owner)) - { - mutex->depth++; - return; - } - g_static_mutex_lock (&mutex->mutex); - g_system_thread_assign (mutex->owner, self); - mutex->depth = 1; -} - -gboolean -g_static_rec_mutex_trylock (GStaticRecMutex* mutex) -{ - GSystemThread self; - - g_return_val_if_fail (mutex, FALSE); - - if (!g_thread_supported ()) - return TRUE; - - G_THREAD_UF (thread_self, (&self)); - - if (g_system_thread_equal (self, mutex->owner)) - { - mutex->depth++; - return TRUE; - } - - if (!g_static_mutex_trylock (&mutex->mutex)) - return FALSE; - - g_system_thread_assign (mutex->owner, self); - mutex->depth = 1; - return TRUE; -} - -void -g_static_rec_mutex_unlock (GStaticRecMutex* mutex) -{ - g_return_if_fail (mutex); - - if (!g_thread_supported ()) - return; - - if (mutex->depth > 1) - { - mutex->depth--; - return; - } - g_system_thread_assign (mutex->owner, zero_thread); - g_static_mutex_unlock (&mutex->mutex); -} - -void -g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, - guint depth) -{ - GSystemThread self; - g_return_if_fail (mutex); - - if (!g_thread_supported ()) - return; - - G_THREAD_UF (thread_self, (&self)); - - if (g_system_thread_equal (self, mutex->owner)) - { - mutex->depth += depth; - return; - } - g_static_mutex_lock (&mutex->mutex); - g_system_thread_assign (mutex->owner, self); - mutex->depth = depth; -} - -guint -g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex) -{ - gint depth; - - g_return_val_if_fail (mutex, 0); - - if (!g_thread_supported ()) - return 1; - - depth = mutex->depth; - - g_system_thread_assign (mutex->owner, zero_thread); - mutex->depth = 0; - g_static_mutex_unlock (&mutex->mutex); - - return depth; -} - -void -g_static_rec_mutex_free (GStaticRecMutex *mutex) -{ - g_return_if_fail (mutex); - - g_static_mutex_free (&mutex->mutex); -} - -void -g_static_private_init (GStaticPrivate *private_key) -{ - private_key->index = 0; -} - -gpointer -g_static_private_get (GStaticPrivate *private_key) -{ - GRealThread *self = (GRealThread*) g_thread_self (); - GArray *array; - - array = self->private_data; - if (!array) - return NULL; - - if (!private_key->index) - return NULL; - else if (private_key->index <= array->len) - return g_array_index (array, GStaticPrivateNode, - private_key->index - 1).data; - else - return NULL; -} - -void -g_static_private_set (GStaticPrivate *private_key, - gpointer data, - GDestroyNotify notify) -{ - GRealThread *self = (GRealThread*) g_thread_self (); - GArray *array; - static guint next_index = 0; - GStaticPrivateNode *node; - - array = self->private_data; - if (!array) - { - array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode)); - self->private_data = array; - } - - if (!private_key->index) - { - G_LOCK (g_thread); - - if (!private_key->index) - { - if (g_thread_free_indeces) - { - private_key->index = - GPOINTER_TO_UINT (g_thread_free_indeces->data); - g_thread_free_indeces = - g_slist_delete_link (g_thread_free_indeces, - g_thread_free_indeces); - } - else - private_key->index = ++next_index; - } - - G_UNLOCK (g_thread); - } - - if (private_key->index > array->len) - g_array_set_size (array, private_key->index); - - node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1); - if (node->destroy) - { - gpointer ddata = node->data; - GDestroyNotify ddestroy = node->destroy; - - node->data = data; - node->destroy = notify; - - ddestroy (ddata); - } - else - { - node->data = data; - node->destroy = notify; - } -} - -void -g_static_private_free (GStaticPrivate *private_key) -{ - guint index = private_key->index; - GSList *list; - - if (!index) - return; - - private_key->index = 0; - - G_LOCK (g_thread); - list = g_thread_all_threads; - while (list) - { - GRealThread *thread = list->data; - GArray *array = thread->private_data; - list = list->next; - - if (array && index <= array->len) - { - GStaticPrivateNode *node = &g_array_index (array, - GStaticPrivateNode, - index - 1); - gpointer ddata = node->data; - GDestroyNotify ddestroy = node->destroy; - - node->data = NULL; - node->destroy = NULL; - - if (ddestroy) - { - G_UNLOCK (g_thread); - ddestroy (ddata); - G_LOCK (g_thread); - } - } - } - g_thread_free_indeces = g_slist_prepend (g_thread_free_indeces, - GUINT_TO_POINTER (index)); - G_UNLOCK (g_thread); -} - -void g_main_context_destroy (GMainContext *context); - -static void -g_thread_cleanup (gpointer data) -{ - if (data) - { - GRealThread* thread = data; - if (thread->private_data) - { - GArray* array = thread->private_data; - guint i; - - for (i = 0; i < array->len; i++ ) - { - GStaticPrivateNode *node = - &g_array_index (array, GStaticPrivateNode, i); - if (node->destroy) - node->destroy (node->data); - } - g_array_free (array, TRUE); - } - if (thread->context) - g_main_context_destroy (thread->context); - - /* We only free the thread structure, if it isn't joinable. If - it is, the structure is freed in g_thread_join */ - if (!thread->thread.joinable) - { - G_LOCK (g_thread); - g_thread_all_threads = g_slist_remove (g_thread_all_threads, data); - G_UNLOCK (g_thread); - - /* Just to make sure, this isn't used any more */ - g_system_thread_assign (thread->system_thread, zero_thread); - g_free (thread); - } - } -} - -static void -g_thread_fail (void) -{ - g_error ("The thread system is not yet initialized."); -} - -static gpointer -g_thread_create_proxy (gpointer data) -{ - GRealThread* thread = data; - - g_assert (data); - -#ifdef G_THREAD_USE_PID_SURROGATE - thread->pid = getpid (); -#endif /* G_THREAD_USE_PID_SURROGATE */ - - /* This has to happen before G_LOCK, as that might call g_thread_self */ - g_private_set (g_thread_specific_private, data); - - /* the lock makes sure, that thread->system_thread is written, - before thread->thread.func is called. See g_thread_create. */ - G_LOCK (g_thread); - G_UNLOCK (g_thread); - -#ifdef G_THREAD_USE_PID_SURROGATE - if (g_thread_use_default_impl) - SET_PRIO (thread->pid, thread->thread.priority); -#endif /* G_THREAD_USE_PID_SURROGATE */ - - thread->retval = thread->thread.func (thread->thread.data); - - return NULL; -} - -GThread* -g_thread_create_full (GThreadFunc func, - gpointer data, - gulong stack_size, - gboolean joinable, - gboolean bound, - GThreadPriority priority, - GError **error) -{ - GRealThread* result = g_new (GRealThread, 1); - GError *local_error = NULL; - g_return_val_if_fail (func, NULL); - g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL); - g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL); - - result->thread.joinable = joinable; - result->thread.priority = priority; - result->thread.func = func; - result->thread.data = data; - result->private_data = NULL; - result->context = NULL; - G_LOCK (g_thread); - G_THREAD_UF (thread_create, (g_thread_create_proxy, result, - stack_size, joinable, bound, priority, - &result->system_thread, &local_error)); - g_thread_all_threads = g_slist_prepend (g_thread_all_threads, result); - G_UNLOCK (g_thread); - - if (local_error) - { - g_propagate_error (error, local_error); - g_free (result); - return NULL; - } - - return (GThread*) result; -} - -void -g_thread_exit (gpointer retval) -{ - GRealThread* real = (GRealThread*) g_thread_self (); - real->retval = retval; - G_THREAD_CF (thread_exit, (void)0, ()); -} - -gpointer -g_thread_join (GThread* thread) -{ - GRealThread* real = (GRealThread*) thread; - gpointer retval; - - g_return_val_if_fail (thread, NULL); - g_return_val_if_fail (thread->joinable, NULL); - g_return_val_if_fail (!g_system_thread_equal (real->system_thread, - zero_thread), NULL); - - G_THREAD_UF (thread_join, (&real->system_thread)); - - retval = real->retval; - - G_LOCK (g_thread); - g_thread_all_threads = g_slist_remove (g_thread_all_threads, thread); - G_UNLOCK (g_thread); - - /* Just to make sure, this isn't used any more */ - thread->joinable = 0; - g_system_thread_assign (real->system_thread, zero_thread); - - /* the thread structure for non-joinable threads is freed upon - thread end. We free the memory here. This will leave a loose end, - if a joinable thread is not joined. */ - - g_free (thread); - - return retval; -} - -void -g_thread_set_priority (GThread* thread, - GThreadPriority priority) -{ - GRealThread* real = (GRealThread*) thread; - - g_return_if_fail (thread); - g_return_if_fail (!g_system_thread_equal (real->system_thread, zero_thread)); - g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); - g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); - - thread->priority = priority; - -#ifdef G_THREAD_USE_PID_SURROGATE - if (g_thread_use_default_impl) - SET_PRIO (real->pid, priority); - else -#endif /* G_THREAD_USE_PID_SURROGATE */ - G_THREAD_CF (thread_set_priority, (void)0, - (&real->system_thread, priority)); -} - -GThread* -g_thread_self (void) -{ - GRealThread* thread = g_private_get (g_thread_specific_private); - - if (!thread) - { - /* If no thread data is available, provide and set one. This - can happen for the main thread and for threads, that are not - created by GLib. */ - thread = g_new (GRealThread, 1); - thread->thread.joinable = FALSE; /* This is a save guess */ - thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is - just a guess */ - thread->thread.func = NULL; - thread->thread.data = NULL; - thread->private_data = NULL; - thread->context = NULL; - - if (g_thread_supported ()) - G_THREAD_UF (thread_self, (&thread->system_thread)); - -#ifdef G_THREAD_USE_PID_SURROGATE - thread->pid = getpid (); -#endif /* G_THREAD_USE_PID_SURROGATE */ - - g_private_set (g_thread_specific_private, thread); - - G_LOCK (g_thread); - g_thread_all_threads = g_slist_prepend (g_thread_all_threads, thread); - G_UNLOCK (g_thread); - } - - return (GThread*)thread; -} - -void -g_static_rw_lock_init (GStaticRWLock* lock) -{ - static GStaticRWLock init_lock = G_STATIC_RW_LOCK_INIT; - - g_return_if_fail (lock); - - *lock = init_lock; -} - -static void inline -g_static_rw_lock_wait (GCond** cond, GStaticMutex* mutex) -{ - if (!*cond) - *cond = g_cond_new (); - g_cond_wait (*cond, g_static_mutex_get_mutex (mutex)); -} - -static void inline -g_static_rw_lock_signal (GStaticRWLock* lock) -{ - if (lock->want_to_write && lock->write_cond) - g_cond_signal (lock->write_cond); - else if (lock->read_cond) - g_cond_broadcast (lock->read_cond); -} - -void -g_static_rw_lock_reader_lock (GStaticRWLock* lock) -{ - g_return_if_fail (lock); - - if (!g_threads_got_initialized) - return; - - g_static_mutex_lock (&lock->mutex); - while (lock->write || lock->want_to_write) - g_static_rw_lock_wait (&lock->read_cond, &lock->mutex); - lock->read_counter++; - g_static_mutex_unlock (&lock->mutex); -} - -gboolean -g_static_rw_lock_reader_trylock (GStaticRWLock* lock) -{ - gboolean ret_val = FALSE; - - g_return_val_if_fail (lock, FALSE); - - if (!g_threads_got_initialized) - return TRUE; - - g_static_mutex_lock (&lock->mutex); - if (!lock->write && !lock->want_to_write) - { - lock->read_counter++; - ret_val = TRUE; - } - g_static_mutex_unlock (&lock->mutex); - return ret_val; -} - -void -g_static_rw_lock_reader_unlock (GStaticRWLock* lock) -{ - g_return_if_fail (lock); - - if (!g_threads_got_initialized) - return; - - g_static_mutex_lock (&lock->mutex); - lock->read_counter--; - if (lock->read_counter == 0) - g_static_rw_lock_signal (lock); - g_static_mutex_unlock (&lock->mutex); -} - -void -g_static_rw_lock_writer_lock (GStaticRWLock* lock) -{ - g_return_if_fail (lock); - - if (!g_threads_got_initialized) - return; - - g_static_mutex_lock (&lock->mutex); - lock->want_to_write++; - while (lock->write || lock->read_counter) - g_static_rw_lock_wait (&lock->write_cond, &lock->mutex); - lock->want_to_write--; - lock->write = TRUE; - g_static_mutex_unlock (&lock->mutex); -} - -gboolean -g_static_rw_lock_writer_trylock (GStaticRWLock* lock) -{ - gboolean ret_val = FALSE; - - g_return_val_if_fail (lock, FALSE); - - if (!g_threads_got_initialized) - return TRUE; - - g_static_mutex_lock (&lock->mutex); - if (!lock->write && !lock->read_counter) - { - lock->write = TRUE; - ret_val = TRUE; - } - g_static_mutex_unlock (&lock->mutex); - return ret_val; -} - -void -g_static_rw_lock_writer_unlock (GStaticRWLock* lock) -{ - g_return_if_fail (lock); - - if (!g_threads_got_initialized) - return; - - g_static_mutex_lock (&lock->mutex); - lock->write = FALSE; - g_static_rw_lock_signal (lock); - g_static_mutex_unlock (&lock->mutex); -} - -void -g_static_rw_lock_free (GStaticRWLock* lock) -{ - g_return_if_fail (lock); - - if (lock->read_cond) - { - g_cond_free (lock->read_cond); - lock->read_cond = NULL; - } - if (lock->write_cond) - { - g_cond_free (lock->write_cond); - lock->write_cond = NULL; - } - g_static_mutex_free (&lock->mutex); -} diff --git a/gthread.h b/gthread.h deleted file mode 100644 index 4656270b..00000000 --- a/gthread.h +++ /dev/null @@ -1,334 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_THREAD_H__ -#define __G_THREAD_H__ - -#include -#include - -G_BEGIN_DECLS - -/* GLib Thread support - */ - -extern GQuark g_thread_error_quark (void); -#define G_THREAD_ERROR g_thread_error_quark () - -typedef enum -{ - G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ -} GThreadError; - -typedef gpointer (*GThreadFunc) (gpointer data); - -typedef enum -{ - G_THREAD_PRIORITY_LOW, - G_THREAD_PRIORITY_NORMAL, - G_THREAD_PRIORITY_HIGH, - G_THREAD_PRIORITY_URGENT -} GThreadPriority; - -typedef struct _GThread GThread; -struct _GThread -{ - GThreadFunc func; - gpointer data; - gboolean joinable; - GThreadPriority priority; -}; - -typedef struct _GMutex GMutex; -typedef struct _GCond GCond; -typedef struct _GPrivate GPrivate; -typedef struct _GStaticPrivate GStaticPrivate; - -typedef struct _GThreadFunctions GThreadFunctions; -struct _GThreadFunctions -{ - GMutex* (*mutex_new) (void); - void (*mutex_lock) (GMutex *mutex); - gboolean (*mutex_trylock) (GMutex *mutex); - void (*mutex_unlock) (GMutex *mutex); - void (*mutex_free) (GMutex *mutex); - GCond* (*cond_new) (void); - void (*cond_signal) (GCond *cond); - void (*cond_broadcast) (GCond *cond); - void (*cond_wait) (GCond *cond, - GMutex *mutex); - gboolean (*cond_timed_wait) (GCond *cond, - GMutex *mutex, - GTimeVal *end_time); - void (*cond_free) (GCond *cond); - GPrivate* (*private_new) (GDestroyNotify destructor); - gpointer (*private_get) (GPrivate *private_key); - void (*private_set) (GPrivate *private_key, - gpointer data); - void (*thread_create) (GThreadFunc func, - gpointer data, - gulong stack_size, - gboolean joinable, - gboolean bound, - GThreadPriority priority, - gpointer thread, - GError **error); - void (*thread_yield) (void); - void (*thread_join) (gpointer thread); - void (*thread_exit) (void); - void (*thread_set_priority)(gpointer thread, - GThreadPriority priority); - void (*thread_self) (gpointer thread); -}; - -GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use; -GLIB_VAR gboolean g_thread_use_default_impl; -GLIB_VAR gboolean g_threads_got_initialized; - -/* initializes the mutex/cond/private implementation for glib, might - * only be called once, and must not be called directly or indirectly - * from another glib-function, e.g. as a callback. - */ -void g_thread_init (GThreadFunctions *vtable); - -/* Errorcheck mutexes. If you define G_ERRORCHECK_MUTEXES, then all - * mutexes will check for re-locking and re-unlocking */ - -/* Initialize thread system with errorcheck mutexes. vtable must be - * NULL. Do not call directly. Use #define G_ERRORCHECK_MUTEXES - * instead. - */ -void g_thread_init_with_errorcheck_mutexes (GThreadFunctions* vtable); - -/* A random number to recognize debug calls to g_mutex_... */ -#define G_MUTEX_DEBUG_MAGIC 0xf8e18ad7 - -#ifdef G_ERRORCHECK_MUTEXES -#define g_thread_init(vtable) g_thread_init_with_errorcheck_mutexes (vtable) -#endif - -/* internal function for fallback static mutex implementation */ -GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex); - -/* shorthands for conditional and unconditional function calls */ - -#define G_THREAD_UF(op, arglist) \ - (*g_thread_functions_for_glib_use . op) arglist -#define G_THREAD_CF(op, fail, arg) \ - (g_thread_supported () ? G_THREAD_UF (op, arg) : (fail)) -#define G_THREAD_ECF(op, fail, mutex, type) \ - (g_thread_supported () ? ((type(*)(GMutex*, gulong, gchar*)) \ - (*g_thread_functions_for_glib_use . op)) \ - (mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (fail)) - -#ifndef G_ERRORCHECK_MUTEXES -# define g_mutex_lock(mutex) \ - G_THREAD_CF (mutex_lock, (void)0, (mutex)) -# define g_mutex_trylock(mutex) \ - G_THREAD_CF (mutex_trylock, TRUE, (mutex)) -# define g_mutex_unlock(mutex) \ - G_THREAD_CF (mutex_unlock, (void)0, (mutex)) -# define g_mutex_free(mutex) \ - G_THREAD_CF (mutex_free, (void)0, (mutex)) -# define g_cond_wait(cond, mutex) \ - G_THREAD_CF (cond_wait, (void)0, (cond, mutex)) -# define g_cond_timed_wait(cond, mutex, abs_time) \ - G_THREAD_CF (cond_timed_wait, TRUE, (cond, mutex, abs_time)) -#else /* G_ERRORCHECK_MUTEXES */ -# define g_mutex_lock(mutex) \ - G_THREAD_ECF (mutex_lock, (void)0, (mutex), void) -# define g_mutex_trylock(mutex) \ - G_THREAD_ECF (mutex_trylock, TRUE, (mutex), gboolean) -# define g_mutex_unlock(mutex) \ - G_THREAD_ECF (mutex_unlock, (void)0, (mutex), void) -# define g_mutex_free(mutex) \ - G_THREAD_ECF (mutex_free, (void)0, (mutex), void) -# define g_cond_wait(cond, mutex) \ - (g_thread_supported () ? ((void(*)(GCond*, GMutex*, gulong, gchar*))\ - g_thread_functions_for_glib_use.cond_wait) \ - (cond, mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (void) 0) -# define g_cond_timed_wait(cond, mutex, abs_time) \ - (g_thread_supported () ? \ - ((gboolean(*)(GCond*, GMutex*, GTimeVal*, gulong, gchar*)) \ - g_thread_functions_for_glib_use.cond_timed_wait) \ - (cond, mutex, abs_time, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : TRUE) -#endif /* G_ERRORCHECK_MUTEXES */ - -#define g_thread_supported() (g_threads_got_initialized) -#define g_mutex_new() G_THREAD_UF (mutex_new, ()) -#define g_cond_new() G_THREAD_UF (cond_new, ()) -#define g_cond_signal(cond) G_THREAD_CF (cond_signal, (void)0, (cond)) -#define g_cond_broadcast(cond) G_THREAD_CF (cond_broadcast, (void)0, (cond)) -#define g_cond_free(cond) G_THREAD_CF (cond_free, (void)0, (cond)) -#define g_private_new(destructor) G_THREAD_UF (private_new, (destructor)) -#define g_private_get(private_key) G_THREAD_CF (private_get, \ - ((gpointer)private_key), \ - (private_key)) -#define g_private_set(private_key, value) G_THREAD_CF (private_set, \ - (void) (private_key = \ - (GPrivate*) (value)), \ - (private_key, value)) -#define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ()) - -#define g_thread_create(func, data, joinable, error) \ - (g_thread_create_full (func, data, 0, joinable, FALSE, \ - G_THREAD_PRIORITY_NORMAL, error)) - -GThread* g_thread_create_full (GThreadFunc func, - gpointer data, - gulong stack_size, - gboolean joinable, - gboolean bound, - GThreadPriority priority, - GError **error); -GThread* g_thread_self (void); -void g_thread_exit (gpointer retval); -gpointer g_thread_join (GThread *thread); - -void g_thread_set_priority (GThread *thread, - GThreadPriority priority); - -/* GStaticMutexes can be statically initialized with the value - * G_STATIC_MUTEX_INIT, and then they can directly be used, that is - * much easier, than having to explicitly allocate the mutex before - * use - */ -#define g_static_mutex_lock(mutex) \ - g_mutex_lock (g_static_mutex_get_mutex (mutex)) -#define g_static_mutex_trylock(mutex) \ - g_mutex_trylock (g_static_mutex_get_mutex (mutex)) -#define g_static_mutex_unlock(mutex) \ - g_mutex_unlock (g_static_mutex_get_mutex (mutex)) -void g_static_mutex_init (GStaticMutex *mutex); -void g_static_mutex_free (GStaticMutex *mutex); - -struct _GStaticPrivate -{ - guint index; -}; -#define G_STATIC_PRIVATE_INIT { 0 } -void g_static_private_init (GStaticPrivate *private_key); -gpointer g_static_private_get (GStaticPrivate *private_key); -void g_static_private_set (GStaticPrivate *private_key, - gpointer data, - GDestroyNotify notify); -void g_static_private_free (GStaticPrivate *private_key); - -typedef struct _GStaticRecMutex GStaticRecMutex; -struct _GStaticRecMutex -{ - GStaticMutex mutex; - unsigned int depth; - GSystemThread owner; -}; - -#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT } -void g_static_rec_mutex_init (GStaticRecMutex *mutex); -void g_static_rec_mutex_lock (GStaticRecMutex *mutex); -gboolean g_static_rec_mutex_trylock (GStaticRecMutex *mutex); -void g_static_rec_mutex_unlock (GStaticRecMutex *mutex); -void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, - guint depth); -guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex); -void g_static_rec_mutex_free (GStaticRecMutex *mutex); - -typedef struct _GStaticRWLock GStaticRWLock; -struct _GStaticRWLock -{ - GStaticMutex mutex; - GCond *read_cond; - GCond *write_cond; - guint read_counter; - gboolean write; - guint want_to_write; -}; - -#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, FALSE } - -void g_static_rw_lock_init (GStaticRWLock* lock); -void g_static_rw_lock_reader_lock (GStaticRWLock* lock); -gboolean g_static_rw_lock_reader_trylock (GStaticRWLock* lock); -void g_static_rw_lock_reader_unlock (GStaticRWLock* lock); -void g_static_rw_lock_writer_lock (GStaticRWLock* lock); -gboolean g_static_rw_lock_writer_trylock (GStaticRWLock* lock); -void g_static_rw_lock_writer_unlock (GStaticRWLock* lock); -void g_static_rw_lock_free (GStaticRWLock* lock); - -/* these are some convenience macros that expand to nothing if GLib - * was configured with --disable-threads. for using StaticMutexes, - * you define them with G_LOCK_DEFINE_STATIC (name) or G_LOCK_DEFINE (name) - * if you need to export the mutex. With G_LOCK_EXTERN (name) you can - * declare such an globally defined lock. name is a unique identifier - * for the protected varibale or code portion. locking, testing and - * unlocking of such mutexes can be done with G_LOCK(), G_UNLOCK() and - * G_TRYLOCK() respectively. - */ -extern void glib_dummy_decl (void); -#define G_LOCK_NAME(name) g__ ## name ## _lock -#ifdef G_THREADS_ENABLED -# define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name) -# define G_LOCK_DEFINE(name) \ - GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT -# define G_LOCK_EXTERN(name) extern GStaticMutex G_LOCK_NAME (name) - -# ifdef G_DEBUG_LOCKS -# define G_LOCK(name) G_STMT_START{ \ - g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ - "file %s: line %d (%s): locking: %s ", \ - __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, \ - #name); \ - g_static_mutex_lock (&G_LOCK_NAME (name)); \ - }G_STMT_END -# define G_UNLOCK(name) G_STMT_START{ \ - g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ - "file %s: line %d (%s): unlocking: %s ", \ - __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, \ - #name); \ - g_static_mutex_unlock (&G_LOCK_NAME (name)); \ - }G_STMT_END -# define G_TRYLOCK(name) \ - (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ - "file %s: line %d (%s): try locking: %s ", \ - __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, \ - #name), g_static_mutex_trylock (&G_LOCK_NAME (name))) -# else /* !G_DEBUG_LOCKS */ -# define G_LOCK(name) g_static_mutex_lock (&G_LOCK_NAME (name)) -# define G_UNLOCK(name) g_static_mutex_unlock (&G_LOCK_NAME (name)) -# define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name)) -# endif /* !G_DEBUG_LOCKS */ -#else /* !G_THREADS_ENABLED */ -# define G_LOCK_DEFINE_STATIC(name) extern void glib_dummy_decl (void) -# define G_LOCK_DEFINE(name) extern void glib_dummy_decl (void) -# define G_LOCK_EXTERN(name) extern void glib_dummy_decl (void) -# define G_LOCK(name) -# define G_UNLOCK(name) -# define G_TRYLOCK(name) (TRUE) -#endif /* !G_THREADS_ENABLED */ - -G_END_DECLS - -#endif /* __G_THREAD_H__ */ - diff --git a/gthread/Makefile.am b/gthread/Makefile.am index 99506904..0928fd9d 100644 --- a/gthread/Makefile.am +++ b/gthread/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/gthread \ +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gthread \ -DG_LOG_DOMAIN=\"GThread\" @GTHREAD_COMPILE_IMPL_DEFINES@ \ @GLIB_DEBUG_FLAGS@ @@ -19,7 +19,7 @@ BUILT_EXTRA_DIST = \ makefile.msc \ gthread.rc -libglib = $(top_builddir)/libglib-1.3.la +libglib = $(top_builddir)/glib/libglib-1.3.la top_builddir_full=`cd \$(top_builddir); pwd` diff --git a/gthreadpool.c b/gthreadpool.c deleted file mode 100644 index 60102283..00000000 --- a/gthreadpool.c +++ /dev/null @@ -1,678 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GAsyncQueue: thread pool implementation. - * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * MT safe - */ - -#include "glib.h" - -typedef struct _GRealThreadPool GRealThreadPool; - -struct _GRealThreadPool -{ - GThreadPool pool; - GAsyncQueue* queue; - gint max_threads; - gint num_threads; - gboolean running; - gboolean immediate; - gboolean waiting; -}; - -/* The following is just an address to mark the stop order for a - * thread, it could be any address (as long, as it isn't a valid - * GThreadPool address) */ -static const gpointer stop_this_thread_marker = (gpointer) &g_thread_pool_new; - -/* Here all unused threads are waiting */ -static GAsyncQueue *unused_thread_queue; -static gint unused_threads = 0; -static gint max_unused_threads = 0; -G_LOCK_DEFINE_STATIC (unused_threads); - -static GMutex *inform_mutex = NULL; -static GCond *inform_cond = NULL; - -static void g_thread_pool_free_internal (GRealThreadPool* pool); -static gpointer g_thread_pool_thread_proxy (gpointer data); -static void g_thread_pool_start_thread (GRealThreadPool* pool, - GError **error); -static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool* pool); - -#define g_thread_should_run(pool, len) \ - ((pool)->running || (!(pool)->immediate && (len) > 0)) - -static gpointer -g_thread_pool_thread_proxy (gpointer data) -{ - GRealThreadPool *pool = data; - gboolean watcher = FALSE; - - g_async_queue_lock (pool->queue); - while (TRUE) - { - gpointer task; - gboolean goto_global_pool = !pool->pool.exclusive; - gint len = g_async_queue_length_unlocked (pool->queue); - - if (g_thread_should_run (pool, len)) - { - if (watcher) - { - /* This thread is actually not needed here, but it waits - * for some time anyway. If during that time a new - * request arrives, this saves process - * swicthes. Otherwise the thread will go to the global - * pool afterwards */ - GTimeVal end_time; - g_get_current_time (&end_time); - g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */ - task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time); - } - else - task = g_async_queue_pop_unlocked (pool->queue); - - if (task) - { - watcher = FALSE; - if (pool->num_threads > pool->max_threads && - pool->max_threads != -1) - /* We are in fact a superfluous threads, so we go to - * the global pool and just hand the data further to - * the next one waiting in the queue */ - { - g_async_queue_push_unlocked (pool->queue, task); - goto_global_pool = TRUE; - } - else if (pool->running || !pool->immediate) - { - g_async_queue_unlock (pool->queue); - pool->pool.func (task, pool->pool.user_data); - g_async_queue_lock (pool->queue); - } - } - len = g_async_queue_length_unlocked (pool->queue); - } - - if (!g_thread_should_run (pool, len)) - { - g_cond_broadcast (inform_cond); - goto_global_pool = TRUE; - } - else if (len > 0) - { - /* At this pool there are no threads waiting, but tasks are. */ - goto_global_pool = FALSE; - } - else if (len == 0 && !watcher && !pool->pool.exclusive) - { - /* Here neither threads nor tasks are queued and we didn't - * just return from a timed wait. We now wait for a limited - * time at this pool for new tasks to avoid costly context - * switches. */ - goto_global_pool = FALSE; - watcher = TRUE; - } - - - if (goto_global_pool) - { - pool->num_threads--; - - if (!pool->running && !pool->waiting) - { - if (pool->num_threads == 0) - { - g_async_queue_unlock (pool->queue); - g_thread_pool_free_internal (pool); - } - else if (len == - pool->num_threads) - { - g_thread_pool_wakeup_and_stop_all (pool); - g_async_queue_unlock (pool->queue); - } - } - else - g_async_queue_unlock (pool->queue); - - g_async_queue_lock (unused_thread_queue); - - G_LOCK (unused_threads); - if ((unused_threads >= max_unused_threads && - max_unused_threads != -1)) - { - G_UNLOCK (unused_threads); - g_async_queue_unlock (unused_thread_queue); - /* Stop this thread */ - return NULL; - } - unused_threads++; - G_UNLOCK (unused_threads); - - pool = g_async_queue_pop_unlocked (unused_thread_queue); - - G_LOCK (unused_threads); - unused_threads--; - G_UNLOCK (unused_threads); - - g_async_queue_unlock (unused_thread_queue); - - if (pool == stop_this_thread_marker) - /* Stop this thread */ - return NULL; - - g_async_queue_lock (pool->queue); - - /* pool->num_threads++ is not done here, but in - * g_thread_pool_start_thread to make the new started thread - * known to the pool, before itself can do it. */ - } - } - return NULL; -} - -static void -g_thread_pool_start_thread (GRealThreadPool *pool, - GError **error) -{ - gboolean success = FALSE; - - if (pool->num_threads >= pool->max_threads && pool->max_threads != -1) - /* Enough threads are already running */ - return; - - g_async_queue_lock (unused_thread_queue); - - if (g_async_queue_length_unlocked (unused_thread_queue) < 0) - { - g_async_queue_push_unlocked (unused_thread_queue, pool); - success = TRUE; - } - - g_async_queue_unlock (unused_thread_queue); - - if (!success) - { - GError *local_error = NULL; - /* No thread was found, we have to start a new one */ - g_thread_create (g_thread_pool_thread_proxy, pool, FALSE, &local_error); - - if (local_error) - { - g_propagate_error (error, local_error); - return; - } - } - - /* See comment in g_thread_pool_thread_proxy as to why this is done - * here and not there */ - pool->num_threads++; -} - -/** - * g_thread_pool_new: - * @func: a function to execute in the threads of the new thread pool - * @user_data: user data that is handed over to @func every time it - * is called - * @max_threads: the maximal number of threads to execute concurrently in - * the new thread pool, -1 means no limit - * @exclusive: should this thread pool be exclusive? - * @error: return location for error - * - * This function creates a new thread pool. - * - * Whenever you call g_thread_pool_push(), either a new thread is - * created or an unused one is reused. At most @max_threads threads - * are running concurrently for this thread pool. @max_threads = -1 - * allows unlimited threads to be created for this thread pool. The - * newly created or reused thread now executes the function @func with - * the two arguments. The first one is the parameter to - * g_thread_pool_push() and the second one is @user_data. - * - * The parameter @exclusive determines, whether the thread pool owns - * all threads exclusive or whether the threads are shared - * globally. If @exclusive is @TRUE, @max_threads threads are started - * immediately and they will run exclusively for this thread pool until - * it is destroyed by g_thread_pool_free(). If @exclusive is @FALSE, - * threads are created, when needed and shared between all - * non-exclusive thread pools. This implies that @max_threads may not - * be -1 for exclusive thread pools. - * - * @error can be NULL to ignore errors, or non-NULL to report - * errors. An error can only occur, when @exclusive is set to @TRUE and - * not all @max_threads threads could be created. - * - * Return value: the new #GThreadPool - **/ -GThreadPool* -g_thread_pool_new (GFunc func, - gpointer user_data, - gint max_threads, - gboolean exclusive, - GError **error) -{ - GRealThreadPool *retval; - G_LOCK_DEFINE_STATIC (init); - - g_return_val_if_fail (func, NULL); - g_return_val_if_fail (!exclusive || max_threads != -1, NULL); - g_return_val_if_fail (max_threads >= -1, NULL); - g_return_val_if_fail (g_thread_supported (), NULL); - - retval = g_new (GRealThreadPool, 1); - - retval->pool.func = func; - retval->pool.user_data = user_data; - retval->pool.exclusive = exclusive; - retval->queue = g_async_queue_new (); - retval->max_threads = max_threads; - retval->num_threads = 0; - retval->running = TRUE; - - G_LOCK (init); - - if (!inform_mutex) - { - inform_mutex = g_mutex_new (); - inform_cond = g_cond_new (); - unused_thread_queue = g_async_queue_new (); - } - - G_UNLOCK (init); - - if (retval->pool.exclusive) - { - g_async_queue_lock (retval->queue); - - while (retval->num_threads < retval->max_threads) - { - GError *local_error = NULL; - g_thread_pool_start_thread (retval, &local_error); - if (local_error) - { - g_propagate_error (error, local_error); - break; - } - } - - g_async_queue_unlock (retval->queue); - } - - return (GThreadPool*) retval; -} - -/** - * g_thread_pool_push: - * @pool: a #GThreadPool - * @data: a new task for @pool - * @error: return location for error - * - * Inserts @data into the list of tasks to be executed by @pool. When - * the number of currently running threads is lower than the maximal - * allowed number of threads, a new thread is started (or reused) with - * the properties given to g_thread_pool_new (). Otherwise @data stays - * in the queue until a thread in this pool finishes its previous task - * and processes @data. - * - * @error can be NULL to ignore errors, or non-NULL to report - * errors. An error can only occur, when a new thread couldn't be - * created. In that case @data is simply appended to the queue of work - * to do. - **/ -void -g_thread_pool_push (GThreadPool *pool, - gpointer data, - GError **error) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - - g_return_if_fail (real); - - g_async_queue_lock (real->queue); - - if (!real->running) - { - g_async_queue_unlock (real->queue); - g_return_if_fail (real->running); - } - - if (g_async_queue_length_unlocked (real->queue) >= 0) - /* No thread is waiting in the queue */ - g_thread_pool_start_thread (real, error); - - g_async_queue_push_unlocked (real->queue, data); - g_async_queue_unlock (real->queue); -} - -/** - * g_thread_pool_set_max_threads: - * @pool: a #GThreadPool - * @max_threads: a new maximal number of threads for @pool - * @error: return location for error - * - * Sets the maximal allowed number of threads for @pool. A value of -1 - * means, that the maximal number of threads is unlimited. - * - * Setting @max_threads to 0 means stopping all work for @pool. It is - * effectively frozen until @max_threads is set to a non-zero value - * again. - * - * A thread is never terminated while calling @func, as supplied by - * g_thread_pool_new (). Instead the maximal number of threads only - * has effect for the allocation of new threads in g_thread_pool_push - * (). A new thread is allocated, whenever the number of currently - * running threads in @pool is smaller than the maximal number. - * - * @error can be NULL to ignore errors, or non-NULL to report - * errors. An error can only occur, when a new thread couldn't be - * created. - **/ -void -g_thread_pool_set_max_threads (GThreadPool *pool, - gint max_threads, - GError **error) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - gint to_start; - - g_return_if_fail (real); - g_return_if_fail (real->running); - g_return_if_fail (!real->pool.exclusive || max_threads != -1); - g_return_if_fail (max_threads >= -1); - - g_async_queue_lock (real->queue); - - real->max_threads = max_threads; - - if (pool->exclusive) - to_start = real->max_threads - real->num_threads; - else - to_start = g_async_queue_length_unlocked (real->queue); - - for ( ; to_start > 0; to_start--) - { - GError *local_error = NULL; - g_thread_pool_start_thread (real, &local_error); - if (local_error) - { - g_propagate_error (error, local_error); - break; - } - } - - g_async_queue_unlock (real->queue); -} - -/** - * g_thread_pool_get_max_threads: - * @pool: a #GThreadPool - * - * Returns the maximal number of threads for @pool. - * - * Return value: the maximal number of threads - **/ -gint -g_thread_pool_get_max_threads (GThreadPool *pool) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - gint retval; - - g_return_val_if_fail (real, 0); - g_return_val_if_fail (real->running, 0); - - g_async_queue_lock (real->queue); - - retval = real->max_threads; - - g_async_queue_unlock (real->queue); - - return retval; -} - -/** - * g_thread_pool_get_num_threads: - * @pool: a #GThreadPool - * - * Returns the number of threads currently running in @pool. - * - * Return value: the number of threads currently running - **/ -guint -g_thread_pool_get_num_threads (GThreadPool *pool) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - guint retval; - - g_return_val_if_fail (real, 0); - g_return_val_if_fail (real->running, 0); - - g_async_queue_lock (real->queue); - - retval = real->num_threads; - - g_async_queue_unlock (real->queue); - - return retval; -} - -/** - * g_thread_pool_unprocessed: - * @pool: a #GThreadPool - * - * Returns the number of tasks still unprocessed in @pool. - * - * Return value: the number of unprocessed tasks - **/ -guint -g_thread_pool_unprocessed (GThreadPool *pool) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - gint unprocessed; - - g_return_val_if_fail (real, 0); - g_return_val_if_fail (real->running, 0); - - unprocessed = g_async_queue_length (real->queue); - - return MAX (unprocessed, 0); -} - -/** - * g_thread_pool_free: - * @pool: a #GThreadPool - * @immediate: should @pool shut down immediately? - * @wait: should the function wait for all tasks to be finished? - * - * Frees all resources allocated for @pool. - * - * If @immediate is #TRUE, no new task is processed for - * @pool. Otherwise @pool is not freed before the last task is - * processed. Note however, that no thread of this pool is - * interrupted, while processing a task. Instead at least all still - * running threads can finish their tasks before the @pool is freed. - * - * If @wait is #TRUE, the functions does not return before all tasks - * to be processed (dependent on @immediate, whether all or only the - * currently running) are ready. Otherwise the function returns immediately. - * - * After calling this function @pool must not be used anymore. - **/ -void -g_thread_pool_free (GThreadPool *pool, - gboolean immediate, - gboolean wait) -{ - GRealThreadPool *real = (GRealThreadPool*) pool; - - g_return_if_fail (real); - g_return_if_fail (real->running); - /* It there's no thread allowed here, there is not much sense in - * not stopping this pool immediately, when it's not empty */ - g_return_if_fail (immediate || real->max_threads != 0 || - g_async_queue_length (real->queue) == 0); - - g_async_queue_lock (real->queue); - - real->running = FALSE; - real->immediate = immediate; - real->waiting = wait; - - if (wait) - { - g_mutex_lock (inform_mutex); - while (g_async_queue_length_unlocked (real->queue) != -real->num_threads) - { - g_async_queue_unlock (real->queue); - g_cond_wait (inform_cond, inform_mutex); - g_async_queue_lock (real->queue); - } - g_mutex_unlock (inform_mutex); - } - - if (g_async_queue_length_unlocked (real->queue) == -real->num_threads) - { - /* No thread is currently doing something (and nothing is left - * to process in the queue) */ - if (real->num_threads == 0) /* No threads left, we clean up */ - { - g_async_queue_unlock (real->queue); - g_thread_pool_free_internal (real); - return; - } - - g_thread_pool_wakeup_and_stop_all (real); - } - - real->waiting = FALSE; /* The last thread should cleanup the pool */ - g_async_queue_unlock (real->queue); -} - -static void -g_thread_pool_free_internal (GRealThreadPool* pool) -{ - g_return_if_fail (pool); - g_return_if_fail (!pool->running); - g_return_if_fail (pool->num_threads == 0); - - g_async_queue_unref (pool->queue); - - g_free (pool); -} - -static void -g_thread_pool_wakeup_and_stop_all (GRealThreadPool* pool) -{ - guint i; - - g_return_if_fail (pool); - g_return_if_fail (!pool->running); - g_return_if_fail (pool->num_threads != 0); - g_return_if_fail (g_async_queue_length_unlocked (pool->queue) == - -pool->num_threads); - - pool->immediate = TRUE; - for (i = 0; i < pool->num_threads; i++) - g_async_queue_push_unlocked (pool->queue, GUINT_TO_POINTER (1)); -} - -/** - * g_thread_pool_set_max_unused_threads: - * @max_threads: maximal number of unused threads - * - * Sets the maximal number of unused threads to @max_threads. If - * @max_threads is -1, no limit is imposed on the number of unused - * threads. - **/ -void -g_thread_pool_set_max_unused_threads (gint max_threads) -{ - g_return_if_fail (max_threads >= -1); - - G_LOCK (unused_threads); - - max_unused_threads = max_threads; - - if (max_unused_threads < unused_threads && max_unused_threads != -1) - { - guint i; - - g_async_queue_lock (unused_thread_queue); - for (i = unused_threads - max_unused_threads; i > 0; i--) - g_async_queue_push_unlocked (unused_thread_queue, - stop_this_thread_marker); - g_async_queue_unlock (unused_thread_queue); - } - - G_UNLOCK (unused_threads); -} - -/** - * g_thread_pool_get_max_unused_threads: - * - * Returns the maximal allowed number of unused threads. - * - * Return value: the maximal number of unused threads - **/ -gint -g_thread_pool_get_max_unused_threads (void) -{ - gint retval; - - G_LOCK (unused_threads); - retval = max_unused_threads; - G_UNLOCK (unused_threads); - - return retval; -} - -/** - * g_thread_pool_get_num_unused_threads: - * - * Returns the number of currently unused threads. - * - * Return value: the number of currently unused threads - **/ -guint g_thread_pool_get_num_unused_threads (void) -{ - guint retval; - - G_LOCK (unused_threads); - retval = unused_threads; - G_UNLOCK (unused_threads); - - return retval; -} - -/** - * g_thread_pool_stop_unused_threads: - * - * Stops all currently unused threads. This does not change the - * maximal number of unused threads. This function can be used to - * regularly stop all unused threads e.g. from g_timeout_add(). - **/ -void g_thread_pool_stop_unused_threads (void) -{ - guint oldval = g_thread_pool_get_max_unused_threads (); - g_thread_pool_set_max_unused_threads (0); - g_thread_pool_set_max_unused_threads (oldval); -} diff --git a/gthreadpool.h b/gthreadpool.h deleted file mode 100644 index d2c54fb0..00000000 --- a/gthreadpool.h +++ /dev/null @@ -1,102 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_THREADPOOL_H__ -#define __G_THREADPOOL_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GThreadPool GThreadPool; - -/* Thread Pools - */ - -/* The real GThreadPool is bigger, so you may only create a thread - * pool with the constructor function */ -struct _GThreadPool -{ - GFunc func; - gpointer user_data; - gboolean exclusive; -}; - -/* Get a thread pool with the function func, at most max_threads may - * run at a time (max_threads == -1 means no limit), exclusive == TRUE - * means, that the threads shouldn't be shared and that they will be - * prestarted (otherwise they are started as needed) user_data is the - * 2nd argument to the func */ -GThreadPool* g_thread_pool_new (GFunc func, - gpointer user_data, - gint max_threads, - gboolean exclusive, - GError **error); - -/* Push new data into the thread pool. This task is assigned to a thread later - * (when the maximal number of threads is reached for that pool) or now - * (otherwise). If necessary a new thread will be started. The function - * returns immediatly */ -void g_thread_pool_push (GThreadPool *pool, - gpointer data, - GError **error); - -/* Set the number of threads, which can run concurrently for that pool, -1 - * means no limit. 0 means has the effect, that the pool won't process - * requests until the limit is set higher again */ -void g_thread_pool_set_max_threads (GThreadPool *pool, - gint max_threads, - GError **error); -gint g_thread_pool_get_max_threads (GThreadPool *pool); - -/* Get the number of threads assigned to that pool. This number doesn't - * necessarily represent the number of working threads in that pool */ -guint g_thread_pool_get_num_threads (GThreadPool *pool); - -/* Get the number of unprocessed items in the pool */ -guint g_thread_pool_unprocessed (GThreadPool *pool); - -/* Free the pool, immediate means, that all unprocessed items in the queue - * wont be processed, wait means, that the function doesn't return immediatly, - * but after all threads in the pool are ready processing items. immediate - * does however not mean, that threads are killed. */ -void g_thread_pool_free (GThreadPool *pool, - gboolean immediate, - gboolean wait); - -/* Set the maximal number of unused threads before threads will be stopped by - * GLib, -1 means no limit */ -void g_thread_pool_set_max_unused_threads (gint max_threads); -gint g_thread_pool_get_max_unused_threads (void); -guint g_thread_pool_get_num_unused_threads (void); - -/* Stop all currently unused threads, but leave the limit untouched */ -void g_thread_pool_stop_unused_threads (void); - -G_END_DECLS - -#endif /* __G_THREADPOOL_H__ */ - diff --git a/gtimer.c b/gtimer.c deleted file mode 100644 index 2064131f..00000000 --- a/gtimer.c +++ /dev/null @@ -1,276 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" -#ifdef HAVE_UNISTD_H -#include -#endif /* HAVE_UNISTD_H */ -#ifndef G_OS_WIN32 -#include -#include -#include -#endif /* G_OS_WIN32 */ - -#ifdef G_OS_WIN32 -#include -#endif /* G_OS_WIN32 */ - -typedef struct _GRealTimer GRealTimer; - -struct _GRealTimer -{ -#ifdef G_OS_WIN32 - DWORD start; - DWORD end; -#else /* !G_OS_WIN32 */ - struct timeval start; - struct timeval end; -#endif /* !G_OS_WIN32 */ - - guint active : 1; -}; - -#ifdef G_OS_WIN32 -# define GETTIME(v) \ - v = GetTickCount () -#else /* !G_OS_WIN32 */ -# define GETTIME(v) \ - gettimeofday (&v, NULL) -#endif /* !G_OS_WIN32 */ - -GTimer* -g_timer_new (void) -{ - GRealTimer *timer; - - timer = g_new (GRealTimer, 1); - timer->active = TRUE; - - GETTIME (timer->start); - - return ((GTimer*) timer); -} - -void -g_timer_destroy (GTimer *timer) -{ - g_return_if_fail (timer != NULL); - - g_free (timer); -} - -void -g_timer_start (GTimer *timer) -{ - GRealTimer *rtimer; - - g_return_if_fail (timer != NULL); - - rtimer = (GRealTimer*) timer; - rtimer->active = TRUE; - - GETTIME (rtimer->start); -} - -void -g_timer_stop (GTimer *timer) -{ - GRealTimer *rtimer; - - g_return_if_fail (timer != NULL); - - rtimer = (GRealTimer*) timer; - rtimer->active = FALSE; - - GETTIME(rtimer->end); -} - -void -g_timer_reset (GTimer *timer) -{ - GRealTimer *rtimer; - - g_return_if_fail (timer != NULL); - - rtimer = (GRealTimer*) timer; - - GETTIME (rtimer->start); -} - -gdouble -g_timer_elapsed (GTimer *timer, - gulong *microseconds) -{ - GRealTimer *rtimer; - gdouble total; -#ifndef G_OS_WIN32 - struct timeval elapsed; -#endif /* G_OS_WIN32 */ - - g_return_val_if_fail (timer != NULL, 0); - - rtimer = (GRealTimer*) timer; - -#ifdef G_OS_WIN32 - if (rtimer->active) - rtimer->end = GetTickCount (); - - /* Check for wraparound, which happens every 49.7 days. */ - if (rtimer->end < rtimer->start) - total = (UINT_MAX - (rtimer->start - rtimer->end)) / 1000.0; - else - total = (rtimer->end - rtimer->start) / 1000.0; - - if (microseconds) - { - if (rtimer->end < rtimer->start) - *microseconds = - ((UINT_MAX - (rtimer->start - rtimer->end)) % 1000) * 1000; - else - *microseconds = - ((rtimer->end - rtimer->start) % 1000) * 1000; - } -#else /* !G_OS_WIN32 */ - if (rtimer->active) - gettimeofday (&rtimer->end, NULL); - - if (rtimer->start.tv_usec > rtimer->end.tv_usec) - { - rtimer->end.tv_usec += G_USEC_PER_SEC; - rtimer->end.tv_sec--; - } - - elapsed.tv_usec = rtimer->end.tv_usec - rtimer->start.tv_usec; - elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec; - - total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6); - if (total < 0) - { - total = 0; - - if (microseconds) - *microseconds = 0; - } - else if (microseconds) - *microseconds = elapsed.tv_usec; - -#endif /* !G_OS_WIN32 */ - - return total; -} - -void -g_usleep (gulong microseconds) -{ -#ifdef G_OS_WIN32 - Sleep (microseconds / 1000); -#else /* !G_OS_WIN32 */ -# ifdef HAVE_NANOSLEEP - struct timespec request, remaining; - request.tv_sec = microseconds / G_USEC_PER_SEC; - request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC); - while (nanosleep (&request, &remaining) == EINTR) - request = remaining; -# else /* !HAVE_NANOSLEEP */ - if (g_thread_supported ()) - { - static GStaticMutex mutex = G_STATIC_MUTEX_INIT; - static GCond* cond = NULL; - GTimeVal end_time; - - g_get_current_time (&end_time); - if (microseconds > G_MAXLONG) - { - microseconds -= G_MAXLONG; - g_time_val_add (&end_time, G_MAXLONG); - } - g_time_val_add (&end_time, microseconds); - - g_static_mutex_lock (&mutex); - - if (!cond) - cond = g_cond_new (); - - while (g_cond_timed_wait (cond, g_static_mutex_get_mutex (&mutex), - &end_time)) - /* do nothing */; - - g_static_mutex_unlock (&mutex); - } - else - { - struct timeval tv; - tv.tv_sec = microseconds / G_USEC_PER_SEC; - tv.tv_usec = microseconds % G_USEC_PER_SEC; - select(0, NULL, NULL, NULL, &tv); - } -# endif /* !HAVE_NANOSLEEP */ -#endif /* !G_OS_WIN32 */ -} - -/** - * g_time_val_add: - * @time: a #GTimeVal - * @microseconds: number of microseconds to add to @time - * - * Adds the given number of microseconds to @time. @microseconds can - * also be negative to decrease the value of @time. - **/ -void -g_time_val_add (GTimeVal *time, glong microseconds) -{ - g_return_if_fail (time->tv_usec >= 0 && time->tv_usec < G_USEC_PER_SEC); - - if (microseconds >= 0) - { - time->tv_usec += microseconds % G_USEC_PER_SEC; - time->tv_sec += microseconds / G_USEC_PER_SEC; - if (time->tv_usec >= G_USEC_PER_SEC) - { - time->tv_usec -= G_USEC_PER_SEC; - time->tv_sec++; - } - } - else - { - microseconds *= -1; - time->tv_usec -= microseconds % G_USEC_PER_SEC; - time->tv_sec -= microseconds / G_USEC_PER_SEC; - if (time->tv_usec < 0) - { - time->tv_usec += G_USEC_PER_SEC; - time->tv_sec--; - } - } -} diff --git a/gtimer.h b/gtimer.h deleted file mode 100644 index 823d6344..00000000 --- a/gtimer.h +++ /dev/null @@ -1,57 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_TIMER_H__ -#define __G_TIMER_H__ - -#include - -G_BEGIN_DECLS - -/* Timer - */ - -/* microseconds per second */ -typedef struct _GTimer GTimer; - -#define G_USEC_PER_SEC 1000000 - -GTimer* g_timer_new (void); -void g_timer_destroy (GTimer *timer); -void g_timer_start (GTimer *timer); -void g_timer_stop (GTimer *timer); -void g_timer_reset (GTimer *timer); -gdouble g_timer_elapsed (GTimer *timer, - gulong *microseconds); - -void g_usleep (gulong microseconds); - -void g_time_val_add (GTimeVal *time, - glong microseconds); - -G_END_DECLS - -#endif /* __G_TIMER_H__ */ diff --git a/gtree.c b/gtree.c deleted file mode 100644 index 24a99d20..00000000 --- a/gtree.c +++ /dev/null @@ -1,1117 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glib.h" - - -typedef struct _GRealTree GRealTree; -typedef struct _GTreeNode GTreeNode; - -struct _GRealTree -{ - GTreeNode *root; - GCompareDataFunc key_compare; - GDestroyNotify key_destroy_func; - GDestroyNotify value_destroy_func; - gpointer key_compare_data; -}; - -struct _GTreeNode -{ - gint balance; /* height (left) - height (right) */ - GTreeNode *left; /* left subtree */ - GTreeNode *right; /* right subtree */ - gpointer key; /* key for this node */ - gpointer value; /* value stored at this node */ -}; - - -static GTreeNode* g_tree_node_new (gpointer key, - gpointer value); -static void g_tree_node_destroy (GTreeNode *node, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func); -static GTreeNode* g_tree_node_insert (GTree *tree, - GTreeNode *node, - gpointer key, - gpointer value, - gboolean replace, - gboolean *inserted); -static GTreeNode* g_tree_node_remove (GTree *tree, - GTreeNode *node, - gconstpointer key, - gboolean notify); -static GTreeNode* g_tree_node_balance (GTreeNode *node); -static GTreeNode* g_tree_node_remove_leftmost (GTreeNode *node, - GTreeNode **leftmost); -static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node, - gint old_balance); -static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node, - gint old_balance); -static GTreeNode* g_tree_node_lookup (GTreeNode *node, - GCompareDataFunc compare, - gpointer comp_data, - gconstpointer key); -static gint g_tree_node_count (GTreeNode *node); -static gint g_tree_node_pre_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data); -static gint g_tree_node_in_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data); -static gint g_tree_node_post_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data); -static gpointer g_tree_node_search (GTreeNode *node, - GCompareFunc search_func, - gconstpointer data); -static gint g_tree_node_height (GTreeNode *node); -static GTreeNode* g_tree_node_rotate_left (GTreeNode *node); -static GTreeNode* g_tree_node_rotate_right (GTreeNode *node); -static void g_tree_node_check (GTreeNode *node); - - -G_LOCK_DEFINE_STATIC (g_tree_global); -static GMemChunk *node_mem_chunk = NULL; -static GTreeNode *node_free_list = NULL; - - -static GTreeNode* -g_tree_node_new (gpointer key, - gpointer value) -{ - GTreeNode *node; - - G_LOCK (g_tree_global); - if (node_free_list) - { - node = node_free_list; - node_free_list = node->right; - } - else - { - if (!node_mem_chunk) - node_mem_chunk = g_mem_chunk_new ("GLib GTreeNode mem chunk", - sizeof (GTreeNode), - 1024, - G_ALLOC_ONLY); - - node = g_chunk_new (GTreeNode, node_mem_chunk); - } - G_UNLOCK (g_tree_global); - - node->balance = 0; - node->left = NULL; - node->right = NULL; - node->key = key; - node->value = value; - - return node; -} - -static void -g_tree_node_destroy (GTreeNode *node, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func) -{ - if (node) - { - g_tree_node_destroy (node->right, - key_destroy_func, value_destroy_func); - g_tree_node_destroy (node->left, - key_destroy_func, value_destroy_func); - - if (key_destroy_func) - key_destroy_func (node->key); - if (value_destroy_func) - value_destroy_func (node->value); - -#ifdef ENABLE_GC_FRIENDLY - node->left = NULL; - node->key = NULL; - node->value = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (g_tree_global); - node->right = node_free_list; - node_free_list = node; - G_UNLOCK (g_tree_global); - } -} - -/** - * g_tree_new: - * @key_compare_func: the function used to order the nodes in the #GTree. - * It should return values similar to the standard - * strcmp() function - - * 0 if the two arguments are equal, a negative value if the first argument - * comes before the second, or a positive value if the first argument comes - * after the second. - * - * Creates a new #GTree. - * - * Return value: a new #GTree. - **/ -GTree* -g_tree_new (GCompareFunc key_compare_func) -{ - g_return_val_if_fail (key_compare_func != NULL, NULL); - - return g_tree_new_full ((GCompareDataFunc) key_compare_func, NULL, - NULL, NULL); -} - -/** - * g_tree_new_with_data: - * @key_compare_func: qsort()-style comparison function. - * @key_compare_data: data to pass to comparison function. - * - * Creates a new #GTree with a comparison function that accepts user data. - * See g_tree_new() for more details. - * - * Return value: a new #GTree. - **/ -GTree* -g_tree_new_with_data (GCompareDataFunc key_compare_func, - gpointer key_compare_data) -{ - g_return_val_if_fail (key_compare_func != NULL, NULL); - - return g_tree_new_full (key_compare_func, key_compare_data, - NULL, NULL); -} - -/** - * g_tree_new_full: - * @key_compare_func: qsort()-style comparison function. - * @key_compare_data: data to pass to comparison function. - * @key_destroy_func: a function to free the memory allocated for the key - * used when removing the entry from the #GTree or #NULL if you don't - * want to supply such a function. - * @value_destroy_func: a function to free the memory allocated for the - * value used when removing the entry from the #GTree or #NULL if you - * don't want to supply such a function. - * - * Creates a new #GTree like g_tree_new() and allows to specify functions - * to free the memory allocated for the key and value that get called when - * removing the entry from the #GTree. - * - * Return value: a new #GTree. - **/ -GTree* -g_tree_new_full (GCompareDataFunc key_compare_func, - gpointer key_compare_data, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func) -{ - GRealTree *rtree; - - g_return_val_if_fail (key_compare_func != NULL, NULL); - - rtree = g_new (GRealTree, 1); - rtree->root = NULL; - rtree->key_compare = key_compare_func; - rtree->key_destroy_func = key_destroy_func; - rtree->value_destroy_func = value_destroy_func; - rtree->key_compare_data = key_compare_data; - - return (GTree*) rtree; -} - -/** - * g_tree_destroy: - * @tree: a #GTree. - * - * Destroys the #GTree. If keys and/or values are dynamically allocated, you - * should either free them first or create the #GTree using g_tree_new_full(). - * In the latter case the destroy functions you supplied will be called on - * all keys and values before destroying the #GTree. - **/ -void -g_tree_destroy (GTree *tree) -{ - GRealTree *rtree; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - g_tree_node_destroy (rtree->root, - rtree->key_destroy_func, - rtree->value_destroy_func); - - g_free (rtree); -} - -/** - * g_tree_insert: - * @tree: a #Gtree. - * @key: the key to insert. - * @value: the value corresponding to the key. - * - * Inserts a key/value pair into a #GTree. If the given key already exists - * in the #GTree it is set to the new value. If you supplied a - * value_destroy_func when creating the #GTree, the old value is freed using - * that function. If you supplied a key_destroy_func when creating the - * #GTree, the passed key is freed using that function. - * - * The tree is automatically 'balanced' as new key/value pairs are added, - * so that the distance from the root to every leaf is as small as possible. - **/ -void -g_tree_insert (GTree *tree, - gpointer key, - gpointer value) -{ - GRealTree *rtree; - gboolean inserted; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - inserted = FALSE; - rtree->root = g_tree_node_insert (tree, - rtree->root, - key, value, - FALSE, &inserted); -} - -/** - * g_tree_replace: - * @tree: a #Gtree. - * @key: the key to insert. - * @value: the value corresponding to the key. - * - * Inserts a new key and value into a #GTree similar to g_tree_insert(). - * The difference is that if the key already exists in the #GTree, it gets - * replaced by the new key. If you supplied a value_destroy_func when - * creating the #GTree, the old value is freed using that function. If you - * supplied a key_destroy_func when creating the #GTree, the old key is - * freed using that function. - * - * The tree is automatically 'balanced' as new key/value pairs are added, - * so that the distance from the root to every leaf is as small as possible. - **/ -void -g_tree_replace (GTree *tree, - gpointer key, - gpointer value) -{ - GRealTree *rtree; - gboolean inserted; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - inserted = FALSE; - rtree->root = g_tree_node_insert (tree, - rtree->root, - key, value, - TRUE, &inserted); -} - -/** - * g_tree_remove: - * @tree: a #Gtree. - * @key: the key to remove. - * - * Removes a key/value pair from a #GTree. - * - * If the #GTree was created using g_tree_new_full(), the key and value - * are freed using the supplied destroy_functions, otherwise you have to - * make sure that any dynamically allocated values are freed yourself. - **/ -void -g_tree_remove (GTree *tree, - gconstpointer key) -{ - GRealTree *rtree; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - rtree->root = g_tree_node_remove (tree, rtree->root, key, TRUE); -} - -/** - * g_tree_steal: - * @tree: a #Gtree. - * @key: the key to remove. - * - * Removes a key and its associated value from a #GTree without calling - * the key and value destroy functions. - **/ -void -g_tree_steal (GTree *tree, - gconstpointer key) -{ - GRealTree *rtree; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - rtree->root = g_tree_node_remove (tree, rtree->root, key, FALSE); -} - -/** - * g_tree_lookup: - * @tree: a #GTree. - * @key: the key to look up. - * - * Gets the value corresponding to the given key. Since a #GTree is - * automatically balanced as key/value pairs are added, key lookup is very - * fast. - * - * Return value: the value corresponding to the key. - **/ -gpointer -g_tree_lookup (GTree *tree, - gconstpointer key) -{ - GRealTree *rtree; - GTreeNode *node; - - g_return_val_if_fail (tree != NULL, NULL); - - rtree = (GRealTree*) tree; - - node = g_tree_node_lookup (rtree->root, - rtree->key_compare, rtree->key_compare_data, key); - - return node ? node->value : NULL; -} - -/** - * g_tree_lookup_extended: - * @tree: a #GTree. - * @lookup_key: the key to look up. - * @orig_key: returns the original key. - * @value: returns the value associated with the key. - * - * Looks up a key in the #GTree, returning the original key and the - * associated value and a gboolean which is TRUE if the key was found. This - * is useful if you need to free the memory allocated for the original key, - * for example before calling g_tree_remove(). - * - * Return value: #TRUE if the key was found in the #GTree. - **/ -gboolean -g_tree_lookup_extended (GTree *tree, - gconstpointer lookup_key, - gpointer *orig_key, - gpointer *value) -{ - GRealTree *rtree; - GTreeNode *node; - - g_return_val_if_fail (tree != NULL, FALSE); - - rtree = (GRealTree*) tree; - - node = g_tree_node_lookup (rtree->root, - rtree->key_compare, rtree->key_compare_data, lookup_key); - - if (node) - { - if (orig_key) - *orig_key = node->key; - if (value) - *value = node->value; - return TRUE; - } - else - return FALSE; -} - -/** - * g_tree_foreach: - * @tree: a #GTree. - * @func: the function to call for each node visited. If this function - * returns TRUE, the traversal is stopped. - * @user_data: user data to pass to the function. - * - * Calls the given function for each of the key/value pairs in the #GTree. - * The function is passed the key and value of each pair, and the given - * @data parameter. - **/ -void -g_tree_foreach (GTree *tree, - GTraverseFunc func, - gpointer user_data) -{ - GRealTree *rtree; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - if (!rtree->root) - return; - - g_tree_node_in_order (rtree->root, func, user_data); -} - -/** - * g_tree_traverse: - * @tree: a #GTree. - * @traverse_func: the function to call for each node visited. If this - * function returns TRUE, the traversal is stopped. - * @traverse_type: the order in which nodes are visited, one of %G_IN_ORDER, - * %G_PRE_ORDER and %G_POST_ORDER. - * @user_data: user data to pass to the function. - * - * Calls the given function for each node in the GTree. This function is - * deprecated, use g_tree_foreach() instead. - **/ -void -g_tree_traverse (GTree *tree, - GTraverseFunc traverse_func, - GTraverseType traverse_type, - gpointer user_data) -{ - GRealTree *rtree; - - g_return_if_fail (tree != NULL); - - rtree = (GRealTree*) tree; - - if (!rtree->root) - return; - - switch (traverse_type) - { - case G_PRE_ORDER: - g_tree_node_pre_order (rtree->root, traverse_func, user_data); - break; - - case G_IN_ORDER: - g_tree_node_in_order (rtree->root, traverse_func, user_data); - break; - - case G_POST_ORDER: - g_tree_node_post_order (rtree->root, traverse_func, user_data); - break; - - case G_LEVEL_ORDER: - g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented."); - break; - } -} - -/** - * g_tree_search: - * @tree: a #GTree. - * @search_func: the comparison function used to search the #GTree. - * @user_data: the data passed as the second argument to the @search_func - * function. - * - * Searches a #GTree using an alternative form of the comparison function. - * - * This function is not as useful as it sounds. - * It allows you to use a different function for performing the lookup of - * a key. However, since the tree is ordered according to the @key_compare_func - * function passed to g_tree_new(), the function you pass to g_tree_search() - * must return exactly the same value as would be returned by the comparison - * function, for each pair of tree nodes, or the search will not work. - * - * To search for a specific value, you can use g_tree_foreach() or - * g_tree_traverse(). - * - * Return value: the value corresponding to the found key, or NULL if the key - * is not found. - **/ -gpointer -g_tree_search (GTree *tree, - GCompareFunc search_func, - gconstpointer user_data) -{ - GRealTree *rtree; - - g_return_val_if_fail (tree != NULL, NULL); - - rtree = (GRealTree*) tree; - - if (rtree->root) - return g_tree_node_search (rtree->root, search_func, user_data); - else - return NULL; -} - -/** - * g_tree_height: - * @tree: a #GTree. - * - * Gets the height of a #GTree. - * - * If the #GTree contains no nodes, the height is 0. - * If the #GTree contains only one root node the height is 1. - * If the root node has children the height is 2, etc. - * - * Return value: the height of the #GTree. - **/ -gint -g_tree_height (GTree *tree) -{ - GRealTree *rtree; - - g_return_val_if_fail (tree != NULL, 0); - - rtree = (GRealTree*) tree; - - if (rtree->root) - return g_tree_node_height (rtree->root); - else - return 0; -} - -/** - * g_tree_nnodes: - * @tree: a #GTree. - * - * Gets the number of nodes in a #GTree. - * - * Return value: the number of nodes in the #GTree. - **/ -gint -g_tree_nnodes (GTree *tree) -{ - GRealTree *rtree; - - g_return_val_if_fail (tree != NULL, 0); - - rtree = (GRealTree*) tree; - - if (rtree->root) - return g_tree_node_count (rtree->root); - else - return 0; -} - -static GTreeNode* -g_tree_node_insert (GTree *tree, - GTreeNode *node, - gpointer key, - gpointer value, - gboolean replace, - gboolean *inserted) -{ - GRealTree *rtree; - gint old_balance; - gint cmp; - - rtree = (GRealTree*) tree; - - if (!node) - { - *inserted = TRUE; - return g_tree_node_new (key, value); - } - - cmp = rtree->key_compare (key, node->key, rtree->key_compare_data); - if (cmp == 0) - { - *inserted = FALSE; - - if (rtree->value_destroy_func) - rtree->value_destroy_func (node->value); - - node->value = value; - - if (replace) - { - if (rtree->key_destroy_func) - rtree->key_destroy_func (node->key); - - node->key = key; - } - else - { - /* free the passed key */ - if (rtree->key_destroy_func) - rtree->key_destroy_func (key); - } - - return node; - } - - if (cmp < 0) - { - if (node->left) - { - old_balance = node->left->balance; - node->left = g_tree_node_insert (tree, - node->left, - key, value, - replace, inserted); - - if ((old_balance != node->left->balance) && node->left->balance) - node->balance -= 1; - } - else - { - *inserted = TRUE; - node->left = g_tree_node_new (key, value); - node->balance -= 1; - } - } - else if (cmp > 0) - { - if (node->right) - { - old_balance = node->right->balance; - node->right = g_tree_node_insert (tree, - node->right, - key, value, - replace, inserted); - - if ((old_balance != node->right->balance) && node->right->balance) - node->balance += 1; - } - else - { - *inserted = TRUE; - node->right = g_tree_node_new (key, value); - node->balance += 1; - } - } - - if (*inserted) - { - if ((node->balance < -1) || (node->balance > 1)) - node = g_tree_node_balance (node); - } - - return node; -} - -static GTreeNode* -g_tree_node_remove (GTree *tree, - GTreeNode *node, - gconstpointer key, - gboolean notify) -{ - GRealTree *rtree; - GTreeNode *new_root; - gint old_balance; - gint cmp; - - if (!node) - return NULL; - - rtree = (GRealTree *) tree; - - cmp = rtree->key_compare (key, node->key, rtree->key_compare_data); - if (cmp == 0) - { - GTreeNode *garbage; - - garbage = node; - - if (!node->right) - { - node = node->left; - } - else - { - old_balance = node->right->balance; - node->right = g_tree_node_remove_leftmost (node->right, &new_root); - new_root->left = node->left; - new_root->right = node->right; - new_root->balance = node->balance; - node = g_tree_node_restore_right_balance (new_root, old_balance); - } - - if (notify) - { - if (rtree->key_destroy_func) - rtree->key_destroy_func (garbage->key); - if (rtree->value_destroy_func) - rtree->value_destroy_func (garbage->value); - } - -#ifdef ENABLE_GC_FRIENDLY - garbage->left = NULL; - garbage->key = NULL; - garbage->value = NULL; -#endif /* ENABLE_GC_FRIENDLY */ - - G_LOCK (g_tree_global); - garbage->right = node_free_list; - node_free_list = garbage; - G_UNLOCK (g_tree_global); - } - else if (cmp < 0) - { - if (node->left) - { - old_balance = node->left->balance; - node->left = g_tree_node_remove (tree, node->left, key, notify); - node = g_tree_node_restore_left_balance (node, old_balance); - } - } - else if (cmp > 0) - { - if (node->right) - { - old_balance = node->right->balance; - node->right = g_tree_node_remove (tree, node->right, key, notify); - node = g_tree_node_restore_right_balance (node, old_balance); - } - } - - return node; -} - -static GTreeNode* -g_tree_node_balance (GTreeNode *node) -{ - if (node->balance < -1) - { - if (node->left->balance > 0) - node->left = g_tree_node_rotate_left (node->left); - node = g_tree_node_rotate_right (node); - } - else if (node->balance > 1) - { - if (node->right->balance < 0) - node->right = g_tree_node_rotate_right (node->right); - node = g_tree_node_rotate_left (node); - } - - return node; -} - -static GTreeNode* -g_tree_node_remove_leftmost (GTreeNode *node, - GTreeNode **leftmost) -{ - gint old_balance; - - if (!node->left) - { - *leftmost = node; - return node->right; - } - - old_balance = node->left->balance; - node->left = g_tree_node_remove_leftmost (node->left, leftmost); - return g_tree_node_restore_left_balance (node, old_balance); -} - -static GTreeNode* -g_tree_node_restore_left_balance (GTreeNode *node, - gint old_balance) -{ - if (!node->left) - node->balance += 1; - else if ((node->left->balance != old_balance) && - (node->left->balance == 0)) - node->balance += 1; - - if (node->balance > 1) - return g_tree_node_balance (node); - return node; -} - -static GTreeNode* -g_tree_node_restore_right_balance (GTreeNode *node, - gint old_balance) -{ - if (!node->right) - node->balance -= 1; - else if ((node->right->balance != old_balance) && - (node->right->balance == 0)) - node->balance -= 1; - - if (node->balance < -1) - return g_tree_node_balance (node); - return node; -} - -static GTreeNode * -g_tree_node_lookup (GTreeNode *node, - GCompareDataFunc compare, - gpointer compare_data, - gconstpointer key) -{ - gint cmp; - - if (!node) - return NULL; - - cmp = (* compare) (key, node->key, compare_data); - if (cmp == 0) - return node; - - if (cmp < 0) - { - if (node->left) - return g_tree_node_lookup (node->left, compare, compare_data, key); - } - else if (cmp > 0) - { - if (node->right) - return g_tree_node_lookup (node->right, compare, compare_data, key); - } - - return NULL; -} - -static gint -g_tree_node_count (GTreeNode *node) -{ - gint count; - - count = 1; - if (node->left) - count += g_tree_node_count (node->left); - if (node->right) - count += g_tree_node_count (node->right); - - return count; -} - -static gint -g_tree_node_pre_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data) -{ - if ((*traverse_func) (node->key, node->value, data)) - return TRUE; - if (node->left) - { - if (g_tree_node_pre_order (node->left, traverse_func, data)) - return TRUE; - } - if (node->right) - { - if (g_tree_node_pre_order (node->right, traverse_func, data)) - return TRUE; - } - - return FALSE; -} - -static gint -g_tree_node_in_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data) -{ - if (node->left) - { - if (g_tree_node_in_order (node->left, traverse_func, data)) - return TRUE; - } - if ((*traverse_func) (node->key, node->value, data)) - return TRUE; - if (node->right) - { - if (g_tree_node_in_order (node->right, traverse_func, data)) - return TRUE; - } - - return FALSE; -} - -static gint -g_tree_node_post_order (GTreeNode *node, - GTraverseFunc traverse_func, - gpointer data) -{ - if (node->left) - { - if (g_tree_node_post_order (node->left, traverse_func, data)) - return TRUE; - } - if (node->right) - { - if (g_tree_node_post_order (node->right, traverse_func, data)) - return TRUE; - } - if ((*traverse_func) (node->key, node->value, data)) - return TRUE; - - return FALSE; -} - -static gpointer -g_tree_node_search (GTreeNode *node, - GCompareFunc search_func, - gconstpointer data) -{ - gint dir; - - if (!node) - return NULL; - - do { - dir = (* search_func) (node->key, data); - if (dir == 0) - return node->value; - - if (dir < 0) - node = node->left; - else if (dir > 0) - node = node->right; - } while (node); - - return NULL; -} - -static gint -g_tree_node_height (GTreeNode *node) -{ - gint left_height; - gint right_height; - - if (node) - { - left_height = 0; - right_height = 0; - - if (node->left) - left_height = g_tree_node_height (node->left); - - if (node->right) - right_height = g_tree_node_height (node->right); - - return MAX (left_height, right_height) + 1; - } - - return 0; -} - -static GTreeNode* -g_tree_node_rotate_left (GTreeNode *node) -{ - GTreeNode *right; - gint a_bal; - gint b_bal; - - right = node->right; - - node->right = right->left; - right->left = node; - - a_bal = node->balance; - b_bal = right->balance; - - if (b_bal <= 0) - { - if (a_bal >= 1) - right->balance = b_bal - 1; - else - right->balance = a_bal + b_bal - 2; - node->balance = a_bal - 1; - } - else - { - if (a_bal <= b_bal) - right->balance = a_bal - 2; - else - right->balance = b_bal - 1; - node->balance = a_bal - b_bal - 1; - } - - return right; -} - -static GTreeNode* -g_tree_node_rotate_right (GTreeNode *node) -{ - GTreeNode *left; - gint a_bal; - gint b_bal; - - left = node->left; - - node->left = left->right; - left->right = node; - - a_bal = node->balance; - b_bal = left->balance; - - if (b_bal <= 0) - { - if (b_bal > a_bal) - left->balance = b_bal + 1; - else - left->balance = a_bal + 2; - node->balance = a_bal - b_bal + 1; - } - else - { - if (a_bal <= -1) - left->balance = b_bal + 1; - else - left->balance = a_bal + b_bal + 2; - node->balance = a_bal + 1; - } - - return left; -} - -static void -g_tree_node_check (GTreeNode *node) -{ - gint left_height; - gint right_height; - gint balance; - - if (node) - { - left_height = 0; - right_height = 0; - - if (node->left) - left_height = g_tree_node_height (node->left); - if (node->right) - right_height = g_tree_node_height (node->right); - - balance = right_height - left_height; - if (balance != node->balance) - g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, - "g_tree_node_check: failed: %d ( %d )\n", - balance, node->balance); - - if (node->left) - g_tree_node_check (node->left); - if (node->right) - g_tree_node_check (node->right); - } -} diff --git a/gtree.h b/gtree.h deleted file mode 100644 index 401120bb..00000000 --- a/gtree.h +++ /dev/null @@ -1,84 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_TREE_H__ -#define __G_TREE_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _GTree GTree; - -typedef gint (*GTraverseFunc) (gpointer key, - gpointer value, - gpointer data); - -/* Balanced binary trees - */ -GTree* g_tree_new (GCompareFunc key_compare_func); -GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func, - gpointer key_compare_data); -GTree* g_tree_new_full (GCompareDataFunc key_compare_func, - gpointer key_compare_data, - GDestroyNotify key_destroy_func, - GDestroyNotify value_destroy_func); -void g_tree_destroy (GTree *tree); -void g_tree_insert (GTree *tree, - gpointer key, - gpointer value); -void g_tree_replace (GTree *tree, - gpointer key, - gpointer value); -void g_tree_remove (GTree *tree, - gconstpointer key); -void g_tree_steal (GTree *tree, - gconstpointer key); -gpointer g_tree_lookup (GTree *tree, - gconstpointer key); -gboolean g_tree_lookup_extended (GTree *tree, - gconstpointer lookup_key, - gpointer *orig_key, - gpointer *value); -void g_tree_foreach (GTree *tree, - GTraverseFunc func, - gpointer user_data); -void g_tree_traverse (GTree *tree, - GTraverseFunc traverse_func, - GTraverseType traverse_type, - gpointer user_data); -gpointer g_tree_search (GTree *tree, - GCompareFunc search_func, - gconstpointer user_data); -gint g_tree_height (GTree *tree); -gint g_tree_nnodes (GTree *tree); - - - -G_END_DECLS - -#endif /* __G_TREE_H__ */ - diff --git a/gtypes.h b/gtypes.h deleted file mode 100644 index eec6fa42..00000000 --- a/gtypes.h +++ /dev/null @@ -1,350 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_TYPES_H__ -#define __G_TYPES_H__ - -#include - -G_BEGIN_DECLS - -/* Provide type definitions for commonly used types. - * These are useful because a "gint8" can be adjusted - * to be 1 byte (8 bits) on all platforms. Similarly and - * more importantly, "gint32" can be adjusted to be - * 4 bytes (32 bits) on all platforms. - */ - -typedef char gchar; -typedef short gshort; -typedef long glong; -typedef int gint; -typedef gint gboolean; - -typedef unsigned char guchar; -typedef unsigned short gushort; -typedef unsigned long gulong; -typedef unsigned int guint; - -typedef float gfloat; -typedef double gdouble; - -/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms. - * Since gldouble isn't used anywhere, just disable it for now */ - -#if 0 -#ifdef HAVE_LONG_DOUBLE -typedef long double gldouble; -#else /* HAVE_LONG_DOUBLE */ -typedef double gldouble; -#endif /* HAVE_LONG_DOUBLE */ -#endif /* 0 */ - -typedef void* gpointer; -typedef const void *gconstpointer; - -typedef gint (*GCompareFunc) (gconstpointer a, - gconstpointer b); -typedef gint (*GCompareDataFunc) (gconstpointer a, - gconstpointer b, - gpointer user_data); -typedef gboolean (*GEqualFunc) (gconstpointer a, - gconstpointer b); -typedef void (*GDestroyNotify) (gpointer data); -typedef void (*GFunc) (gpointer data, - gpointer user_data); -typedef guint (*GHashFunc) (gconstpointer key); -typedef void (*GHFunc) (gpointer key, - gpointer value, - gpointer user_data); -typedef void (*GFreeFunc) (gpointer data); - -/* Define some mathematical constants that aren't available - * symbolically in some strict ISO C implementations. - */ -#define G_E 2.7182818284590452354E0 -#define G_LN2 6.9314718055994530942E-1 -#define G_LN10 2.3025850929940456840E0 -#define G_PI 3.14159265358979323846E0 -#define G_PI_2 1.57079632679489661923E0 -#define G_PI_4 0.78539816339744830962E0 -#define G_SQRT2 1.4142135623730950488E0 - -/* Portable endian checks and conversions - * - * glibconfig.h defines G_BYTE_ORDER which expands to one of - * the below macros. - */ -#define G_LITTLE_ENDIAN 1234 -#define G_BIG_ENDIAN 4321 -#define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */ - - -/* Basic bit swapping functions - */ -#define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \ - (((guint16) (val) & (guint16) 0x00ffU) << 8) | \ - (((guint16) (val) & (guint16) 0xff00U) >> 8))) -#define GUINT32_SWAP_LE_BE_CONSTANT(val) ((guint32) ( \ - (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \ - (((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \ - (((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \ - (((guint32) (val) & (guint32) 0xff000000U) >> 24))) - -/* Intel specific stuff for speed - */ -#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2 -# define GUINT16_SWAP_LE_BE_X86(val) \ - (__extension__ \ - ({ register guint16 __v; \ - if (__builtin_constant_p (val)) \ - __v = GUINT16_SWAP_LE_BE_CONSTANT (val); \ - else \ - __asm__ __const__ ("rorw $8, %w0" \ - : "=r" (__v) \ - : "0" ((guint16) (val))); \ - __v; })) -# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_X86 (val)) -# if !defined(__i486__) && !defined(__i586__) \ - && !defined(__pentium__) && !defined(__i686__) && !defined(__pentiumpro__) -# define GUINT32_SWAP_LE_BE_X86(val) \ - (__extension__ \ - ({ register guint32 __v; \ - if (__builtin_constant_p (val)) \ - __v = GUINT32_SWAP_LE_BE_CONSTANT (val); \ - else \ - __asm__ __const__ ("rorw $8, %w0\n\t" \ - "rorl $16, %0\n\t" \ - "rorw $8, %w0" \ - : "=r" (__v) \ - : "0" ((guint32) (val))); \ - __v; })) -# else /* 486 and higher has bswap */ -# define GUINT32_SWAP_LE_BE_X86(val) \ - (__extension__ \ - ({ register guint32 __v; \ - if (__builtin_constant_p (val)) \ - __v = GUINT32_SWAP_LE_BE_CONSTANT (val); \ - else \ - __asm__ __const__ ("bswap %0" \ - : "=r" (__v) \ - : "0" ((guint32) (val))); \ - __v; })) -# endif /* processor specific 32-bit stuff */ -# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86 (val)) -#else /* !__i386__ */ -# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val)) -# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val)) -#endif /* __i386__ */ - -#ifdef G_HAVE_GINT64 -# define GUINT64_SWAP_LE_BE_CONSTANT(val) ((guint64) ( \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x00000000000000ffU)) << 56) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x000000000000ff00U)) << 40) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x0000000000ff0000U)) << 24) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x00000000ff000000U)) << 8) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x000000ff00000000U)) >> 8) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x0000ff0000000000U)) >> 24) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0x00ff000000000000U)) >> 40) | \ - (((guint64) (val) & \ - (guint64) G_GINT64_CONSTANT(0xff00000000000000U)) >> 56))) -# if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2 -# define GUINT64_SWAP_LE_BE_X86(val) \ - (__extension__ \ - ({ union { guint64 __ll; \ - guint32 __l[2]; } __r; \ - if (__builtin_constant_p (val)) \ - __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (val); \ - else \ - { \ - union { guint64 __ll; \ - guint32 __l[2]; } __w; \ - __w.__ll = ((guint64) val); \ - __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \ - __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \ - } \ - __r.__ll; })) -# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86 (val)) -# else /* !__i386__ */ -# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT(val)) -# endif -#endif - -#define GUINT16_SWAP_LE_PDP(val) ((guint16) (val)) -#define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val)) -#define GUINT32_SWAP_LE_PDP(val) ((guint32) ( \ - (((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \ - (((guint32) (val) & (guint32) 0xffff0000U) >> 16))) -#define GUINT32_SWAP_BE_PDP(val) ((guint32) ( \ - (((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \ - (((guint32) (val) & (guint32) 0xff00ff00U) >> 8))) - -/* The G*_TO_?E() macros are defined in glibconfig.h. - * The transformation is symmetric, so the FROM just maps to the TO. - */ -#define GINT16_FROM_LE(val) (GINT16_TO_LE (val)) -#define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val)) -#define GINT16_FROM_BE(val) (GINT16_TO_BE (val)) -#define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val)) -#define GINT32_FROM_LE(val) (GINT32_TO_LE (val)) -#define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val)) -#define GINT32_FROM_BE(val) (GINT32_TO_BE (val)) -#define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val)) - -#ifdef G_HAVE_GINT64 -#define GINT64_FROM_LE(val) (GINT64_TO_LE (val)) -#define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val)) -#define GINT64_FROM_BE(val) (GINT64_TO_BE (val)) -#define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val)) -#endif - -#define GLONG_FROM_LE(val) (GLONG_TO_LE (val)) -#define GULONG_FROM_LE(val) (GULONG_TO_LE (val)) -#define GLONG_FROM_BE(val) (GLONG_TO_BE (val)) -#define GULONG_FROM_BE(val) (GULONG_TO_BE (val)) - -#define GINT_FROM_LE(val) (GINT_TO_LE (val)) -#define GUINT_FROM_LE(val) (GUINT_TO_LE (val)) -#define GINT_FROM_BE(val) (GINT_TO_BE (val)) -#define GUINT_FROM_BE(val) (GUINT_TO_BE (val)) - - -/* Portable versions of host-network order stuff - */ -#define g_ntohl(val) (GUINT32_FROM_BE (val)) -#define g_ntohs(val) (GUINT16_FROM_BE (val)) -#define g_htonl(val) (GUINT32_TO_BE (val)) -#define g_htons(val) (GUINT16_TO_BE (val)) - -/* IEEE Standard 754 Single Precision Storage Format (gfloat): - * - * 31 30 23 22 0 - * +--------+---------------+---------------+ - * | s 1bit | e[30:23] 8bit | f[22:0] 23bit | - * +--------+---------------+---------------+ - * B0------------------->B1------->B2-->B3--> - * - * IEEE Standard 754 Double Precision Storage Format (gdouble): - * - * 63 62 52 51 32 31 0 - * +--------+----------------+----------------+ +---------------+ - * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit | - * +--------+----------------+----------------+ +---------------+ - * B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7-> - */ -/* subtract from biased_exponent to form base2 exponent (normal numbers) */ -typedef union _GDoubleIEEE754 GDoubleIEEE754; -typedef union _GFloatIEEE754 GFloatIEEE754; -#define G_IEEE754_FLOAT_BIAS (127) -#define G_IEEE754_DOUBLE_BIAS (1023) -/* multiply with base2 exponent to get base10 exponent (nomal numbers) */ -#define G_LOG_2_BASE_10 (0.30102999566398119521) -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -union _GFloatIEEE754 -{ - gfloat v_float; - struct { - guint mantissa : 23; - guint biased_exponent : 8; - guint sign : 1; - } mpn; -}; -union _GDoubleIEEE754 -{ - gdouble v_double; - struct { - guint mantissa_low : 32; - guint mantissa_high : 20; - guint biased_exponent : 11; - guint sign : 1; - } mpn; -}; -#elif G_BYTE_ORDER == G_BIG_ENDIAN -union _GFloatIEEE754 -{ - gfloat v_float; - struct { - guint sign : 1; - guint biased_exponent : 8; - guint mantissa : 23; - } mpn; -}; -union _GDoubleIEEE754 -{ - gdouble v_double; - struct { - guint sign : 1; - guint biased_exponent : 11; - guint mantissa_high : 20; - guint mantissa_low : 32; - } mpn; -}; -#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ -#error unknown ENDIAN type -#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ - -typedef struct _GTimeVal GTimeVal; - -struct _GTimeVal -{ - glong tv_sec; - glong tv_usec; -}; - -G_END_DECLS - -/* We prefix variable declarations so they can - * properly get exported in windows dlls. - */ -#ifndef GLIB_VAR -# ifdef G_PLATFORM_WIN32 -# ifdef GLIB_STATIC_COMPILATION -# define GLIB_VAR extern -# else /* !GLIB_STATIC_COMPILATION */ -# ifdef GLIB_COMPILATION -# ifdef DLL_EXPORT -# define GLIB_VAR __declspec(dllexport) -# else /* !DLL_EXPORT */ -# define GLIB_VAR extern -# endif /* !DLL_EXPORT */ -# else /* !GLIB_COMPILATION */ -# define GLIB_VAR extern __declspec(dllimport) -# endif /* !GLIB_COMPILATION */ -# endif /* !GLIB_STATIC_COMPILATION */ -# else /* !G_PLATFORM_WIN32 */ -# define GLIB_VAR extern -# endif /* !G_PLATFORM_WIN32 */ -#endif /* GLIB_VAR */ - -#endif /* __G_TYPES_H__ */ - diff --git a/gunibreak.c b/gunibreak.c deleted file mode 100644 index 4f329599..00000000 --- a/gunibreak.c +++ /dev/null @@ -1,55 +0,0 @@ -/* gunibreak.c - line break properties - * - * Copyright 2000 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 "glib.h" -#include "gunibreak.h" - -#include - -#include - - -/* We cheat a bit and cast type values to (char *). We detect these - using the &0xff trick. */ -#define TPROP(Page, Char) \ - (((GPOINTER_TO_INT(break_property_table[Page]) & 0xff) == GPOINTER_TO_INT(break_property_table[Page])) \ - ? GPOINTER_TO_INT(break_property_table[Page]) \ - : (break_property_table[Page][Char])) - -#define PROP(Char) (((Char) > (G_UNICODE_LAST_CHAR)) ? G_UNICODE_UNASSIGNED : TPROP ((Char) >> 8, (Char) & 0xff)) - -/** - * g_unichar_break_type: - * @c: a Unicode character - * - * Determines the break type of @c. @c should be a Unicode character - * (to derive a character from UTF-8 encoded text, use - * g_utf8_get_char()). The break type is used to find word and line - * breaks ("text boundaries"), Pango implements the Unicode boundary - * resolution alogorithms and normally you would use a function such - * as pango_break() instead of caring about break types yourself. - * - * Return value: break type - **/ -GUnicodeBreakType -g_unichar_break_type (gunichar c) -{ - return PROP (c); -} diff --git a/gunibreak.h b/gunibreak.h deleted file mode 100644 index 34912b3a..00000000 --- a/gunibreak.h +++ /dev/null @@ -1,7254 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! - Instead, edit gen-unicode-tables.pl and re-run. */ - -#ifndef BREAKTABLES_H -#define BREAKTABLES_H - -#define G_UNICODE_DATA_VERSION "3.0.1" - -#define G_UNICODE_LAST_CHAR 0xffff - -static char page0[256] = { - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_LINE_FEED, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CARRIAGE_RETURN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_SPACE, G_UNICODE_BREAK_EXCLAMATION, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_HYPHEN, - G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_INFIX_SEPARATOR, - G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC -}; - -static char page1[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page2[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page3[256] = { - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page4[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page5[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_INFIX_SEPARATOR, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page6[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN -}; - -static char page7[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page9[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page10[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page11[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page12[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page13[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page14[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page15[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page16[256] = { - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page17[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page18[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page19[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page20[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page22[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page23[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page24[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page30[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page31[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN -}; - -static char page32[256] = { - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE_AND_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INSEPARABLE, - G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_INSEPARABLE, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_MANDATORY, - G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page33[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page34[256] = { - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page35[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page36[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page37[256] = { - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page38[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page39[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page46[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page47[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page48[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page49[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page50[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page51[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page52[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page77[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page78[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page159[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page164[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page172[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page215[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page216[256] = { - G_UNICODE_BREAK_SURROGATE, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page219[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_SURROGATE, - G_UNICODE_BREAK_SURROGATE, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_SURROGATE -}; - -static char page220[256] = { - G_UNICODE_BREAK_SURROGATE, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page223[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_SURROGATE -}; - -static char page224[256] = { - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC -}; - -static char page248[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS -}; - -static char page250[256] = { - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN -}; - -static char page251[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC -}; - -static char page253[256] = { - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char page254[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_EXCLAMATION, - G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_BREAKING_GLUE -}; - -static char page255[256] = { - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_EXCLAMATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_CONTINGENT, - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN -}; - -static char *break_property_table[256] = { - page0, - page1, - page2, - page3, - page4, - page5, - page6, - page7, - (char *) G_UNICODE_BREAK_UNKNOWN, - page9, - page10, - page11, - page12, - page13, - page14, - page15, - page16, - page17, - page18, - page19, - page20, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page22, - page23, - page24, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - page30, - page31, - page32, - page33, - page34, - page35, - page36, - page37, - page38, - page39, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - page46, - page47, - page48, - page49, - page50, - page51, - page52, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page77, - page78, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page159, - (char *) G_UNICODE_BREAK_IDEOGRAPHIC, - (char *) G_UNICODE_BREAK_IDEOGRAPHIC, - (char *) G_UNICODE_BREAK_IDEOGRAPHIC, - (char *) G_UNICODE_BREAK_IDEOGRAPHIC, - page164, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - (char *) G_UNICODE_BREAK_UNKNOWN, - page172, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page215, - page216, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page219, - page220, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page223, - page224, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page248, - (char *) G_UNICODE_BREAK_IDEOGRAPHIC, - page250, - page251, - (char *) G_UNICODE_BREAK_ALPHABETIC, - page253, - page254, - page255 -}; - -#endif /* BREAKTABLES_H */ diff --git a/gunichartables.h b/gunichartables.h deleted file mode 100644 index bcbbb18c..00000000 --- a/gunichartables.h +++ /dev/null @@ -1,5957 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! - Instead, edit gen-unicode-tables.pl and re-run. */ - -#ifndef CHARTABLES_H -#define CHARTABLES_H - -#define G_UNICODE_DATA_VERSION "3.0.1" - -#define G_UNICODE_LAST_CHAR 0xffff - -static char page0[256] = { - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, - 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_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_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_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_OTHER_NUMBER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_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_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_MATH_SYMBOL, 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 -}; - -static char page1[256] = { - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, 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_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - 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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, 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_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - 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_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER -}; - -static char page2[256] = { - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - 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, - 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_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_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_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_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_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_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_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_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_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_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_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_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 -}; - -static char page3[256] = { - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_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_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_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_UNASSIGNED, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - 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_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] = { - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_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_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_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_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_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_ENCLOSING_MARK, - G_UNICODE_ENCLOSING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED -}; - -static char page5[256] = { - 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, 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, 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, - 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_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_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_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_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, - 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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, 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 page6[256] = { - 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_OTHER_PUNCTUATION, 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_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, - 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED -}; - -static char page7[256] = { - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_OTHER_LETTER, - G_UNICODE_NON_SPACING_MARK, 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - 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, 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, 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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - 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, 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, 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, - 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 page9[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - 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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, - 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_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_LETTER, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED -}; - -static char page10[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_LETTER, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, 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_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_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_LETTER, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_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_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_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 -}; - -static char page11[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_LETTER, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_SYMBOL, - 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_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, 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_COMBINING_MARK, - 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_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_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 -}; - -static char page12[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_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, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_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 -}; - -static char page13[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_COMBINING_MARK, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_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, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, 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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, 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_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_PUNCTUATION, - 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 page14[256] = { - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, 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_MODIFIER_LETTER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, 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, - 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_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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, 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 page15[256] = { - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, 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_LETTER, - G_UNICODE_UNASSIGNED, 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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, 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, - 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, 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 page16[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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - 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_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - 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, 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, 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, - 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED -}; - -static char page17[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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page18[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_UNASSIGNED, 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_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_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_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_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_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_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_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_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_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, 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_UNASSIGNED, - 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_LETTER, - G_UNICODE_OTHER_LETTER -}; - -static char page19[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_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_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, 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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - 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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_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, 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_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_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_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_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_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_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_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_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_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_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_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_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_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 -}; - -static char page20[256] = { - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER -}; - -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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, 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_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_SPACE_SEPARATOR, 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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, 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_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 page23[256] = { - 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, 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, 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, - 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, 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, 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, - 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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, - G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_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, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED -}; - -static char page24[256] = { - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_FORMAT, G_UNICODE_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_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_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_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_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_MODIFIER_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, 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, 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, - 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, 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, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page30[256] = { - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, 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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page31[256] = { - 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - 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_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_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_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_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_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_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_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, 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_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED -}; - -static char page32[256] = { - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, - G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR, G_UNICODE_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, 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, - 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_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, 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_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, 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, 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_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, - G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_ENCLOSING_MARK, - G_UNICODE_ENCLOSING_MARK, 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, - 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 page33[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_OTHER_SYMBOL, 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, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, 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_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_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_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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 page34[256] = { - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, 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 page35[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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, 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, 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, - 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, 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, G_UNICODE_UNASSIGNED -}; - -static char page36[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_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, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page37[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, 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 page38[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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, 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, 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, - 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, 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, 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, - 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, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page39[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, 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_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, 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, 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, - 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, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page46[256] = { - 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, 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, 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, - 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, 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, 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, - 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_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, 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 page47[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, 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, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page48[256] = { - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED -}; - -static char page49[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, 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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_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, - 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, 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, 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 page50[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, 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, 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED -}; - -static char page51[256] = { - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED -}; - -static char page77[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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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, 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, - 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, 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 page159[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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_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, - 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, 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, 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, - 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 page164[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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, 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, - 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, 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 page215[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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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, 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, - 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, 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, 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 page250[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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_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, - 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, 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, 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, - 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, 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, 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, - 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, 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, 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, - 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 page251[256] = { - 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_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_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_NON_SPACING_MARK, 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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MATH_SYMBOL, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_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, - 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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER -}; - -static char page253[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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, 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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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, 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, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED -}; - -static char page254[256] = { - 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, 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_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, - G_UNICODE_NON_SPACING_MARK, 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_OTHER_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_MATH_SYMBOL, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_UNASSIGNED, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_FORMAT -}; - -static char page255[256] = { - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, - 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_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_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_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, - G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, - 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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_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_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_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, - G_UNICODE_MODIFIER_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_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_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_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_LETTER, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, - G_UNICODE_UNASSIGNED, 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_UNASSIGNED, G_UNICODE_UNASSIGNED, - 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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, 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_FORMAT, - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED -}; - -static char *type_table[256] = { - page0, - page1, - page2, - page3, - page4, - page5, - page6, - page7, - (char *) G_UNICODE_UNASSIGNED, - page9, - page10, - page11, - page12, - page13, - page14, - page15, - page16, - page17, - page18, - page19, - page20, - (char *) G_UNICODE_OTHER_LETTER, - page22, - page23, - page24, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - page30, - page31, - page32, - page33, - page34, - page35, - page36, - page37, - page38, - page39, - (char *) G_UNICODE_OTHER_SYMBOL, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - page46, - page47, - page48, - page49, - page50, - page51, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - page77, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - page159, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - page164, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_UNASSIGNED, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - (char *) G_UNICODE_OTHER_LETTER, - page215, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_SURROGATE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_PRIVATE_USE, - (char *) G_UNICODE_OTHER_LETTER, - page250, - page251, - (char *) G_UNICODE_OTHER_LETTER, - page253, - page254, - page255 -}; - -static unsigned short attrpage0[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, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, - 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, - 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, - 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, - 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, - 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 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, 0x039c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, - 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, - 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0000, 0x00c0, - 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, - 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, - 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000, 0x00d8, 0x00d9, 0x00da, 0x00db, - 0x00dc, 0x00dd, 0x00de, 0x0178 -}; - -static unsigned short attrpage1[256] = { - 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x0107, 0x0106, 0x0109, - 0x0108, 0x010b, 0x010a, 0x010d, 0x010c, 0x010f, 0x010e, 0x0111, 0x0110, - 0x0113, 0x0112, 0x0115, 0x0114, 0x0117, 0x0116, 0x0119, 0x0118, 0x011b, - 0x011a, 0x011d, 0x011c, 0x011f, 0x011e, 0x0121, 0x0120, 0x0123, 0x0122, - 0x0125, 0x0124, 0x0127, 0x0126, 0x0129, 0x0128, 0x012b, 0x012a, 0x012d, - 0x012c, 0x012f, 0x012e, 0x0069, 0x0049, 0x0133, 0x0132, 0x0135, 0x0134, - 0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e, 0x013d, - 0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145, 0x0148, - 0x0147, 0x0000, 0x014b, 0x014a, 0x014d, 0x014c, 0x014f, 0x014e, 0x0151, - 0x0150, 0x0153, 0x0152, 0x0155, 0x0154, 0x0157, 0x0156, 0x0159, 0x0158, - 0x015b, 0x015a, 0x015d, 0x015c, 0x015f, 0x015e, 0x0161, 0x0160, 0x0163, - 0x0162, 0x0165, 0x0164, 0x0167, 0x0166, 0x0169, 0x0168, 0x016b, 0x016a, - 0x016d, 0x016c, 0x016f, 0x016e, 0x0171, 0x0170, 0x0173, 0x0172, 0x0175, - 0x0174, 0x0177, 0x0176, 0x00ff, 0x017a, 0x0179, 0x017c, 0x017b, 0x017e, - 0x017d, 0x0053, 0x0000, 0x0253, 0x0183, 0x0182, 0x0185, 0x0184, 0x0254, - 0x0188, 0x0187, 0x0256, 0x0257, 0x018c, 0x018b, 0x0000, 0x01dd, 0x0259, - 0x025b, 0x0192, 0x0191, 0x0260, 0x0263, 0x01f6, 0x0269, 0x0268, 0x0199, - 0x0198, 0x0000, 0x0000, 0x026f, 0x0272, 0x0000, 0x0275, 0x01a1, 0x01a0, - 0x01a3, 0x01a2, 0x01a5, 0x01a4, 0x0280, 0x01a8, 0x01a7, 0x0283, 0x0000, - 0x0000, 0x01ad, 0x01ac, 0x0288, 0x01b0, 0x01af, 0x028a, 0x028b, 0x01b4, - 0x01b3, 0x01b6, 0x01b5, 0x0292, 0x01b9, 0x01b8, 0x0000, 0x0000, 0x01bd, - 0x01bc, 0x0000, 0x01f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x01c6, 0x0000, - 0x01c4, 0x01c9, 0x0000, 0x01c7, 0x01cc, 0x0000, 0x01ca, 0x01ce, 0x01cd, - 0x01d0, 0x01cf, 0x01d2, 0x01d1, 0x01d4, 0x01d3, 0x01d6, 0x01d5, 0x01d8, - 0x01d7, 0x01da, 0x01d9, 0x01dc, 0x01db, 0x018e, 0x01df, 0x01de, 0x01e1, - 0x01e0, 0x01e3, 0x01e2, 0x01e5, 0x01e4, 0x01e7, 0x01e6, 0x01e9, 0x01e8, - 0x01eb, 0x01ea, 0x01ed, 0x01ec, 0x01ef, 0x01ee, 0x0000, 0x01f3, 0x0000, - 0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf, 0x01f9, 0x01f8, 0x01fb, 0x01fa, - 0x01fd, 0x01fc, 0x01ff, 0x01fe -}; - -static unsigned short attrpage2[256] = { - 0x0201, 0x0200, 0x0203, 0x0202, 0x0205, 0x0204, 0x0207, 0x0206, 0x0209, - 0x0208, 0x020b, 0x020a, 0x020d, 0x020c, 0x020f, 0x020e, 0x0211, 0x0210, - 0x0213, 0x0212, 0x0215, 0x0214, 0x0217, 0x0216, 0x0219, 0x0218, 0x021b, - 0x021a, 0x021d, 0x021c, 0x021f, 0x021e, 0x0000, 0x0000, 0x0223, 0x0222, - 0x0225, 0x0224, 0x0227, 0x0226, 0x0229, 0x0228, 0x022b, 0x022a, 0x022d, - 0x022c, 0x022f, 0x022e, 0x0231, 0x0230, 0x0233, 0x0232, 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, 0x0181, 0x0186, 0x0000, 0x0189, 0x018a, 0x0000, 0x018f, - 0x0000, 0x0190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0193, 0x0000, 0x0000, - 0x0194, 0x0000, 0x0000, 0x0000, 0x0000, 0x0197, 0x0196, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x019c, 0x0000, 0x0000, 0x019d, 0x0000, 0x0000, - 0x019f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x01a6, 0x0000, 0x0000, 0x01a9, 0x0000, 0x0000, 0x0000, - 0x0000, 0x01ae, 0x0000, 0x01b1, 0x01b2, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x01b7, 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 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, 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, 0x03ac, - 0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce, - 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, - 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, - 0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, - 0x03cb, 0x0386, 0x0388, 0x0389, 0x038a, 0x0000, 0x0391, 0x0392, 0x0393, - 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, - 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5, - 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f, - 0x0000, 0x0392, 0x0398, 0x0000, 0x0000, 0x0000, 0x03a6, 0x03a0, 0x0000, - 0x0000, 0x0000, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df, 0x03de, 0x03e1, - 0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6, 0x03e9, 0x03e8, - 0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a, 0x03a1, 0x03a3, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage4[256] = { - 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, - 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0430, 0x0431, - 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, - 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, - 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, - 0x044d, 0x044e, 0x044f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, - 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0400, - 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, - 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, 0x0461, 0x0460, 0x0463, - 0x0462, 0x0465, 0x0464, 0x0467, 0x0466, 0x0469, 0x0468, 0x046b, 0x046a, - 0x046d, 0x046c, 0x046f, 0x046e, 0x0471, 0x0470, 0x0473, 0x0472, 0x0475, - 0x0474, 0x0477, 0x0476, 0x0479, 0x0478, 0x047b, 0x047a, 0x047d, 0x047c, - 0x047f, 0x047e, 0x0481, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x048d, 0x048c, 0x048f, 0x048e, - 0x0491, 0x0490, 0x0493, 0x0492, 0x0495, 0x0494, 0x0497, 0x0496, 0x0499, - 0x0498, 0x049b, 0x049a, 0x049d, 0x049c, 0x049f, 0x049e, 0x04a1, 0x04a0, - 0x04a3, 0x04a2, 0x04a5, 0x04a4, 0x04a7, 0x04a6, 0x04a9, 0x04a8, 0x04ab, - 0x04aa, 0x04ad, 0x04ac, 0x04af, 0x04ae, 0x04b1, 0x04b0, 0x04b3, 0x04b2, - 0x04b5, 0x04b4, 0x04b7, 0x04b6, 0x04b9, 0x04b8, 0x04bb, 0x04ba, 0x04bd, - 0x04bc, 0x04bf, 0x04be, 0x0000, 0x04c2, 0x04c1, 0x04c4, 0x04c3, 0x0000, - 0x0000, 0x04c8, 0x04c7, 0x0000, 0x0000, 0x04cc, 0x04cb, 0x0000, 0x0000, - 0x0000, 0x04d1, 0x04d0, 0x04d3, 0x04d2, 0x04d5, 0x04d4, 0x04d7, 0x04d6, - 0x04d9, 0x04d8, 0x04db, 0x04da, 0x04dd, 0x04dc, 0x04df, 0x04de, 0x04e1, - 0x04e0, 0x04e3, 0x04e2, 0x04e5, 0x04e4, 0x04e7, 0x04e6, 0x04e9, 0x04e8, - 0x04eb, 0x04ea, 0x04ed, 0x04ec, 0x04ef, 0x04ee, 0x04f1, 0x04f0, 0x04f3, - 0x04f2, 0x04f5, 0x04f4, 0x0000, 0x0000, 0x04f9, 0x04f8, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage5[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, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, - 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, - 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, - 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, 0x0580, - 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0531, 0x0532, - 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, 0x0538, 0x0539, 0x053a, 0x053b, - 0x053c, 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, - 0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, - 0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, - 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 attrpage6[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, 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, 0x0001, 0x0002, - 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 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, 0x0001, 0x0002, - 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage9[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 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, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage10[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 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, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage11[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 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, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage12[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 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, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage13[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x0006, 0x0007, 0x0008, 0x0009, 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 attrpage14[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, 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, - 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, - 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 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 attrpage15[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, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 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 attrpage16[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, 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, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 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 attrpage19[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, 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, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 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 attrpage23[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, 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, - 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, - 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 attrpage24[256] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, - 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 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 attrpage30[256] = { - 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, 0x1e09, - 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e, 0x1e11, 0x1e10, - 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16, 0x1e19, 0x1e18, 0x1e1b, - 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e, 0x1e21, 0x1e20, 0x1e23, 0x1e22, - 0x1e25, 0x1e24, 0x1e27, 0x1e26, 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, - 0x1e2c, 0x1e2f, 0x1e2e, 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, - 0x1e37, 0x1e36, 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, - 0x1e3e, 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46, - 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e, 0x1e51, - 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56, 0x1e59, 0x1e58, - 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e, 0x1e61, 0x1e60, 0x1e63, - 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66, 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, - 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e, 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, - 0x1e74, 0x1e77, 0x1e76, 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, - 0x1e7f, 0x1e7e, 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, - 0x1e86, 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e, - 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x1e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1, 0x1ea0, - 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, 0x1ea9, 0x1ea8, 0x1eab, - 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2, - 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd, - 0x1ebc, 0x1ebf, 0x1ebe, 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, 0x1ec5, 0x1ec4, - 0x1ec7, 0x1ec6, 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, 0x1ecc, 0x1ecf, - 0x1ece, 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, 0x1ed7, 0x1ed6, - 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, 0x1ede, 0x1ee1, - 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6, 0x1ee9, 0x1ee8, - 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee, 0x1ef1, 0x1ef0, 0x1ef3, - 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6, 0x1ef9, 0x1ef8, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage31[256] = { - 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f00, - 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, 0x1f18, 0x1f19, - 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x0000, 0x0000, 0x1f10, 0x1f11, 0x1f12, - 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, - 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, - 0x1f25, 0x1f26, 0x1f27, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, - 0x1f3e, 0x1f3f, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, - 0x1f37, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x0000, 0x0000, - 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, 0x0000, - 0x1f59, 0x0000, 0x1f5b, 0x0000, 0x1f5d, 0x0000, 0x1f5f, 0x0000, 0x1f51, - 0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, 0x1f68, 0x1f69, 0x1f6a, - 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f60, 0x1f61, 0x1f62, 0x1f63, - 0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, - 0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb, - 0x0000, 0x0000, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, - 0x1f8f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fa8, 0x1fa9, - 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fb8, 0x1fb9, 0x0000, 0x1fbc, - 0x0000, 0x0000, 0x0000, 0x0000, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x0000, - 0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fcc, 0x0000, 0x0000, - 0x0000, 0x0000, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1fd8, 0x1fd9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8, - 0x1fe9, 0x0000, 0x0000, 0x0000, 0x1fec, 0x0000, 0x0000, 0x1fe0, 0x1fe1, - 0x1f7a, 0x1f7b, 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, - 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static unsigned short attrpage33[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, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x03c9, 0x0000, 0x0000, 0x0000, 0x006b, 0x00e5, 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] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, - 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff41, 0xff42, 0xff43, - 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, - 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, - 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, - 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, - 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, - 0xff3a, 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 *attr_table[256] = { - attrpage0, - attrpage1, - attrpage2, - attrpage3, - attrpage4, - attrpage5, - attrpage6, - 0x0000, - 0x0000, - attrpage9, - attrpage10, - attrpage11, - attrpage12, - attrpage13, - attrpage14, - attrpage15, - attrpage16, - 0x0000, - 0x0000, - attrpage19, - 0x0000, - 0x0000, - 0x0000, - attrpage23, - attrpage24, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - attrpage30, - attrpage31, - 0x0000, - attrpage33, - 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, - attrpage255 -}; - -static unsigned short title_table[][3] = { - { 0x01c5, 0x01c4, 0x01c6 }, - { 0x01c8, 0x01c7, 0x01c9 }, - { 0x01cb, 0x01ca, 0x01cc }, - { 0x01f2, 0x01f1, 0x01f3 }, - { 0x1f88, 0x0000, 0x1f80 }, - { 0x1f89, 0x0000, 0x1f81 }, - { 0x1f8a, 0x0000, 0x1f82 }, - { 0x1f8b, 0x0000, 0x1f83 }, - { 0x1f8c, 0x0000, 0x1f84 }, - { 0x1f8d, 0x0000, 0x1f85 }, - { 0x1f8e, 0x0000, 0x1f86 }, - { 0x1f8f, 0x0000, 0x1f87 }, - { 0x1f98, 0x0000, 0x1f90 }, - { 0x1f99, 0x0000, 0x1f91 }, - { 0x1f9a, 0x0000, 0x1f92 }, - { 0x1f9b, 0x0000, 0x1f93 }, - { 0x1f9c, 0x0000, 0x1f94 }, - { 0x1f9d, 0x0000, 0x1f95 }, - { 0x1f9e, 0x0000, 0x1f96 }, - { 0x1f9f, 0x0000, 0x1f97 }, - { 0x1fa8, 0x0000, 0x1fa0 }, - { 0x1fa9, 0x0000, 0x1fa1 }, - { 0x1faa, 0x0000, 0x1fa2 }, - { 0x1fab, 0x0000, 0x1fa3 }, - { 0x1fac, 0x0000, 0x1fa4 }, - { 0x1fad, 0x0000, 0x1fa5 }, - { 0x1fae, 0x0000, 0x1fa6 }, - { 0x1faf, 0x0000, 0x1fa7 }, - { 0x1fbc, 0x0000, 0x1fb3 }, - { 0x1fcc, 0x0000, 0x1fc3 }, - { 0x1ffc, 0x0000, 0x1ff3 } -}; - -#endif /* CHARTABLES_H */ diff --git a/gunicode.h b/gunicode.h deleted file mode 100644 index 2136005a..00000000 --- a/gunicode.h +++ /dev/null @@ -1,252 +0,0 @@ -/* gunicode.h - Unicode manipulation functions - * - * Copyright (C) 1999, 2000 Tom Tromey - * Copyright 2000 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. - */ - -#ifndef __G_UNICODE_H__ -#define __G_UNICODE_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef guint32 gunichar; -typedef guint16 gunichar2; - -/* These are the possible character classifications. - * See http://www.unicode.org/Public/UNIDATA/UnicodeData.html - */ -typedef enum -{ - G_UNICODE_CONTROL, - G_UNICODE_FORMAT, - G_UNICODE_UNASSIGNED, - G_UNICODE_PRIVATE_USE, - G_UNICODE_SURROGATE, - G_UNICODE_LOWERCASE_LETTER, - G_UNICODE_MODIFIER_LETTER, - G_UNICODE_OTHER_LETTER, - G_UNICODE_TITLECASE_LETTER, - G_UNICODE_UPPERCASE_LETTER, - G_UNICODE_COMBINING_MARK, - G_UNICODE_ENCLOSING_MARK, - G_UNICODE_NON_SPACING_MARK, - G_UNICODE_DECIMAL_NUMBER, - G_UNICODE_LETTER_NUMBER, - G_UNICODE_OTHER_NUMBER, - G_UNICODE_CONNECT_PUNCTUATION, - G_UNICODE_DASH_PUNCTUATION, - G_UNICODE_CLOSE_PUNCTUATION, - G_UNICODE_FINAL_PUNCTUATION, - G_UNICODE_INITIAL_PUNCTUATION, - G_UNICODE_OTHER_PUNCTUATION, - G_UNICODE_OPEN_PUNCTUATION, - G_UNICODE_CURRENCY_SYMBOL, - G_UNICODE_MODIFIER_SYMBOL, - G_UNICODE_MATH_SYMBOL, - G_UNICODE_OTHER_SYMBOL, - G_UNICODE_LINE_SEPARATOR, - G_UNICODE_PARAGRAPH_SEPARATOR, - G_UNICODE_SPACE_SEPARATOR -} GUnicodeType; - -/* These are the possible line break classifications. - * See http://www.unicode.org/unicode/reports/tr14/ - */ -typedef enum -{ - G_UNICODE_BREAK_MANDATORY, - G_UNICODE_BREAK_CARRIAGE_RETURN, - G_UNICODE_BREAK_LINE_FEED, - G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_SURROGATE, - G_UNICODE_BREAK_ZERO_WIDTH_SPACE, - G_UNICODE_BREAK_INSEPARABLE, - G_UNICODE_BREAK_NON_BREAKING_GLUE, - G_UNICODE_BREAK_CONTINGENT, - G_UNICODE_BREAK_SPACE, - G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_BEFORE, - G_UNICODE_BREAK_BEFORE_AND_AFTER, - G_UNICODE_BREAK_HYPHEN, - G_UNICODE_BREAK_NON_STARTER, - G_UNICODE_BREAK_OPEN_PUNCTUATION, - G_UNICODE_BREAK_CLOSE_PUNCTUATION, - G_UNICODE_BREAK_QUOTATION, - G_UNICODE_BREAK_EXCLAMATION, - G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_INFIX_SEPARATOR, - G_UNICODE_BREAK_SYMBOL, - G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_PREFIX, - G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_AMBIGUOUS, - G_UNICODE_BREAK_UNKNOWN -} GUnicodeBreakType; - -/* Returns TRUE if current locale uses UTF-8 charset. If CHARSET is - * not null, sets *CHARSET to the name of the current locale's - * charset. This value is statically allocated, and should be copied - * in case the locale's charset will be changed later using setlocale() - * or in some other way. - */ -gboolean g_get_charset (G_CONST_RETURN char **charset); - -/* These are all analogs of the functions. - */ -gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST; -gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST; -gboolean g_unichar_islower (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST; -gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST; -gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST; -gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST; -gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST; - -/* More functions. These convert between the three cases. - * See the Unicode book to understand title case. */ -gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST; -gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST; -gunichar g_unichar_totitle (gunichar c) G_GNUC_CONST; - -/* If C is a digit (according to `g_unichar_isdigit'), then return its - numeric value. Otherwise return -1. */ -gint g_unichar_digit_value (gunichar c) G_GNUC_CONST; - -gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST; - -/* Return the Unicode character type of a given character. */ -GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST; - -/* Return the line break property for a given character */ -GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST; - - -/* Compute canonical ordering of a string in-place. This rearranges - decomposed characters in the string according to their combining - classes. See the Unicode manual for more information. */ -void g_unicode_canonical_ordering (gunichar *string, - gsize len); - -/* Compute canonical decomposition of a character. Returns g_malloc()d - string of Unicode characters. RESULT_LEN is set to the resulting - length of the string. */ -gunichar *g_unicode_canonical_decomposition (gunichar ch, - gsize *result_len); - -/* Array of skip-bytes-per-initial character. - * We prefix variable declarations so they can - * properly get exported in Windows DLLs. - */ -GLIB_VAR char g_utf8_skip[256]; - -#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(guchar *)(p)]) - -gunichar g_utf8_get_char (const gchar *p); -gchar* g_utf8_offset_to_pointer (const gchar *str, - glong offset); -glong g_utf8_pointer_to_offset (const gchar *str, - const gchar *pos); -gchar* g_utf8_prev_char (const gchar *p); -gchar* g_utf8_find_next_char (const gchar *p, - const gchar *end); -gchar* g_utf8_find_prev_char (const gchar *str, - const gchar *p); - -glong g_utf8_strlen (const gchar *p, - gssize max); - -/* Copies n characters from src to dest */ -gchar* g_utf8_strncpy (gchar *dest, - const gchar *src, - gsize n); - -/* Find the UTF-8 character corresponding to ch, in string p. These - functions are equivalants to strchr and strrchr */ -gchar* g_utf8_strchr (const gchar *p, - gssize len, - gunichar c); -gchar* g_utf8_strrchr (const gchar *p, - gssize len, - gunichar c); - -gunichar2 *g_utf8_to_utf16 (const gchar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); -gunichar * g_utf8_to_ucs4 (const gchar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); -gunichar * g_utf8_to_ucs4_fast (const gchar *str, - glong len, - glong *items_written); -gunichar * g_utf16_to_ucs4 (const gunichar2 *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); -gchar* g_utf16_to_utf8 (const gunichar2 *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); -gunichar2 *g_ucs4_to_utf16 (const gunichar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); -gchar* g_ucs4_to_utf8 (const gunichar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error); - -/* Convert a single character into UTF-8. outbuf must have at - * least 6 bytes of space. Returns the number of bytes in the - * result. - */ -gint g_unichar_to_utf8 (gunichar c, - gchar *outbuf); - -/* Validate a UTF8 string, return TRUE if valid, put pointer to - * first invalid char in **end - */ - -gboolean g_utf8_validate (const gchar *str, - gssize max_len, - const gchar **end); - -/* Validate a Unicode character */ -gboolean g_unichar_validate (gunichar ch); - -G_END_DECLS - -#endif /* __G_UNICODE_H__ */ diff --git a/gunidecomp.c b/gunidecomp.c deleted file mode 100644 index 194c283c..00000000 --- a/gunidecomp.c +++ /dev/null @@ -1,133 +0,0 @@ -/* decomp.c - Character decomposition. - * - * Copyright (C) 1999, 2000 Tom Tromey - * Copyright 2000 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 "glib.h" -#include "gunidecomp.h" - -#include - -#include - -/* We cheat a bit and cast type values to (char *). We detect these - using the &0xff trick. */ -#define CC(Page, Char) \ - ((((GPOINTER_TO_INT(combining_class_table[Page])) & 0xff) \ - == GPOINTER_TO_INT(combining_class_table[Page])) \ - ? GPOINTER_TO_INT(combining_class_table[Page]) \ - : (combining_class_table[Page][Char])) - -#define COMBINING_CLASS(Char) \ - (((Char) > (G_UNICODE_LAST_CHAR)) ? 0 : CC((Char) >> 8, (Char) & 0xff)) - -/* Compute the canonical ordering of a string in-place. */ -void -g_unicode_canonical_ordering (gunichar *string, - size_t len) -{ - size_t i; - int swap = 1; - - while (swap) - { - int last; - swap = 0; - last = COMBINING_CLASS (string[0]); - for (i = 0; i < len - 1; ++i) - { - int next = COMBINING_CLASS (string[i + 1]); - if (next != 0 && last > next) - { - size_t j; - /* Percolate item leftward through string. */ - for (j = i; j > 0; --j) - { - gunichar t; - if (COMBINING_CLASS (string[j]) <= next) - break; - t = string[j + 1]; - string[j + 1] = string[j]; - string[j] = t; - swap = 1; - } - /* We're re-entering the loop looking at the old - character again. */ - next = last; - } - last = next; - } - } -} - -gunichar * -g_unicode_canonical_decomposition (gunichar ch, - size_t *result_len) -{ - gunichar *r = NULL; - - if (ch <= 0xffff) - { - int start = 0; - int end = G_N_ELEMENTS (decomp_table); - while (start != end) - { - int half = (start + end) / 2; - if (ch == decomp_table[half].ch) - { - /* Found it. */ - 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 - 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 - | decomp_table[half].expansion[i + 1]); - } - break; - } - else if (ch > decomp_table[half].ch) - start = half; - else - end = half; - } - } - - if (r == NULL) - { - /* Not in our table. */ - r = malloc (sizeof (gunichar)); - *r = ch; - *result_len = 1; - } - - /* Supposedly following the Unicode 2.1.9 table means that the - decompositions come out in canonical order. I haven't tested - this, but we rely on it here. */ - return r; -} diff --git a/gunidecomp.h b/gunidecomp.h deleted file mode 100644 index b4977597..00000000 --- a/gunidecomp.h +++ /dev/null @@ -1,1857 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! */ - -#ifndef DECOMP_H -#define DECOMP_H - -#define G_UNICODE_LAST_CHAR 0xffff - -static unsigned char cclass3[256] = { - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, - 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220, 230, - 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, 230, 230, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 234, 233, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass4[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, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass5[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, 0, 220, 230, 230, - 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 0, - 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass6[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, - 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 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, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, - 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static unsigned char cclass7[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230, - 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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 unsigned char cclass9[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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass10[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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass11[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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass12[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, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass13[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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass14[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, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, - 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass15[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, - 220, 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, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, - 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 -}; - -static unsigned char cclass16[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, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass23[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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass24[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, 0, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass32[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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, - 230, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass48[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, 218, 228, 232, 222, 224, - 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass251[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, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 unsigned char cclass254[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, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 unsigned char *combining_class_table[256] = { - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - cclass3, - cclass4, - cclass5, - cclass6, - cclass7, - (unsigned char *) 0, - cclass9, - cclass10, - cclass11, - cclass12, - cclass13, - cclass14, - cclass15, - cclass16, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - cclass23, - cclass24, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - cclass32, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - cclass48, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - (unsigned char *) 0, - cclass251, - (unsigned char *) 0, - (unsigned char *) 0, - cclass254, - (unsigned char *) 0 -}; - -typedef struct -{ - unsigned short ch; - unsigned char *expansion; -} decomposition; - -static decomposition decomp_table[] = -{ - { 0x00c0, "\x00\x41\x03\x00\0" }, - { 0x00c1, "\x00\x41\x03\x01\0" }, - { 0x00c2, "\x00\x41\x03\x02\0" }, - { 0x00c3, "\x00\x41\x03\x03\0" }, - { 0x00c4, "\x00\x41\x03\x08\0" }, - { 0x00c5, "\x00\x41\x03\x0a\0" }, - { 0x00c7, "\x00\x43\x03\x27\0" }, - { 0x00c8, "\x00\x45\x03\x00\0" }, - { 0x00c9, "\x00\x45\x03\x01\0" }, - { 0x00ca, "\x00\x45\x03\x02\0" }, - { 0x00cb, "\x00\x45\x03\x08\0" }, - { 0x00cc, "\x00\x49\x03\x00\0" }, - { 0x00cd, "\x00\x49\x03\x01\0" }, - { 0x00ce, "\x00\x49\x03\x02\0" }, - { 0x00cf, "\x00\x49\x03\x08\0" }, - { 0x00d1, "\x00\x4e\x03\x03\0" }, - { 0x00d2, "\x00\x4f\x03\x00\0" }, - { 0x00d3, "\x00\x4f\x03\x01\0" }, - { 0x00d4, "\x00\x4f\x03\x02\0" }, - { 0x00d5, "\x00\x4f\x03\x03\0" }, - { 0x00d6, "\x00\x4f\x03\x08\0" }, - { 0x00d9, "\x00\x55\x03\x00\0" }, - { 0x00da, "\x00\x55\x03\x01\0" }, - { 0x00db, "\x00\x55\x03\x02\0" }, - { 0x00dc, "\x00\x55\x03\x08\0" }, - { 0x00dd, "\x00\x59\x03\x01\0" }, - { 0x00e0, "\x00\x61\x03\x00\0" }, - { 0x00e1, "\x00\x61\x03\x01\0" }, - { 0x00e2, "\x00\x61\x03\x02\0" }, - { 0x00e3, "\x00\x61\x03\x03\0" }, - { 0x00e4, "\x00\x61\x03\x08\0" }, - { 0x00e5, "\x00\x61\x03\x0a\0" }, - { 0x00e7, "\x00\x63\x03\x27\0" }, - { 0x00e8, "\x00\x65\x03\x00\0" }, - { 0x00e9, "\x00\x65\x03\x01\0" }, - { 0x00ea, "\x00\x65\x03\x02\0" }, - { 0x00eb, "\x00\x65\x03\x08\0" }, - { 0x00ec, "\x00\x69\x03\x00\0" }, - { 0x00ed, "\x00\x69\x03\x01\0" }, - { 0x00ee, "\x00\x69\x03\x02\0" }, - { 0x00ef, "\x00\x69\x03\x08\0" }, - { 0x00f1, "\x00\x6e\x03\x03\0" }, - { 0x00f2, "\x00\x6f\x03\x00\0" }, - { 0x00f3, "\x00\x6f\x03\x01\0" }, - { 0x00f4, "\x00\x6f\x03\x02\0" }, - { 0x00f5, "\x00\x6f\x03\x03\0" }, - { 0x00f6, "\x00\x6f\x03\x08\0" }, - { 0x00f9, "\x00\x75\x03\x00\0" }, - { 0x00fa, "\x00\x75\x03\x01\0" }, - { 0x00fb, "\x00\x75\x03\x02\0" }, - { 0x00fc, "\x00\x75\x03\x08\0" }, - { 0x00fd, "\x00\x79\x03\x01\0" }, - { 0x00ff, "\x00\x79\x03\x08\0" }, - { 0x0100, "\x00\x41\x03\x04\0" }, - { 0x0101, "\x00\x61\x03\x04\0" }, - { 0x0102, "\x00\x41\x03\x06\0" }, - { 0x0103, "\x00\x61\x03\x06\0" }, - { 0x0104, "\x00\x41\x03\x28\0" }, - { 0x0105, "\x00\x61\x03\x28\0" }, - { 0x0106, "\x00\x43\x03\x01\0" }, - { 0x0107, "\x00\x63\x03\x01\0" }, - { 0x0108, "\x00\x43\x03\x02\0" }, - { 0x0109, "\x00\x63\x03\x02\0" }, - { 0x010a, "\x00\x43\x03\x07\0" }, - { 0x010b, "\x00\x63\x03\x07\0" }, - { 0x010c, "\x00\x43\x03\x0c\0" }, - { 0x010d, "\x00\x63\x03\x0c\0" }, - { 0x010e, "\x00\x44\x03\x0c\0" }, - { 0x010f, "\x00\x64\x03\x0c\0" }, - { 0x0112, "\x00\x45\x03\x04\0" }, - { 0x0113, "\x00\x65\x03\x04\0" }, - { 0x0114, "\x00\x45\x03\x06\0" }, - { 0x0115, "\x00\x65\x03\x06\0" }, - { 0x0116, "\x00\x45\x03\x07\0" }, - { 0x0117, "\x00\x65\x03\x07\0" }, - { 0x0118, "\x00\x45\x03\x28\0" }, - { 0x0119, "\x00\x65\x03\x28\0" }, - { 0x011a, "\x00\x45\x03\x0c\0" }, - { 0x011b, "\x00\x65\x03\x0c\0" }, - { 0x011c, "\x00\x47\x03\x02\0" }, - { 0x011d, "\x00\x67\x03\x02\0" }, - { 0x011e, "\x00\x47\x03\x06\0" }, - { 0x011f, "\x00\x67\x03\x06\0" }, - { 0x0120, "\x00\x47\x03\x07\0" }, - { 0x0121, "\x00\x67\x03\x07\0" }, - { 0x0122, "\x00\x47\x03\x27\0" }, - { 0x0123, "\x00\x67\x03\x27\0" }, - { 0x0124, "\x00\x48\x03\x02\0" }, - { 0x0125, "\x00\x68\x03\x02\0" }, - { 0x0128, "\x00\x49\x03\x03\0" }, - { 0x0129, "\x00\x69\x03\x03\0" }, - { 0x012a, "\x00\x49\x03\x04\0" }, - { 0x012b, "\x00\x69\x03\x04\0" }, - { 0x012c, "\x00\x49\x03\x06\0" }, - { 0x012d, "\x00\x69\x03\x06\0" }, - { 0x012e, "\x00\x49\x03\x28\0" }, - { 0x012f, "\x00\x69\x03\x28\0" }, - { 0x0130, "\x00\x49\x03\x07\0" }, - { 0x0134, "\x00\x4a\x03\x02\0" }, - { 0x0135, "\x00\x6a\x03\x02\0" }, - { 0x0136, "\x00\x4b\x03\x27\0" }, - { 0x0137, "\x00\x6b\x03\x27\0" }, - { 0x0139, "\x00\x4c\x03\x01\0" }, - { 0x013a, "\x00\x6c\x03\x01\0" }, - { 0x013b, "\x00\x4c\x03\x27\0" }, - { 0x013c, "\x00\x6c\x03\x27\0" }, - { 0x013d, "\x00\x4c\x03\x0c\0" }, - { 0x013e, "\x00\x6c\x03\x0c\0" }, - { 0x0143, "\x00\x4e\x03\x01\0" }, - { 0x0144, "\x00\x6e\x03\x01\0" }, - { 0x0145, "\x00\x4e\x03\x27\0" }, - { 0x0146, "\x00\x6e\x03\x27\0" }, - { 0x0147, "\x00\x4e\x03\x0c\0" }, - { 0x0148, "\x00\x6e\x03\x0c\0" }, - { 0x014c, "\x00\x4f\x03\x04\0" }, - { 0x014d, "\x00\x6f\x03\x04\0" }, - { 0x014e, "\x00\x4f\x03\x06\0" }, - { 0x014f, "\x00\x6f\x03\x06\0" }, - { 0x0150, "\x00\x4f\x03\x0b\0" }, - { 0x0151, "\x00\x6f\x03\x0b\0" }, - { 0x0154, "\x00\x52\x03\x01\0" }, - { 0x0155, "\x00\x72\x03\x01\0" }, - { 0x0156, "\x00\x52\x03\x27\0" }, - { 0x0157, "\x00\x72\x03\x27\0" }, - { 0x0158, "\x00\x52\x03\x0c\0" }, - { 0x0159, "\x00\x72\x03\x0c\0" }, - { 0x015a, "\x00\x53\x03\x01\0" }, - { 0x015b, "\x00\x73\x03\x01\0" }, - { 0x015c, "\x00\x53\x03\x02\0" }, - { 0x015d, "\x00\x73\x03\x02\0" }, - { 0x015e, "\x00\x53\x03\x27\0" }, - { 0x015f, "\x00\x73\x03\x27\0" }, - { 0x0160, "\x00\x53\x03\x0c\0" }, - { 0x0161, "\x00\x73\x03\x0c\0" }, - { 0x0162, "\x00\x54\x03\x27\0" }, - { 0x0163, "\x00\x74\x03\x27\0" }, - { 0x0164, "\x00\x54\x03\x0c\0" }, - { 0x0165, "\x00\x74\x03\x0c\0" }, - { 0x0168, "\x00\x55\x03\x03\0" }, - { 0x0169, "\x00\x75\x03\x03\0" }, - { 0x016a, "\x00\x55\x03\x04\0" }, - { 0x016b, "\x00\x75\x03\x04\0" }, - { 0x016c, "\x00\x55\x03\x06\0" }, - { 0x016d, "\x00\x75\x03\x06\0" }, - { 0x016e, "\x00\x55\x03\x0a\0" }, - { 0x016f, "\x00\x75\x03\x0a\0" }, - { 0x0170, "\x00\x55\x03\x0b\0" }, - { 0x0171, "\x00\x75\x03\x0b\0" }, - { 0x0172, "\x00\x55\x03\x28\0" }, - { 0x0173, "\x00\x75\x03\x28\0" }, - { 0x0174, "\x00\x57\x03\x02\0" }, - { 0x0175, "\x00\x77\x03\x02\0" }, - { 0x0176, "\x00\x59\x03\x02\0" }, - { 0x0177, "\x00\x79\x03\x02\0" }, - { 0x0178, "\x00\x59\x03\x08\0" }, - { 0x0179, "\x00\x5a\x03\x01\0" }, - { 0x017a, "\x00\x7a\x03\x01\0" }, - { 0x017b, "\x00\x5a\x03\x07\0" }, - { 0x017c, "\x00\x7a\x03\x07\0" }, - { 0x017d, "\x00\x5a\x03\x0c\0" }, - { 0x017e, "\x00\x7a\x03\x0c\0" }, - { 0x01a0, "\x00\x4f\x03\x1b\0" }, - { 0x01a1, "\x00\x6f\x03\x1b\0" }, - { 0x01af, "\x00\x55\x03\x1b\0" }, - { 0x01b0, "\x00\x75\x03\x1b\0" }, - { 0x01cd, "\x00\x41\x03\x0c\0" }, - { 0x01ce, "\x00\x61\x03\x0c\0" }, - { 0x01cf, "\x00\x49\x03\x0c\0" }, - { 0x01d0, "\x00\x69\x03\x0c\0" }, - { 0x01d1, "\x00\x4f\x03\x0c\0" }, - { 0x01d2, "\x00\x6f\x03\x0c\0" }, - { 0x01d3, "\x00\x55\x03\x0c\0" }, - { 0x01d4, "\x00\x75\x03\x0c\0" }, - { 0x01d5, "\x00\x55\x03\x08\x03\x04\0" }, - { 0x01d6, "\x00\x75\x03\x08\x03\x04\0" }, - { 0x01d7, "\x00\x55\x03\x08\x03\x01\0" }, - { 0x01d8, "\x00\x75\x03\x08\x03\x01\0" }, - { 0x01d9, "\x00\x55\x03\x08\x03\x0c\0" }, - { 0x01da, "\x00\x75\x03\x08\x03\x0c\0" }, - { 0x01db, "\x00\x55\x03\x08\x03\x00\0" }, - { 0x01dc, "\x00\x75\x03\x08\x03\x00\0" }, - { 0x01de, "\x00\x41\x03\x08\x03\x04\0" }, - { 0x01df, "\x00\x61\x03\x08\x03\x04\0" }, - { 0x01e0, "\x00\x41\x03\x07\x03\x04\0" }, - { 0x01e1, "\x00\x61\x03\x07\x03\x04\0" }, - { 0x01e2, "\x00\xc6\x03\x04\0" }, - { 0x01e3, "\x00\xe6\x03\x04\0" }, - { 0x01e6, "\x00\x47\x03\x0c\0" }, - { 0x01e7, "\x00\x67\x03\x0c\0" }, - { 0x01e8, "\x00\x4b\x03\x0c\0" }, - { 0x01e9, "\x00\x6b\x03\x0c\0" }, - { 0x01ea, "\x00\x4f\x03\x28\0" }, - { 0x01eb, "\x00\x6f\x03\x28\0" }, - { 0x01ec, "\x00\x4f\x03\x28\x03\x04\0" }, - { 0x01ed, "\x00\x6f\x03\x28\x03\x04\0" }, - { 0x01ee, "\x01\xb7\x03\x0c\0" }, - { 0x01ef, "\x02\x92\x03\x0c\0" }, - { 0x01f0, "\x00\x6a\x03\x0c\0" }, - { 0x01f4, "\x00\x47\x03\x01\0" }, - { 0x01f5, "\x00\x67\x03\x01\0" }, - { 0x01f8, "\x00\x4e\x03\x00\0" }, - { 0x01f9, "\x00\x6e\x03\x00\0" }, - { 0x01fa, "\x00\x41\x03\x0a\x03\x01\0" }, - { 0x01fb, "\x00\x61\x03\x0a\x03\x01\0" }, - { 0x01fc, "\x00\xc6\x03\x01\0" }, - { 0x01fd, "\x00\xe6\x03\x01\0" }, - { 0x01fe, "\x00\xd8\x03\x01\0" }, - { 0x01ff, "\x00\xf8\x03\x01\0" }, - { 0x0200, "\x00\x41\x03\x0f\0" }, - { 0x0201, "\x00\x61\x03\x0f\0" }, - { 0x0202, "\x00\x41\x03\x11\0" }, - { 0x0203, "\x00\x61\x03\x11\0" }, - { 0x0204, "\x00\x45\x03\x0f\0" }, - { 0x0205, "\x00\x65\x03\x0f\0" }, - { 0x0206, "\x00\x45\x03\x11\0" }, - { 0x0207, "\x00\x65\x03\x11\0" }, - { 0x0208, "\x00\x49\x03\x0f\0" }, - { 0x0209, "\x00\x69\x03\x0f\0" }, - { 0x020a, "\x00\x49\x03\x11\0" }, - { 0x020b, "\x00\x69\x03\x11\0" }, - { 0x020c, "\x00\x4f\x03\x0f\0" }, - { 0x020d, "\x00\x6f\x03\x0f\0" }, - { 0x020e, "\x00\x4f\x03\x11\0" }, - { 0x020f, "\x00\x6f\x03\x11\0" }, - { 0x0210, "\x00\x52\x03\x0f\0" }, - { 0x0211, "\x00\x72\x03\x0f\0" }, - { 0x0212, "\x00\x52\x03\x11\0" }, - { 0x0213, "\x00\x72\x03\x11\0" }, - { 0x0214, "\x00\x55\x03\x0f\0" }, - { 0x0215, "\x00\x75\x03\x0f\0" }, - { 0x0216, "\x00\x55\x03\x11\0" }, - { 0x0217, "\x00\x75\x03\x11\0" }, - { 0x0218, "\x00\x53\x03\x26\0" }, - { 0x0219, "\x00\x73\x03\x26\0" }, - { 0x021a, "\x00\x54\x03\x26\0" }, - { 0x021b, "\x00\x74\x03\x26\0" }, - { 0x021e, "\x00\x48\x03\x0c\0" }, - { 0x021f, "\x00\x68\x03\x0c\0" }, - { 0x0226, "\x00\x41\x03\x07\0" }, - { 0x0227, "\x00\x61\x03\x07\0" }, - { 0x0228, "\x00\x45\x03\x27\0" }, - { 0x0229, "\x00\x65\x03\x27\0" }, - { 0x022a, "\x00\x4f\x03\x08\x03\x04\0" }, - { 0x022b, "\x00\x6f\x03\x08\x03\x04\0" }, - { 0x022c, "\x00\x4f\x03\x03\x03\x04\0" }, - { 0x022d, "\x00\x6f\x03\x03\x03\x04\0" }, - { 0x022e, "\x00\x4f\x03\x07\0" }, - { 0x022f, "\x00\x6f\x03\x07\0" }, - { 0x0230, "\x00\x4f\x03\x07\x03\x04\0" }, - { 0x0231, "\x00\x6f\x03\x07\x03\x04\0" }, - { 0x0232, "\x00\x59\x03\x04\0" }, - { 0x0233, "\x00\x79\x03\x04\0" }, - { 0x0340, "\x03\x00\0" }, - { 0x0341, "\x03\x01\0" }, - { 0x0343, "\x03\x13\0" }, - { 0x0344, "\x03\x08\x03\x01\0" }, - { 0x0374, "\x02\xb9\0" }, - { 0x037e, "\x00\x3b\0" }, - { 0x0385, "\x00\xa8\x03\x01\0" }, - { 0x0386, "\x03\x91\x03\x01\0" }, - { 0x0387, "\x00\xb7\0" }, - { 0x0388, "\x03\x95\x03\x01\0" }, - { 0x0389, "\x03\x97\x03\x01\0" }, - { 0x038a, "\x03\x99\x03\x01\0" }, - { 0x038c, "\x03\x9f\x03\x01\0" }, - { 0x038e, "\x03\xa5\x03\x01\0" }, - { 0x038f, "\x03\xa9\x03\x01\0" }, - { 0x0390, "\x03\xb9\x03\x08\x03\x01\0" }, - { 0x03aa, "\x03\x99\x03\x08\0" }, - { 0x03ab, "\x03\xa5\x03\x08\0" }, - { 0x03ac, "\x03\xb1\x03\x01\0" }, - { 0x03ad, "\x03\xb5\x03\x01\0" }, - { 0x03ae, "\x03\xb7\x03\x01\0" }, - { 0x03af, "\x03\xb9\x03\x01\0" }, - { 0x03b0, "\x03\xc5\x03\x08\x03\x01\0" }, - { 0x03ca, "\x03\xb9\x03\x08\0" }, - { 0x03cb, "\x03\xc5\x03\x08\0" }, - { 0x03cc, "\x03\xbf\x03\x01\0" }, - { 0x03cd, "\x03\xc5\x03\x01\0" }, - { 0x03ce, "\x03\xc9\x03\x01\0" }, - { 0x03d3, "\x03\xd2\x03\x01\0" }, - { 0x03d4, "\x03\xd2\x03\x08\0" }, - { 0x0400, "\x04\x15\x03\x00\0" }, - { 0x0401, "\x04\x15\x03\x08\0" }, - { 0x0403, "\x04\x13\x03\x01\0" }, - { 0x0407, "\x04\x06\x03\x08\0" }, - { 0x040c, "\x04\x1a\x03\x01\0" }, - { 0x040d, "\x04\x18\x03\x00\0" }, - { 0x040e, "\x04\x23\x03\x06\0" }, - { 0x0419, "\x04\x18\x03\x06\0" }, - { 0x0439, "\x04\x38\x03\x06\0" }, - { 0x0450, "\x04\x35\x03\x00\0" }, - { 0x0451, "\x04\x35\x03\x08\0" }, - { 0x0453, "\x04\x33\x03\x01\0" }, - { 0x0457, "\x04\x56\x03\x08\0" }, - { 0x045c, "\x04\x3a\x03\x01\0" }, - { 0x045d, "\x04\x38\x03\x00\0" }, - { 0x045e, "\x04\x43\x03\x06\0" }, - { 0x0476, "\x04\x74\x03\x0f\0" }, - { 0x0477, "\x04\x75\x03\x0f\0" }, - { 0x04c1, "\x04\x16\x03\x06\0" }, - { 0x04c2, "\x04\x36\x03\x06\0" }, - { 0x04d0, "\x04\x10\x03\x06\0" }, - { 0x04d1, "\x04\x30\x03\x06\0" }, - { 0x04d2, "\x04\x10\x03\x08\0" }, - { 0x04d3, "\x04\x30\x03\x08\0" }, - { 0x04d6, "\x04\x15\x03\x06\0" }, - { 0x04d7, "\x04\x35\x03\x06\0" }, - { 0x04da, "\x04\xd8\x03\x08\0" }, - { 0x04db, "\x04\xd9\x03\x08\0" }, - { 0x04dc, "\x04\x16\x03\x08\0" }, - { 0x04dd, "\x04\x36\x03\x08\0" }, - { 0x04de, "\x04\x17\x03\x08\0" }, - { 0x04df, "\x04\x37\x03\x08\0" }, - { 0x04e2, "\x04\x18\x03\x04\0" }, - { 0x04e3, "\x04\x38\x03\x04\0" }, - { 0x04e4, "\x04\x18\x03\x08\0" }, - { 0x04e5, "\x04\x38\x03\x08\0" }, - { 0x04e6, "\x04\x1e\x03\x08\0" }, - { 0x04e7, "\x04\x3e\x03\x08\0" }, - { 0x04ea, "\x04\xe8\x03\x08\0" }, - { 0x04eb, "\x04\xe9\x03\x08\0" }, - { 0x04ec, "\x04\x2d\x03\x08\0" }, - { 0x04ed, "\x04\x4d\x03\x08\0" }, - { 0x04ee, "\x04\x23\x03\x04\0" }, - { 0x04ef, "\x04\x43\x03\x04\0" }, - { 0x04f0, "\x04\x23\x03\x08\0" }, - { 0x04f1, "\x04\x43\x03\x08\0" }, - { 0x04f2, "\x04\x23\x03\x0b\0" }, - { 0x04f3, "\x04\x43\x03\x0b\0" }, - { 0x04f4, "\x04\x27\x03\x08\0" }, - { 0x04f5, "\x04\x47\x03\x08\0" }, - { 0x04f8, "\x04\x2b\x03\x08\0" }, - { 0x04f9, "\x04\x4b\x03\x08\0" }, - { 0x0622, "\x06\x27\x06\x53\0" }, - { 0x0623, "\x06\x27\x06\x54\0" }, - { 0x0624, "\x06\x48\x06\x54\0" }, - { 0x0625, "\x06\x27\x06\x55\0" }, - { 0x0626, "\x06\x4a\x06\x54\0" }, - { 0x06c0, "\x06\xd5\x06\x54\0" }, - { 0x06c2, "\x06\xc1\x06\x54\0" }, - { 0x06d3, "\x06\xd2\x06\x54\0" }, - { 0x0929, "\x09\x28\x09\x3c\0" }, - { 0x0931, "\x09\x30\x09\x3c\0" }, - { 0x0934, "\x09\x33\x09\x3c\0" }, - { 0x0958, "\x09\x15\x09\x3c\0" }, - { 0x0959, "\x09\x16\x09\x3c\0" }, - { 0x095a, "\x09\x17\x09\x3c\0" }, - { 0x095b, "\x09\x1c\x09\x3c\0" }, - { 0x095c, "\x09\x21\x09\x3c\0" }, - { 0x095d, "\x09\x22\x09\x3c\0" }, - { 0x095e, "\x09\x2b\x09\x3c\0" }, - { 0x095f, "\x09\x2f\x09\x3c\0" }, - { 0x09cb, "\x09\xc7\x09\xbe\0" }, - { 0x09cc, "\x09\xc7\x09\xd7\0" }, - { 0x09dc, "\x09\xa1\x09\xbc\0" }, - { 0x09dd, "\x09\xa2\x09\xbc\0" }, - { 0x09df, "\x09\xaf\x09\xbc\0" }, - { 0x0a33, "\x0a\x32\x0a\x3c\0" }, - { 0x0a36, "\x0a\x38\x0a\x3c\0" }, - { 0x0a59, "\x0a\x16\x0a\x3c\0" }, - { 0x0a5a, "\x0a\x17\x0a\x3c\0" }, - { 0x0a5b, "\x0a\x1c\x0a\x3c\0" }, - { 0x0a5e, "\x0a\x2b\x0a\x3c\0" }, - { 0x0b48, "\x0b\x47\x0b\x56\0" }, - { 0x0b4b, "\x0b\x47\x0b\x3e\0" }, - { 0x0b4c, "\x0b\x47\x0b\x57\0" }, - { 0x0b5c, "\x0b\x21\x0b\x3c\0" }, - { 0x0b5d, "\x0b\x22\x0b\x3c\0" }, - { 0x0b94, "\x0b\x92\x0b\xd7\0" }, - { 0x0bca, "\x0b\xc6\x0b\xbe\0" }, - { 0x0bcb, "\x0b\xc7\x0b\xbe\0" }, - { 0x0bcc, "\x0b\xc6\x0b\xd7\0" }, - { 0x0c48, "\x0c\x46\x0c\x56\0" }, - { 0x0cc0, "\x0c\xbf\x0c\xd5\0" }, - { 0x0cc7, "\x0c\xc6\x0c\xd5\0" }, - { 0x0cc8, "\x0c\xc6\x0c\xd6\0" }, - { 0x0cca, "\x0c\xc6\x0c\xc2\0" }, - { 0x0ccb, "\x0c\xc6\x0c\xc2\x0c\xd5\0" }, - { 0x0d4a, "\x0d\x46\x0d\x3e\0" }, - { 0x0d4b, "\x0d\x47\x0d\x3e\0" }, - { 0x0d4c, "\x0d\x46\x0d\x57\0" }, - { 0x0dda, "\x0d\xd9\x0d\xca\0" }, - { 0x0ddc, "\x0d\xd9\x0d\xcf\0" }, - { 0x0ddd, "\x0d\xd9\x0d\xcf\x0d\xca\0" }, - { 0x0dde, "\x0d\xd9\x0d\xdf\0" }, - { 0x0f43, "\x0f\x42\x0f\xb7\0" }, - { 0x0f4d, "\x0f\x4c\x0f\xb7\0" }, - { 0x0f52, "\x0f\x51\x0f\xb7\0" }, - { 0x0f57, "\x0f\x56\x0f\xb7\0" }, - { 0x0f5c, "\x0f\x5b\x0f\xb7\0" }, - { 0x0f69, "\x0f\x40\x0f\xb5\0" }, - { 0x0f73, "\x0f\x71\x0f\x72\0" }, - { 0x0f75, "\x0f\x71\x0f\x74\0" }, - { 0x0f76, "\x0f\xb2\x0f\x80\0" }, - { 0x0f78, "\x0f\xb3\x0f\x80\0" }, - { 0x0f81, "\x0f\x71\x0f\x80\0" }, - { 0x0f93, "\x0f\x92\x0f\xb7\0" }, - { 0x0f9d, "\x0f\x9c\x0f\xb7\0" }, - { 0x0fa2, "\x0f\xa1\x0f\xb7\0" }, - { 0x0fa7, "\x0f\xa6\x0f\xb7\0" }, - { 0x0fac, "\x0f\xab\x0f\xb7\0" }, - { 0x0fb9, "\x0f\x90\x0f\xb5\0" }, - { 0x1026, "\x10\x25\x10\x2e\0" }, - { 0x1e00, "\x00\x41\x03\x25\0" }, - { 0x1e01, "\x00\x61\x03\x25\0" }, - { 0x1e02, "\x00\x42\x03\x07\0" }, - { 0x1e03, "\x00\x62\x03\x07\0" }, - { 0x1e04, "\x00\x42\x03\x23\0" }, - { 0x1e05, "\x00\x62\x03\x23\0" }, - { 0x1e06, "\x00\x42\x03\x31\0" }, - { 0x1e07, "\x00\x62\x03\x31\0" }, - { 0x1e08, "\x00\x43\x03\x27\x03\x01\0" }, - { 0x1e09, "\x00\x63\x03\x27\x03\x01\0" }, - { 0x1e0a, "\x00\x44\x03\x07\0" }, - { 0x1e0b, "\x00\x64\x03\x07\0" }, - { 0x1e0c, "\x00\x44\x03\x23\0" }, - { 0x1e0d, "\x00\x64\x03\x23\0" }, - { 0x1e0e, "\x00\x44\x03\x31\0" }, - { 0x1e0f, "\x00\x64\x03\x31\0" }, - { 0x1e10, "\x00\x44\x03\x27\0" }, - { 0x1e11, "\x00\x64\x03\x27\0" }, - { 0x1e12, "\x00\x44\x03\x2d\0" }, - { 0x1e13, "\x00\x64\x03\x2d\0" }, - { 0x1e14, "\x00\x45\x03\x04\x03\x00\0" }, - { 0x1e15, "\x00\x65\x03\x04\x03\x00\0" }, - { 0x1e16, "\x00\x45\x03\x04\x03\x01\0" }, - { 0x1e17, "\x00\x65\x03\x04\x03\x01\0" }, - { 0x1e18, "\x00\x45\x03\x2d\0" }, - { 0x1e19, "\x00\x65\x03\x2d\0" }, - { 0x1e1a, "\x00\x45\x03\x30\0" }, - { 0x1e1b, "\x00\x65\x03\x30\0" }, - { 0x1e1c, "\x00\x45\x03\x27\x03\x06\0" }, - { 0x1e1d, "\x00\x65\x03\x27\x03\x06\0" }, - { 0x1e1e, "\x00\x46\x03\x07\0" }, - { 0x1e1f, "\x00\x66\x03\x07\0" }, - { 0x1e20, "\x00\x47\x03\x04\0" }, - { 0x1e21, "\x00\x67\x03\x04\0" }, - { 0x1e22, "\x00\x48\x03\x07\0" }, - { 0x1e23, "\x00\x68\x03\x07\0" }, - { 0x1e24, "\x00\x48\x03\x23\0" }, - { 0x1e25, "\x00\x68\x03\x23\0" }, - { 0x1e26, "\x00\x48\x03\x08\0" }, - { 0x1e27, "\x00\x68\x03\x08\0" }, - { 0x1e28, "\x00\x48\x03\x27\0" }, - { 0x1e29, "\x00\x68\x03\x27\0" }, - { 0x1e2a, "\x00\x48\x03\x2e\0" }, - { 0x1e2b, "\x00\x68\x03\x2e\0" }, - { 0x1e2c, "\x00\x49\x03\x30\0" }, - { 0x1e2d, "\x00\x69\x03\x30\0" }, - { 0x1e2e, "\x00\x49\x03\x08\x03\x01\0" }, - { 0x1e2f, "\x00\x69\x03\x08\x03\x01\0" }, - { 0x1e30, "\x00\x4b\x03\x01\0" }, - { 0x1e31, "\x00\x6b\x03\x01\0" }, - { 0x1e32, "\x00\x4b\x03\x23\0" }, - { 0x1e33, "\x00\x6b\x03\x23\0" }, - { 0x1e34, "\x00\x4b\x03\x31\0" }, - { 0x1e35, "\x00\x6b\x03\x31\0" }, - { 0x1e36, "\x00\x4c\x03\x23\0" }, - { 0x1e37, "\x00\x6c\x03\x23\0" }, - { 0x1e38, "\x00\x4c\x03\x23\x03\x04\0" }, - { 0x1e39, "\x00\x6c\x03\x23\x03\x04\0" }, - { 0x1e3a, "\x00\x4c\x03\x31\0" }, - { 0x1e3b, "\x00\x6c\x03\x31\0" }, - { 0x1e3c, "\x00\x4c\x03\x2d\0" }, - { 0x1e3d, "\x00\x6c\x03\x2d\0" }, - { 0x1e3e, "\x00\x4d\x03\x01\0" }, - { 0x1e3f, "\x00\x6d\x03\x01\0" }, - { 0x1e40, "\x00\x4d\x03\x07\0" }, - { 0x1e41, "\x00\x6d\x03\x07\0" }, - { 0x1e42, "\x00\x4d\x03\x23\0" }, - { 0x1e43, "\x00\x6d\x03\x23\0" }, - { 0x1e44, "\x00\x4e\x03\x07\0" }, - { 0x1e45, "\x00\x6e\x03\x07\0" }, - { 0x1e46, "\x00\x4e\x03\x23\0" }, - { 0x1e47, "\x00\x6e\x03\x23\0" }, - { 0x1e48, "\x00\x4e\x03\x31\0" }, - { 0x1e49, "\x00\x6e\x03\x31\0" }, - { 0x1e4a, "\x00\x4e\x03\x2d\0" }, - { 0x1e4b, "\x00\x6e\x03\x2d\0" }, - { 0x1e4c, "\x00\x4f\x03\x03\x03\x01\0" }, - { 0x1e4d, "\x00\x6f\x03\x03\x03\x01\0" }, - { 0x1e4e, "\x00\x4f\x03\x03\x03\x08\0" }, - { 0x1e4f, "\x00\x6f\x03\x03\x03\x08\0" }, - { 0x1e50, "\x00\x4f\x03\x04\x03\x00\0" }, - { 0x1e51, "\x00\x6f\x03\x04\x03\x00\0" }, - { 0x1e52, "\x00\x4f\x03\x04\x03\x01\0" }, - { 0x1e53, "\x00\x6f\x03\x04\x03\x01\0" }, - { 0x1e54, "\x00\x50\x03\x01\0" }, - { 0x1e55, "\x00\x70\x03\x01\0" }, - { 0x1e56, "\x00\x50\x03\x07\0" }, - { 0x1e57, "\x00\x70\x03\x07\0" }, - { 0x1e58, "\x00\x52\x03\x07\0" }, - { 0x1e59, "\x00\x72\x03\x07\0" }, - { 0x1e5a, "\x00\x52\x03\x23\0" }, - { 0x1e5b, "\x00\x72\x03\x23\0" }, - { 0x1e5c, "\x00\x52\x03\x23\x03\x04\0" }, - { 0x1e5d, "\x00\x72\x03\x23\x03\x04\0" }, - { 0x1e5e, "\x00\x52\x03\x31\0" }, - { 0x1e5f, "\x00\x72\x03\x31\0" }, - { 0x1e60, "\x00\x53\x03\x07\0" }, - { 0x1e61, "\x00\x73\x03\x07\0" }, - { 0x1e62, "\x00\x53\x03\x23\0" }, - { 0x1e63, "\x00\x73\x03\x23\0" }, - { 0x1e64, "\x00\x53\x03\x01\x03\x07\0" }, - { 0x1e65, "\x00\x73\x03\x01\x03\x07\0" }, - { 0x1e66, "\x00\x53\x03\x0c\x03\x07\0" }, - { 0x1e67, "\x00\x73\x03\x0c\x03\x07\0" }, - { 0x1e68, "\x00\x53\x03\x23\x03\x07\0" }, - { 0x1e69, "\x00\x73\x03\x23\x03\x07\0" }, - { 0x1e6a, "\x00\x54\x03\x07\0" }, - { 0x1e6b, "\x00\x74\x03\x07\0" }, - { 0x1e6c, "\x00\x54\x03\x23\0" }, - { 0x1e6d, "\x00\x74\x03\x23\0" }, - { 0x1e6e, "\x00\x54\x03\x31\0" }, - { 0x1e6f, "\x00\x74\x03\x31\0" }, - { 0x1e70, "\x00\x54\x03\x2d\0" }, - { 0x1e71, "\x00\x74\x03\x2d\0" }, - { 0x1e72, "\x00\x55\x03\x24\0" }, - { 0x1e73, "\x00\x75\x03\x24\0" }, - { 0x1e74, "\x00\x55\x03\x30\0" }, - { 0x1e75, "\x00\x75\x03\x30\0" }, - { 0x1e76, "\x00\x55\x03\x2d\0" }, - { 0x1e77, "\x00\x75\x03\x2d\0" }, - { 0x1e78, "\x00\x55\x03\x03\x03\x01\0" }, - { 0x1e79, "\x00\x75\x03\x03\x03\x01\0" }, - { 0x1e7a, "\x00\x55\x03\x04\x03\x08\0" }, - { 0x1e7b, "\x00\x75\x03\x04\x03\x08\0" }, - { 0x1e7c, "\x00\x56\x03\x03\0" }, - { 0x1e7d, "\x00\x76\x03\x03\0" }, - { 0x1e7e, "\x00\x56\x03\x23\0" }, - { 0x1e7f, "\x00\x76\x03\x23\0" }, - { 0x1e80, "\x00\x57\x03\x00\0" }, - { 0x1e81, "\x00\x77\x03\x00\0" }, - { 0x1e82, "\x00\x57\x03\x01\0" }, - { 0x1e83, "\x00\x77\x03\x01\0" }, - { 0x1e84, "\x00\x57\x03\x08\0" }, - { 0x1e85, "\x00\x77\x03\x08\0" }, - { 0x1e86, "\x00\x57\x03\x07\0" }, - { 0x1e87, "\x00\x77\x03\x07\0" }, - { 0x1e88, "\x00\x57\x03\x23\0" }, - { 0x1e89, "\x00\x77\x03\x23\0" }, - { 0x1e8a, "\x00\x58\x03\x07\0" }, - { 0x1e8b, "\x00\x78\x03\x07\0" }, - { 0x1e8c, "\x00\x58\x03\x08\0" }, - { 0x1e8d, "\x00\x78\x03\x08\0" }, - { 0x1e8e, "\x00\x59\x03\x07\0" }, - { 0x1e8f, "\x00\x79\x03\x07\0" }, - { 0x1e90, "\x00\x5a\x03\x02\0" }, - { 0x1e91, "\x00\x7a\x03\x02\0" }, - { 0x1e92, "\x00\x5a\x03\x23\0" }, - { 0x1e93, "\x00\x7a\x03\x23\0" }, - { 0x1e94, "\x00\x5a\x03\x31\0" }, - { 0x1e95, "\x00\x7a\x03\x31\0" }, - { 0x1e96, "\x00\x68\x03\x31\0" }, - { 0x1e97, "\x00\x74\x03\x08\0" }, - { 0x1e98, "\x00\x77\x03\x0a\0" }, - { 0x1e99, "\x00\x79\x03\x0a\0" }, - { 0x1e9b, "\x01\x7f\x03\x07\0" }, - { 0x1ea0, "\x00\x41\x03\x23\0" }, - { 0x1ea1, "\x00\x61\x03\x23\0" }, - { 0x1ea2, "\x00\x41\x03\x09\0" }, - { 0x1ea3, "\x00\x61\x03\x09\0" }, - { 0x1ea4, "\x00\x41\x03\x02\x03\x01\0" }, - { 0x1ea5, "\x00\x61\x03\x02\x03\x01\0" }, - { 0x1ea6, "\x00\x41\x03\x02\x03\x00\0" }, - { 0x1ea7, "\x00\x61\x03\x02\x03\x00\0" }, - { 0x1ea8, "\x00\x41\x03\x02\x03\x09\0" }, - { 0x1ea9, "\x00\x61\x03\x02\x03\x09\0" }, - { 0x1eaa, "\x00\x41\x03\x02\x03\x03\0" }, - { 0x1eab, "\x00\x61\x03\x02\x03\x03\0" }, - { 0x1eac, "\x00\x41\x03\x23\x03\x02\0" }, - { 0x1ead, "\x00\x61\x03\x23\x03\x02\0" }, - { 0x1eae, "\x00\x41\x03\x06\x03\x01\0" }, - { 0x1eaf, "\x00\x61\x03\x06\x03\x01\0" }, - { 0x1eb0, "\x00\x41\x03\x06\x03\x00\0" }, - { 0x1eb1, "\x00\x61\x03\x06\x03\x00\0" }, - { 0x1eb2, "\x00\x41\x03\x06\x03\x09\0" }, - { 0x1eb3, "\x00\x61\x03\x06\x03\x09\0" }, - { 0x1eb4, "\x00\x41\x03\x06\x03\x03\0" }, - { 0x1eb5, "\x00\x61\x03\x06\x03\x03\0" }, - { 0x1eb6, "\x00\x41\x03\x23\x03\x06\0" }, - { 0x1eb7, "\x00\x61\x03\x23\x03\x06\0" }, - { 0x1eb8, "\x00\x45\x03\x23\0" }, - { 0x1eb9, "\x00\x65\x03\x23\0" }, - { 0x1eba, "\x00\x45\x03\x09\0" }, - { 0x1ebb, "\x00\x65\x03\x09\0" }, - { 0x1ebc, "\x00\x45\x03\x03\0" }, - { 0x1ebd, "\x00\x65\x03\x03\0" }, - { 0x1ebe, "\x00\x45\x03\x02\x03\x01\0" }, - { 0x1ebf, "\x00\x65\x03\x02\x03\x01\0" }, - { 0x1ec0, "\x00\x45\x03\x02\x03\x00\0" }, - { 0x1ec1, "\x00\x65\x03\x02\x03\x00\0" }, - { 0x1ec2, "\x00\x45\x03\x02\x03\x09\0" }, - { 0x1ec3, "\x00\x65\x03\x02\x03\x09\0" }, - { 0x1ec4, "\x00\x45\x03\x02\x03\x03\0" }, - { 0x1ec5, "\x00\x65\x03\x02\x03\x03\0" }, - { 0x1ec6, "\x00\x45\x03\x23\x03\x02\0" }, - { 0x1ec7, "\x00\x65\x03\x23\x03\x02\0" }, - { 0x1ec8, "\x00\x49\x03\x09\0" }, - { 0x1ec9, "\x00\x69\x03\x09\0" }, - { 0x1eca, "\x00\x49\x03\x23\0" }, - { 0x1ecb, "\x00\x69\x03\x23\0" }, - { 0x1ecc, "\x00\x4f\x03\x23\0" }, - { 0x1ecd, "\x00\x6f\x03\x23\0" }, - { 0x1ece, "\x00\x4f\x03\x09\0" }, - { 0x1ecf, "\x00\x6f\x03\x09\0" }, - { 0x1ed0, "\x00\x4f\x03\x02\x03\x01\0" }, - { 0x1ed1, "\x00\x6f\x03\x02\x03\x01\0" }, - { 0x1ed2, "\x00\x4f\x03\x02\x03\x00\0" }, - { 0x1ed3, "\x00\x6f\x03\x02\x03\x00\0" }, - { 0x1ed4, "\x00\x4f\x03\x02\x03\x09\0" }, - { 0x1ed5, "\x00\x6f\x03\x02\x03\x09\0" }, - { 0x1ed6, "\x00\x4f\x03\x02\x03\x03\0" }, - { 0x1ed7, "\x00\x6f\x03\x02\x03\x03\0" }, - { 0x1ed8, "\x00\x4f\x03\x23\x03\x02\0" }, - { 0x1ed9, "\x00\x6f\x03\x23\x03\x02\0" }, - { 0x1eda, "\x00\x4f\x03\x1b\x03\x01\0" }, - { 0x1edb, "\x00\x6f\x03\x1b\x03\x01\0" }, - { 0x1edc, "\x00\x4f\x03\x1b\x03\x00\0" }, - { 0x1edd, "\x00\x6f\x03\x1b\x03\x00\0" }, - { 0x1ede, "\x00\x4f\x03\x1b\x03\x09\0" }, - { 0x1edf, "\x00\x6f\x03\x1b\x03\x09\0" }, - { 0x1ee0, "\x00\x4f\x03\x1b\x03\x03\0" }, - { 0x1ee1, "\x00\x6f\x03\x1b\x03\x03\0" }, - { 0x1ee2, "\x00\x4f\x03\x1b\x03\x23\0" }, - { 0x1ee3, "\x00\x6f\x03\x1b\x03\x23\0" }, - { 0x1ee4, "\x00\x55\x03\x23\0" }, - { 0x1ee5, "\x00\x75\x03\x23\0" }, - { 0x1ee6, "\x00\x55\x03\x09\0" }, - { 0x1ee7, "\x00\x75\x03\x09\0" }, - { 0x1ee8, "\x00\x55\x03\x1b\x03\x01\0" }, - { 0x1ee9, "\x00\x75\x03\x1b\x03\x01\0" }, - { 0x1eea, "\x00\x55\x03\x1b\x03\x00\0" }, - { 0x1eeb, "\x00\x75\x03\x1b\x03\x00\0" }, - { 0x1eec, "\x00\x55\x03\x1b\x03\x09\0" }, - { 0x1eed, "\x00\x75\x03\x1b\x03\x09\0" }, - { 0x1eee, "\x00\x55\x03\x1b\x03\x03\0" }, - { 0x1eef, "\x00\x75\x03\x1b\x03\x03\0" }, - { 0x1ef0, "\x00\x55\x03\x1b\x03\x23\0" }, - { 0x1ef1, "\x00\x75\x03\x1b\x03\x23\0" }, - { 0x1ef2, "\x00\x59\x03\x00\0" }, - { 0x1ef3, "\x00\x79\x03\x00\0" }, - { 0x1ef4, "\x00\x59\x03\x23\0" }, - { 0x1ef5, "\x00\x79\x03\x23\0" }, - { 0x1ef6, "\x00\x59\x03\x09\0" }, - { 0x1ef7, "\x00\x79\x03\x09\0" }, - { 0x1ef8, "\x00\x59\x03\x03\0" }, - { 0x1ef9, "\x00\x79\x03\x03\0" }, - { 0x1f00, "\x03\xb1\x03\x13\0" }, - { 0x1f01, "\x03\xb1\x03\x14\0" }, - { 0x1f02, "\x03\xb1\x03\x13\x03\x00\0" }, - { 0x1f03, "\x03\xb1\x03\x14\x03\x00\0" }, - { 0x1f04, "\x03\xb1\x03\x13\x03\x01\0" }, - { 0x1f05, "\x03\xb1\x03\x14\x03\x01\0" }, - { 0x1f06, "\x03\xb1\x03\x13\x03\x42\0" }, - { 0x1f07, "\x03\xb1\x03\x14\x03\x42\0" }, - { 0x1f08, "\x03\x91\x03\x13\0" }, - { 0x1f09, "\x03\x91\x03\x14\0" }, - { 0x1f0a, "\x03\x91\x03\x13\x03\x00\0" }, - { 0x1f0b, "\x03\x91\x03\x14\x03\x00\0" }, - { 0x1f0c, "\x03\x91\x03\x13\x03\x01\0" }, - { 0x1f0d, "\x03\x91\x03\x14\x03\x01\0" }, - { 0x1f0e, "\x03\x91\x03\x13\x03\x42\0" }, - { 0x1f0f, "\x03\x91\x03\x14\x03\x42\0" }, - { 0x1f10, "\x03\xb5\x03\x13\0" }, - { 0x1f11, "\x03\xb5\x03\x14\0" }, - { 0x1f12, "\x03\xb5\x03\x13\x03\x00\0" }, - { 0x1f13, "\x03\xb5\x03\x14\x03\x00\0" }, - { 0x1f14, "\x03\xb5\x03\x13\x03\x01\0" }, - { 0x1f15, "\x03\xb5\x03\x14\x03\x01\0" }, - { 0x1f18, "\x03\x95\x03\x13\0" }, - { 0x1f19, "\x03\x95\x03\x14\0" }, - { 0x1f1a, "\x03\x95\x03\x13\x03\x00\0" }, - { 0x1f1b, "\x03\x95\x03\x14\x03\x00\0" }, - { 0x1f1c, "\x03\x95\x03\x13\x03\x01\0" }, - { 0x1f1d, "\x03\x95\x03\x14\x03\x01\0" }, - { 0x1f20, "\x03\xb7\x03\x13\0" }, - { 0x1f21, "\x03\xb7\x03\x14\0" }, - { 0x1f22, "\x03\xb7\x03\x13\x03\x00\0" }, - { 0x1f23, "\x03\xb7\x03\x14\x03\x00\0" }, - { 0x1f24, "\x03\xb7\x03\x13\x03\x01\0" }, - { 0x1f25, "\x03\xb7\x03\x14\x03\x01\0" }, - { 0x1f26, "\x03\xb7\x03\x13\x03\x42\0" }, - { 0x1f27, "\x03\xb7\x03\x14\x03\x42\0" }, - { 0x1f28, "\x03\x97\x03\x13\0" }, - { 0x1f29, "\x03\x97\x03\x14\0" }, - { 0x1f2a, "\x03\x97\x03\x13\x03\x00\0" }, - { 0x1f2b, "\x03\x97\x03\x14\x03\x00\0" }, - { 0x1f2c, "\x03\x97\x03\x13\x03\x01\0" }, - { 0x1f2d, "\x03\x97\x03\x14\x03\x01\0" }, - { 0x1f2e, "\x03\x97\x03\x13\x03\x42\0" }, - { 0x1f2f, "\x03\x97\x03\x14\x03\x42\0" }, - { 0x1f30, "\x03\xb9\x03\x13\0" }, - { 0x1f31, "\x03\xb9\x03\x14\0" }, - { 0x1f32, "\x03\xb9\x03\x13\x03\x00\0" }, - { 0x1f33, "\x03\xb9\x03\x14\x03\x00\0" }, - { 0x1f34, "\x03\xb9\x03\x13\x03\x01\0" }, - { 0x1f35, "\x03\xb9\x03\x14\x03\x01\0" }, - { 0x1f36, "\x03\xb9\x03\x13\x03\x42\0" }, - { 0x1f37, "\x03\xb9\x03\x14\x03\x42\0" }, - { 0x1f38, "\x03\x99\x03\x13\0" }, - { 0x1f39, "\x03\x99\x03\x14\0" }, - { 0x1f3a, "\x03\x99\x03\x13\x03\x00\0" }, - { 0x1f3b, "\x03\x99\x03\x14\x03\x00\0" }, - { 0x1f3c, "\x03\x99\x03\x13\x03\x01\0" }, - { 0x1f3d, "\x03\x99\x03\x14\x03\x01\0" }, - { 0x1f3e, "\x03\x99\x03\x13\x03\x42\0" }, - { 0x1f3f, "\x03\x99\x03\x14\x03\x42\0" }, - { 0x1f40, "\x03\xbf\x03\x13\0" }, - { 0x1f41, "\x03\xbf\x03\x14\0" }, - { 0x1f42, "\x03\xbf\x03\x13\x03\x00\0" }, - { 0x1f43, "\x03\xbf\x03\x14\x03\x00\0" }, - { 0x1f44, "\x03\xbf\x03\x13\x03\x01\0" }, - { 0x1f45, "\x03\xbf\x03\x14\x03\x01\0" }, - { 0x1f48, "\x03\x9f\x03\x13\0" }, - { 0x1f49, "\x03\x9f\x03\x14\0" }, - { 0x1f4a, "\x03\x9f\x03\x13\x03\x00\0" }, - { 0x1f4b, "\x03\x9f\x03\x14\x03\x00\0" }, - { 0x1f4c, "\x03\x9f\x03\x13\x03\x01\0" }, - { 0x1f4d, "\x03\x9f\x03\x14\x03\x01\0" }, - { 0x1f50, "\x03\xc5\x03\x13\0" }, - { 0x1f51, "\x03\xc5\x03\x14\0" }, - { 0x1f52, "\x03\xc5\x03\x13\x03\x00\0" }, - { 0x1f53, "\x03\xc5\x03\x14\x03\x00\0" }, - { 0x1f54, "\x03\xc5\x03\x13\x03\x01\0" }, - { 0x1f55, "\x03\xc5\x03\x14\x03\x01\0" }, - { 0x1f56, "\x03\xc5\x03\x13\x03\x42\0" }, - { 0x1f57, "\x03\xc5\x03\x14\x03\x42\0" }, - { 0x1f59, "\x03\xa5\x03\x14\0" }, - { 0x1f5b, "\x03\xa5\x03\x14\x03\x00\0" }, - { 0x1f5d, "\x03\xa5\x03\x14\x03\x01\0" }, - { 0x1f5f, "\x03\xa5\x03\x14\x03\x42\0" }, - { 0x1f60, "\x03\xc9\x03\x13\0" }, - { 0x1f61, "\x03\xc9\x03\x14\0" }, - { 0x1f62, "\x03\xc9\x03\x13\x03\x00\0" }, - { 0x1f63, "\x03\xc9\x03\x14\x03\x00\0" }, - { 0x1f64, "\x03\xc9\x03\x13\x03\x01\0" }, - { 0x1f65, "\x03\xc9\x03\x14\x03\x01\0" }, - { 0x1f66, "\x03\xc9\x03\x13\x03\x42\0" }, - { 0x1f67, "\x03\xc9\x03\x14\x03\x42\0" }, - { 0x1f68, "\x03\xa9\x03\x13\0" }, - { 0x1f69, "\x03\xa9\x03\x14\0" }, - { 0x1f6a, "\x03\xa9\x03\x13\x03\x00\0" }, - { 0x1f6b, "\x03\xa9\x03\x14\x03\x00\0" }, - { 0x1f6c, "\x03\xa9\x03\x13\x03\x01\0" }, - { 0x1f6d, "\x03\xa9\x03\x14\x03\x01\0" }, - { 0x1f6e, "\x03\xa9\x03\x13\x03\x42\0" }, - { 0x1f6f, "\x03\xa9\x03\x14\x03\x42\0" }, - { 0x1f70, "\x03\xb1\x03\x00\0" }, - { 0x1f71, "\x03\xb1\x03\x01\0" }, - { 0x1f72, "\x03\xb5\x03\x00\0" }, - { 0x1f73, "\x03\xb5\x03\x01\0" }, - { 0x1f74, "\x03\xb7\x03\x00\0" }, - { 0x1f75, "\x03\xb7\x03\x01\0" }, - { 0x1f76, "\x03\xb9\x03\x00\0" }, - { 0x1f77, "\x03\xb9\x03\x01\0" }, - { 0x1f78, "\x03\xbf\x03\x00\0" }, - { 0x1f79, "\x03\xbf\x03\x01\0" }, - { 0x1f7a, "\x03\xc5\x03\x00\0" }, - { 0x1f7b, "\x03\xc5\x03\x01\0" }, - { 0x1f7c, "\x03\xc9\x03\x00\0" }, - { 0x1f7d, "\x03\xc9\x03\x01\0" }, - { 0x1f80, "\x03\xb1\x03\x13\x03\x45\0" }, - { 0x1f81, "\x03\xb1\x03\x14\x03\x45\0" }, - { 0x1f82, "\x03\xb1\x03\x13\x03\x00\x03\x45\0" }, - { 0x1f83, "\x03\xb1\x03\x14\x03\x00\x03\x45\0" }, - { 0x1f84, "\x03\xb1\x03\x13\x03\x01\x03\x45\0" }, - { 0x1f85, "\x03\xb1\x03\x14\x03\x01\x03\x45\0" }, - { 0x1f86, "\x03\xb1\x03\x13\x03\x42\x03\x45\0" }, - { 0x1f87, "\x03\xb1\x03\x14\x03\x42\x03\x45\0" }, - { 0x1f88, "\x03\x91\x03\x13\x03\x45\0" }, - { 0x1f89, "\x03\x91\x03\x14\x03\x45\0" }, - { 0x1f8a, "\x03\x91\x03\x13\x03\x00\x03\x45\0" }, - { 0x1f8b, "\x03\x91\x03\x14\x03\x00\x03\x45\0" }, - { 0x1f8c, "\x03\x91\x03\x13\x03\x01\x03\x45\0" }, - { 0x1f8d, "\x03\x91\x03\x14\x03\x01\x03\x45\0" }, - { 0x1f8e, "\x03\x91\x03\x13\x03\x42\x03\x45\0" }, - { 0x1f8f, "\x03\x91\x03\x14\x03\x42\x03\x45\0" }, - { 0x1f90, "\x03\xb7\x03\x13\x03\x45\0" }, - { 0x1f91, "\x03\xb7\x03\x14\x03\x45\0" }, - { 0x1f92, "\x03\xb7\x03\x13\x03\x00\x03\x45\0" }, - { 0x1f93, "\x03\xb7\x03\x14\x03\x00\x03\x45\0" }, - { 0x1f94, "\x03\xb7\x03\x13\x03\x01\x03\x45\0" }, - { 0x1f95, "\x03\xb7\x03\x14\x03\x01\x03\x45\0" }, - { 0x1f96, "\x03\xb7\x03\x13\x03\x42\x03\x45\0" }, - { 0x1f97, "\x03\xb7\x03\x14\x03\x42\x03\x45\0" }, - { 0x1f98, "\x03\x97\x03\x13\x03\x45\0" }, - { 0x1f99, "\x03\x97\x03\x14\x03\x45\0" }, - { 0x1f9a, "\x03\x97\x03\x13\x03\x00\x03\x45\0" }, - { 0x1f9b, "\x03\x97\x03\x14\x03\x00\x03\x45\0" }, - { 0x1f9c, "\x03\x97\x03\x13\x03\x01\x03\x45\0" }, - { 0x1f9d, "\x03\x97\x03\x14\x03\x01\x03\x45\0" }, - { 0x1f9e, "\x03\x97\x03\x13\x03\x42\x03\x45\0" }, - { 0x1f9f, "\x03\x97\x03\x14\x03\x42\x03\x45\0" }, - { 0x1fa0, "\x03\xc9\x03\x13\x03\x45\0" }, - { 0x1fa1, "\x03\xc9\x03\x14\x03\x45\0" }, - { 0x1fa2, "\x03\xc9\x03\x13\x03\x00\x03\x45\0" }, - { 0x1fa3, "\x03\xc9\x03\x14\x03\x00\x03\x45\0" }, - { 0x1fa4, "\x03\xc9\x03\x13\x03\x01\x03\x45\0" }, - { 0x1fa5, "\x03\xc9\x03\x14\x03\x01\x03\x45\0" }, - { 0x1fa6, "\x03\xc9\x03\x13\x03\x42\x03\x45\0" }, - { 0x1fa7, "\x03\xc9\x03\x14\x03\x42\x03\x45\0" }, - { 0x1fa8, "\x03\xa9\x03\x13\x03\x45\0" }, - { 0x1fa9, "\x03\xa9\x03\x14\x03\x45\0" }, - { 0x1faa, "\x03\xa9\x03\x13\x03\x00\x03\x45\0" }, - { 0x1fab, "\x03\xa9\x03\x14\x03\x00\x03\x45\0" }, - { 0x1fac, "\x03\xa9\x03\x13\x03\x01\x03\x45\0" }, - { 0x1fad, "\x03\xa9\x03\x14\x03\x01\x03\x45\0" }, - { 0x1fae, "\x03\xa9\x03\x13\x03\x42\x03\x45\0" }, - { 0x1faf, "\x03\xa9\x03\x14\x03\x42\x03\x45\0" }, - { 0x1fb0, "\x03\xb1\x03\x06\0" }, - { 0x1fb1, "\x03\xb1\x03\x04\0" }, - { 0x1fb2, "\x03\xb1\x03\x00\x03\x45\0" }, - { 0x1fb3, "\x03\xb1\x03\x45\0" }, - { 0x1fb4, "\x03\xb1\x03\x01\x03\x45\0" }, - { 0x1fb6, "\x03\xb1\x03\x42\0" }, - { 0x1fb7, "\x03\xb1\x03\x42\x03\x45\0" }, - { 0x1fb8, "\x03\x91\x03\x06\0" }, - { 0x1fb9, "\x03\x91\x03\x04\0" }, - { 0x1fba, "\x03\x91\x03\x00\0" }, - { 0x1fbb, "\x03\x91\x03\x01\0" }, - { 0x1fbc, "\x03\x91\x03\x45\0" }, - { 0x1fbe, "\x03\xb9\0" }, - { 0x1fc1, "\x00\xa8\x03\x42\0" }, - { 0x1fc2, "\x03\xb7\x03\x00\x03\x45\0" }, - { 0x1fc3, "\x03\xb7\x03\x45\0" }, - { 0x1fc4, "\x03\xb7\x03\x01\x03\x45\0" }, - { 0x1fc6, "\x03\xb7\x03\x42\0" }, - { 0x1fc7, "\x03\xb7\x03\x42\x03\x45\0" }, - { 0x1fc8, "\x03\x95\x03\x00\0" }, - { 0x1fc9, "\x03\x95\x03\x01\0" }, - { 0x1fca, "\x03\x97\x03\x00\0" }, - { 0x1fcb, "\x03\x97\x03\x01\0" }, - { 0x1fcc, "\x03\x97\x03\x45\0" }, - { 0x1fcd, "\x1f\xbf\x03\x00\0" }, - { 0x1fce, "\x1f\xbf\x03\x01\0" }, - { 0x1fcf, "\x1f\xbf\x03\x42\0" }, - { 0x1fd0, "\x03\xb9\x03\x06\0" }, - { 0x1fd1, "\x03\xb9\x03\x04\0" }, - { 0x1fd2, "\x03\xb9\x03\x08\x03\x00\0" }, - { 0x1fd3, "\x03\xb9\x03\x08\x03\x01\0" }, - { 0x1fd6, "\x03\xb9\x03\x42\0" }, - { 0x1fd7, "\x03\xb9\x03\x08\x03\x42\0" }, - { 0x1fd8, "\x03\x99\x03\x06\0" }, - { 0x1fd9, "\x03\x99\x03\x04\0" }, - { 0x1fda, "\x03\x99\x03\x00\0" }, - { 0x1fdb, "\x03\x99\x03\x01\0" }, - { 0x1fdd, "\x1f\xfe\x03\x00\0" }, - { 0x1fde, "\x1f\xfe\x03\x01\0" }, - { 0x1fdf, "\x1f\xfe\x03\x42\0" }, - { 0x1fe0, "\x03\xc5\x03\x06\0" }, - { 0x1fe1, "\x03\xc5\x03\x04\0" }, - { 0x1fe2, "\x03\xc5\x03\x08\x03\x00\0" }, - { 0x1fe3, "\x03\xc5\x03\x08\x03\x01\0" }, - { 0x1fe4, "\x03\xc1\x03\x13\0" }, - { 0x1fe5, "\x03\xc1\x03\x14\0" }, - { 0x1fe6, "\x03\xc5\x03\x42\0" }, - { 0x1fe7, "\x03\xc5\x03\x08\x03\x42\0" }, - { 0x1fe8, "\x03\xa5\x03\x06\0" }, - { 0x1fe9, "\x03\xa5\x03\x04\0" }, - { 0x1fea, "\x03\xa5\x03\x00\0" }, - { 0x1feb, "\x03\xa5\x03\x01\0" }, - { 0x1fec, "\x03\xa1\x03\x14\0" }, - { 0x1fed, "\x00\xa8\x03\x00\0" }, - { 0x1fee, "\x00\xa8\x03\x01\0" }, - { 0x1fef, "\x00\x60\0" }, - { 0x1ff2, "\x03\xc9\x03\x00\x03\x45\0" }, - { 0x1ff3, "\x03\xc9\x03\x45\0" }, - { 0x1ff4, "\x03\xc9\x03\x01\x03\x45\0" }, - { 0x1ff6, "\x03\xc9\x03\x42\0" }, - { 0x1ff7, "\x03\xc9\x03\x42\x03\x45\0" }, - { 0x1ff8, "\x03\x9f\x03\x00\0" }, - { 0x1ff9, "\x03\x9f\x03\x01\0" }, - { 0x1ffa, "\x03\xa9\x03\x00\0" }, - { 0x1ffb, "\x03\xa9\x03\x01\0" }, - { 0x1ffc, "\x03\xa9\x03\x45\0" }, - { 0x1ffd, "\x00\xb4\0" }, - { 0x2000, "\x20\x02\0" }, - { 0x2001, "\x20\x03\0" }, - { 0x2126, "\x03\xa9\0" }, - { 0x212a, "\x00\x4b\0" }, - { 0x212b, "\x00\x41\x03\x0a\0" }, - { 0x219a, "\x21\x90\x03\x38\0" }, - { 0x219b, "\x21\x92\x03\x38\0" }, - { 0x21ae, "\x21\x94\x03\x38\0" }, - { 0x21cd, "\x21\xd0\x03\x38\0" }, - { 0x21ce, "\x21\xd4\x03\x38\0" }, - { 0x21cf, "\x21\xd2\x03\x38\0" }, - { 0x2204, "\x22\x03\x03\x38\0" }, - { 0x2209, "\x22\x08\x03\x38\0" }, - { 0x220c, "\x22\x0b\x03\x38\0" }, - { 0x2224, "\x22\x23\x03\x38\0" }, - { 0x2226, "\x22\x25\x03\x38\0" }, - { 0x2241, "\x22\x3c\x03\x38\0" }, - { 0x2244, "\x22\x43\x03\x38\0" }, - { 0x2247, "\x22\x45\x03\x38\0" }, - { 0x2249, "\x22\x48\x03\x38\0" }, - { 0x2260, "\x00\x3d\x03\x38\0" }, - { 0x2262, "\x22\x61\x03\x38\0" }, - { 0x226d, "\x22\x4d\x03\x38\0" }, - { 0x226e, "\x00\x3c\x03\x38\0" }, - { 0x226f, "\x00\x3e\x03\x38\0" }, - { 0x2270, "\x22\x64\x03\x38\0" }, - { 0x2271, "\x22\x65\x03\x38\0" }, - { 0x2274, "\x22\x72\x03\x38\0" }, - { 0x2275, "\x22\x73\x03\x38\0" }, - { 0x2278, "\x22\x76\x03\x38\0" }, - { 0x2279, "\x22\x77\x03\x38\0" }, - { 0x2280, "\x22\x7a\x03\x38\0" }, - { 0x2281, "\x22\x7b\x03\x38\0" }, - { 0x2284, "\x22\x82\x03\x38\0" }, - { 0x2285, "\x22\x83\x03\x38\0" }, - { 0x2288, "\x22\x86\x03\x38\0" }, - { 0x2289, "\x22\x87\x03\x38\0" }, - { 0x22ac, "\x22\xa2\x03\x38\0" }, - { 0x22ad, "\x22\xa8\x03\x38\0" }, - { 0x22ae, "\x22\xa9\x03\x38\0" }, - { 0x22af, "\x22\xab\x03\x38\0" }, - { 0x22e0, "\x22\x7c\x03\x38\0" }, - { 0x22e1, "\x22\x7d\x03\x38\0" }, - { 0x22e2, "\x22\x91\x03\x38\0" }, - { 0x22e3, "\x22\x92\x03\x38\0" }, - { 0x22ea, "\x22\xb2\x03\x38\0" }, - { 0x22eb, "\x22\xb3\x03\x38\0" }, - { 0x22ec, "\x22\xb4\x03\x38\0" }, - { 0x22ed, "\x22\xb5\x03\x38\0" }, - { 0x2329, "\x30\x08\0" }, - { 0x232a, "\x30\x09\0" }, - { 0x304c, "\x30\x4b\x30\x99\0" }, - { 0x304e, "\x30\x4d\x30\x99\0" }, - { 0x3050, "\x30\x4f\x30\x99\0" }, - { 0x3052, "\x30\x51\x30\x99\0" }, - { 0x3054, "\x30\x53\x30\x99\0" }, - { 0x3056, "\x30\x55\x30\x99\0" }, - { 0x3058, "\x30\x57\x30\x99\0" }, - { 0x305a, "\x30\x59\x30\x99\0" }, - { 0x305c, "\x30\x5b\x30\x99\0" }, - { 0x305e, "\x30\x5d\x30\x99\0" }, - { 0x3060, "\x30\x5f\x30\x99\0" }, - { 0x3062, "\x30\x61\x30\x99\0" }, - { 0x3065, "\x30\x64\x30\x99\0" }, - { 0x3067, "\x30\x66\x30\x99\0" }, - { 0x3069, "\x30\x68\x30\x99\0" }, - { 0x3070, "\x30\x6f\x30\x99\0" }, - { 0x3071, "\x30\x6f\x30\x9a\0" }, - { 0x3073, "\x30\x72\x30\x99\0" }, - { 0x3074, "\x30\x72\x30\x9a\0" }, - { 0x3076, "\x30\x75\x30\x99\0" }, - { 0x3077, "\x30\x75\x30\x9a\0" }, - { 0x3079, "\x30\x78\x30\x99\0" }, - { 0x307a, "\x30\x78\x30\x9a\0" }, - { 0x307c, "\x30\x7b\x30\x99\0" }, - { 0x307d, "\x30\x7b\x30\x9a\0" }, - { 0x3094, "\x30\x46\x30\x99\0" }, - { 0x309e, "\x30\x9d\x30\x99\0" }, - { 0x30ac, "\x30\xab\x30\x99\0" }, - { 0x30ae, "\x30\xad\x30\x99\0" }, - { 0x30b0, "\x30\xaf\x30\x99\0" }, - { 0x30b2, "\x30\xb1\x30\x99\0" }, - { 0x30b4, "\x30\xb3\x30\x99\0" }, - { 0x30b6, "\x30\xb5\x30\x99\0" }, - { 0x30b8, "\x30\xb7\x30\x99\0" }, - { 0x30ba, "\x30\xb9\x30\x99\0" }, - { 0x30bc, "\x30\xbb\x30\x99\0" }, - { 0x30be, "\x30\xbd\x30\x99\0" }, - { 0x30c0, "\x30\xbf\x30\x99\0" }, - { 0x30c2, "\x30\xc1\x30\x99\0" }, - { 0x30c5, "\x30\xc4\x30\x99\0" }, - { 0x30c7, "\x30\xc6\x30\x99\0" }, - { 0x30c9, "\x30\xc8\x30\x99\0" }, - { 0x30d0, "\x30\xcf\x30\x99\0" }, - { 0x30d1, "\x30\xcf\x30\x9a\0" }, - { 0x30d3, "\x30\xd2\x30\x99\0" }, - { 0x30d4, "\x30\xd2\x30\x9a\0" }, - { 0x30d6, "\x30\xd5\x30\x99\0" }, - { 0x30d7, "\x30\xd5\x30\x9a\0" }, - { 0x30d9, "\x30\xd8\x30\x99\0" }, - { 0x30da, "\x30\xd8\x30\x9a\0" }, - { 0x30dc, "\x30\xdb\x30\x99\0" }, - { 0x30dd, "\x30\xdb\x30\x9a\0" }, - { 0x30f4, "\x30\xa6\x30\x99\0" }, - { 0x30f7, "\x30\xef\x30\x99\0" }, - { 0x30f8, "\x30\xf0\x30\x99\0" }, - { 0x30f9, "\x30\xf1\x30\x99\0" }, - { 0x30fa, "\x30\xf2\x30\x99\0" }, - { 0x30fe, "\x30\xfd\x30\x99\0" }, - { 0xf900, "\x8c\x48\0" }, - { 0xf901, "\x66\xf4\0" }, - { 0xf902, "\x8e\xca\0" }, - { 0xf903, "\x8c\xc8\0" }, - { 0xf904, "\x6e\xd1\0" }, - { 0xf905, "\x4e\x32\0" }, - { 0xf906, "\x53\xe5\0" }, - { 0xf907, "\x9f\x9c\0" }, - { 0xf908, "\x9f\x9c\0" }, - { 0xf909, "\x59\x51\0" }, - { 0xf90a, "\x91\xd1\0" }, - { 0xf90b, "\x55\x87\0" }, - { 0xf90c, "\x59\x48\0" }, - { 0xf90d, "\x61\xf6\0" }, - { 0xf90e, "\x76\x69\0" }, - { 0xf90f, "\x7f\x85\0" }, - { 0xf910, "\x86\x3f\0" }, - { 0xf911, "\x87\xba\0" }, - { 0xf912, "\x88\xf8\0" }, - { 0xf913, "\x90\x8f\0" }, - { 0xf914, "\x6a\x02\0" }, - { 0xf915, "\x6d\x1b\0" }, - { 0xf916, "\x70\xd9\0" }, - { 0xf917, "\x73\xde\0" }, - { 0xf918, "\x84\x3d\0" }, - { 0xf919, "\x91\x6a\0" }, - { 0xf91a, "\x99\xf1\0" }, - { 0xf91b, "\x4e\x82\0" }, - { 0xf91c, "\x53\x75\0" }, - { 0xf91d, "\x6b\x04\0" }, - { 0xf91e, "\x72\x1b\0" }, - { 0xf91f, "\x86\x2d\0" }, - { 0xf920, "\x9e\x1e\0" }, - { 0xf921, "\x5d\x50\0" }, - { 0xf922, "\x6f\xeb\0" }, - { 0xf923, "\x85\xcd\0" }, - { 0xf924, "\x89\x64\0" }, - { 0xf925, "\x62\xc9\0" }, - { 0xf926, "\x81\xd8\0" }, - { 0xf927, "\x88\x1f\0" }, - { 0xf928, "\x5e\xca\0" }, - { 0xf929, "\x67\x17\0" }, - { 0xf92a, "\x6d\x6a\0" }, - { 0xf92b, "\x72\xfc\0" }, - { 0xf92c, "\x90\xce\0" }, - { 0xf92d, "\x4f\x86\0" }, - { 0xf92e, "\x51\xb7\0" }, - { 0xf92f, "\x52\xde\0" }, - { 0xf930, "\x64\xc4\0" }, - { 0xf931, "\x6a\xd3\0" }, - { 0xf932, "\x72\x10\0" }, - { 0xf933, "\x76\xe7\0" }, - { 0xf934, "\x80\x01\0" }, - { 0xf935, "\x86\x06\0" }, - { 0xf936, "\x86\x5c\0" }, - { 0xf937, "\x8d\xef\0" }, - { 0xf938, "\x97\x32\0" }, - { 0xf939, "\x9b\x6f\0" }, - { 0xf93a, "\x9d\xfa\0" }, - { 0xf93b, "\x78\x8c\0" }, - { 0xf93c, "\x79\x7f\0" }, - { 0xf93d, "\x7d\xa0\0" }, - { 0xf93e, "\x83\xc9\0" }, - { 0xf93f, "\x93\x04\0" }, - { 0xf940, "\x9e\x7f\0" }, - { 0xf941, "\x8a\xd6\0" }, - { 0xf942, "\x58\xdf\0" }, - { 0xf943, "\x5f\x04\0" }, - { 0xf944, "\x7c\x60\0" }, - { 0xf945, "\x80\x7e\0" }, - { 0xf946, "\x72\x62\0" }, - { 0xf947, "\x78\xca\0" }, - { 0xf948, "\x8c\xc2\0" }, - { 0xf949, "\x96\xf7\0" }, - { 0xf94a, "\x58\xd8\0" }, - { 0xf94b, "\x5c\x62\0" }, - { 0xf94c, "\x6a\x13\0" }, - { 0xf94d, "\x6d\xda\0" }, - { 0xf94e, "\x6f\x0f\0" }, - { 0xf94f, "\x7d\x2f\0" }, - { 0xf950, "\x7e\x37\0" }, - { 0xf951, "\x96\xfb\0" }, - { 0xf952, "\x52\xd2\0" }, - { 0xf953, "\x80\x8b\0" }, - { 0xf954, "\x51\xdc\0" }, - { 0xf955, "\x51\xcc\0" }, - { 0xf956, "\x7a\x1c\0" }, - { 0xf957, "\x7d\xbe\0" }, - { 0xf958, "\x83\xf1\0" }, - { 0xf959, "\x96\x75\0" }, - { 0xf95a, "\x8b\x80\0" }, - { 0xf95b, "\x62\xcf\0" }, - { 0xf95c, "\x6a\x02\0" }, - { 0xf95d, "\x8a\xfe\0" }, - { 0xf95e, "\x4e\x39\0" }, - { 0xf95f, "\x5b\xe7\0" }, - { 0xf960, "\x60\x12\0" }, - { 0xf961, "\x73\x87\0" }, - { 0xf962, "\x75\x70\0" }, - { 0xf963, "\x53\x17\0" }, - { 0xf964, "\x78\xfb\0" }, - { 0xf965, "\x4f\xbf\0" }, - { 0xf966, "\x5f\xa9\0" }, - { 0xf967, "\x4e\x0d\0" }, - { 0xf968, "\x6c\xcc\0" }, - { 0xf969, "\x65\x78\0" }, - { 0xf96a, "\x7d\x22\0" }, - { 0xf96b, "\x53\xc3\0" }, - { 0xf96c, "\x58\x5e\0" }, - { 0xf96d, "\x77\x01\0" }, - { 0xf96e, "\x84\x49\0" }, - { 0xf96f, "\x8a\xaa\0" }, - { 0xf970, "\x6b\xba\0" }, - { 0xf971, "\x8f\xb0\0" }, - { 0xf972, "\x6c\x88\0" }, - { 0xf973, "\x62\xfe\0" }, - { 0xf974, "\x82\xe5\0" }, - { 0xf975, "\x63\xa0\0" }, - { 0xf976, "\x75\x65\0" }, - { 0xf977, "\x4e\xae\0" }, - { 0xf978, "\x51\x69\0" }, - { 0xf979, "\x51\xc9\0" }, - { 0xf97a, "\x68\x81\0" }, - { 0xf97b, "\x7c\xe7\0" }, - { 0xf97c, "\x82\x6f\0" }, - { 0xf97d, "\x8a\xd2\0" }, - { 0xf97e, "\x91\xcf\0" }, - { 0xf97f, "\x52\xf5\0" }, - { 0xf980, "\x54\x42\0" }, - { 0xf981, "\x59\x73\0" }, - { 0xf982, "\x5e\xec\0" }, - { 0xf983, "\x65\xc5\0" }, - { 0xf984, "\x6f\xfe\0" }, - { 0xf985, "\x79\x2a\0" }, - { 0xf986, "\x95\xad\0" }, - { 0xf987, "\x9a\x6a\0" }, - { 0xf988, "\x9e\x97\0" }, - { 0xf989, "\x9e\xce\0" }, - { 0xf98a, "\x52\x9b\0" }, - { 0xf98b, "\x66\xc6\0" }, - { 0xf98c, "\x6b\x77\0" }, - { 0xf98d, "\x8f\x62\0" }, - { 0xf98e, "\x5e\x74\0" }, - { 0xf98f, "\x61\x90\0" }, - { 0xf990, "\x62\x00\0" }, - { 0xf991, "\x64\x9a\0" }, - { 0xf992, "\x6f\x23\0" }, - { 0xf993, "\x71\x49\0" }, - { 0xf994, "\x74\x89\0" }, - { 0xf995, "\x79\xca\0" }, - { 0xf996, "\x7d\xf4\0" }, - { 0xf997, "\x80\x6f\0" }, - { 0xf998, "\x8f\x26\0" }, - { 0xf999, "\x84\xee\0" }, - { 0xf99a, "\x90\x23\0" }, - { 0xf99b, "\x93\x4a\0" }, - { 0xf99c, "\x52\x17\0" }, - { 0xf99d, "\x52\xa3\0" }, - { 0xf99e, "\x54\xbd\0" }, - { 0xf99f, "\x70\xc8\0" }, - { 0xf9a0, "\x88\xc2\0" }, - { 0xf9a1, "\x8a\xaa\0" }, - { 0xf9a2, "\x5e\xc9\0" }, - { 0xf9a3, "\x5f\xf5\0" }, - { 0xf9a4, "\x63\x7b\0" }, - { 0xf9a5, "\x6b\xae\0" }, - { 0xf9a6, "\x7c\x3e\0" }, - { 0xf9a7, "\x73\x75\0" }, - { 0xf9a8, "\x4e\xe4\0" }, - { 0xf9a9, "\x56\xf9\0" }, - { 0xf9aa, "\x5b\xe7\0" }, - { 0xf9ab, "\x5d\xba\0" }, - { 0xf9ac, "\x60\x1c\0" }, - { 0xf9ad, "\x73\xb2\0" }, - { 0xf9ae, "\x74\x69\0" }, - { 0xf9af, "\x7f\x9a\0" }, - { 0xf9b0, "\x80\x46\0" }, - { 0xf9b1, "\x92\x34\0" }, - { 0xf9b2, "\x96\xf6\0" }, - { 0xf9b3, "\x97\x48\0" }, - { 0xf9b4, "\x98\x18\0" }, - { 0xf9b5, "\x4f\x8b\0" }, - { 0xf9b6, "\x79\xae\0" }, - { 0xf9b7, "\x91\xb4\0" }, - { 0xf9b8, "\x96\xb8\0" }, - { 0xf9b9, "\x60\xe1\0" }, - { 0xf9ba, "\x4e\x86\0" }, - { 0xf9bb, "\x50\xda\0" }, - { 0xf9bc, "\x5b\xee\0" }, - { 0xf9bd, "\x5c\x3f\0" }, - { 0xf9be, "\x65\x99\0" }, - { 0xf9bf, "\x6a\x02\0" }, - { 0xf9c0, "\x71\xce\0" }, - { 0xf9c1, "\x76\x42\0" }, - { 0xf9c2, "\x84\xfc\0" }, - { 0xf9c3, "\x90\x7c\0" }, - { 0xf9c4, "\x9f\x8d\0" }, - { 0xf9c5, "\x66\x88\0" }, - { 0xf9c6, "\x96\x2e\0" }, - { 0xf9c7, "\x52\x89\0" }, - { 0xf9c8, "\x67\x7b\0" }, - { 0xf9c9, "\x67\xf3\0" }, - { 0xf9ca, "\x6d\x41\0" }, - { 0xf9cb, "\x6e\x9c\0" }, - { 0xf9cc, "\x74\x09\0" }, - { 0xf9cd, "\x75\x59\0" }, - { 0xf9ce, "\x78\x6b\0" }, - { 0xf9cf, "\x7d\x10\0" }, - { 0xf9d0, "\x98\x5e\0" }, - { 0xf9d1, "\x51\x6d\0" }, - { 0xf9d2, "\x62\x2e\0" }, - { 0xf9d3, "\x96\x78\0" }, - { 0xf9d4, "\x50\x2b\0" }, - { 0xf9d5, "\x5d\x19\0" }, - { 0xf9d6, "\x6d\xea\0" }, - { 0xf9d7, "\x8f\x2a\0" }, - { 0xf9d8, "\x5f\x8b\0" }, - { 0xf9d9, "\x61\x44\0" }, - { 0xf9da, "\x68\x17\0" }, - { 0xf9db, "\x73\x87\0" }, - { 0xf9dc, "\x96\x86\0" }, - { 0xf9dd, "\x52\x29\0" }, - { 0xf9de, "\x54\x0f\0" }, - { 0xf9df, "\x5c\x65\0" }, - { 0xf9e0, "\x66\x13\0" }, - { 0xf9e1, "\x67\x4e\0" }, - { 0xf9e2, "\x68\xa8\0" }, - { 0xf9e3, "\x6c\xe5\0" }, - { 0xf9e4, "\x74\x06\0" }, - { 0xf9e5, "\x75\xe2\0" }, - { 0xf9e6, "\x7f\x79\0" }, - { 0xf9e7, "\x88\xcf\0" }, - { 0xf9e8, "\x88\xe1\0" }, - { 0xf9e9, "\x91\xcc\0" }, - { 0xf9ea, "\x96\xe2\0" }, - { 0xf9eb, "\x53\x3f\0" }, - { 0xf9ec, "\x6e\xba\0" }, - { 0xf9ed, "\x54\x1d\0" }, - { 0xf9ee, "\x71\xd0\0" }, - { 0xf9ef, "\x74\x98\0" }, - { 0xf9f0, "\x85\xfa\0" }, - { 0xf9f1, "\x96\xa3\0" }, - { 0xf9f2, "\x9c\x57\0" }, - { 0xf9f3, "\x9e\x9f\0" }, - { 0xf9f4, "\x67\x97\0" }, - { 0xf9f5, "\x6d\xcb\0" }, - { 0xf9f6, "\x81\xe8\0" }, - { 0xf9f7, "\x7a\xcb\0" }, - { 0xf9f8, "\x7b\x20\0" }, - { 0xf9f9, "\x7c\x92\0" }, - { 0xf9fa, "\x72\xc0\0" }, - { 0xf9fb, "\x70\x99\0" }, - { 0xf9fc, "\x8b\x58\0" }, - { 0xf9fd, "\x4e\xc0\0" }, - { 0xf9fe, "\x83\x36\0" }, - { 0xf9ff, "\x52\x3a\0" }, - { 0xfa00, "\x52\x07\0" }, - { 0xfa01, "\x5e\xa6\0" }, - { 0xfa02, "\x62\xd3\0" }, - { 0xfa03, "\x7c\xd6\0" }, - { 0xfa04, "\x5b\x85\0" }, - { 0xfa05, "\x6d\x1e\0" }, - { 0xfa06, "\x66\xb4\0" }, - { 0xfa07, "\x8f\x3b\0" }, - { 0xfa08, "\x88\x4c\0" }, - { 0xfa09, "\x96\x4d\0" }, - { 0xfa0a, "\x89\x8b\0" }, - { 0xfa0b, "\x5e\xd3\0" }, - { 0xfa0c, "\x51\x40\0" }, - { 0xfa0d, "\x55\xc0\0" }, - { 0xfa10, "\x58\x5a\0" }, - { 0xfa12, "\x66\x74\0" }, - { 0xfa15, "\x51\xde\0" }, - { 0xfa16, "\x73\x2a\0" }, - { 0xfa17, "\x76\xca\0" }, - { 0xfa18, "\x79\x3c\0" }, - { 0xfa19, "\x79\x5e\0" }, - { 0xfa1a, "\x79\x65\0" }, - { 0xfa1b, "\x79\x8f\0" }, - { 0xfa1c, "\x97\x56\0" }, - { 0xfa1d, "\x7c\xbe\0" }, - { 0xfa1e, "\x7f\xbd\0" }, - { 0xfa20, "\x86\x12\0" }, - { 0xfa22, "\x8a\xf8\0" }, - { 0xfa25, "\x90\x38\0" }, - { 0xfa26, "\x90\xfd\0" }, - { 0xfa2a, "\x98\xef\0" }, - { 0xfa2b, "\x98\xfc\0" }, - { 0xfa2c, "\x99\x28\0" }, - { 0xfa2d, "\x9d\xb4\0" }, - { 0xfb1d, "\x05\xd9\x05\xb4\0" }, - { 0xfb1f, "\x05\xf2\x05\xb7\0" }, - { 0xfb2a, "\x05\xe9\x05\xc1\0" }, - { 0xfb2b, "\x05\xe9\x05\xc2\0" }, - { 0xfb2c, "\x05\xe9\x05\xbc\x05\xc1\0" }, - { 0xfb2d, "\x05\xe9\x05\xbc\x05\xc2\0" }, - { 0xfb2e, "\x05\xd0\x05\xb7\0" }, - { 0xfb2f, "\x05\xd0\x05\xb8\0" }, - { 0xfb30, "\x05\xd0\x05\xbc\0" }, - { 0xfb31, "\x05\xd1\x05\xbc\0" }, - { 0xfb32, "\x05\xd2\x05\xbc\0" }, - { 0xfb33, "\x05\xd3\x05\xbc\0" }, - { 0xfb34, "\x05\xd4\x05\xbc\0" }, - { 0xfb35, "\x05\xd5\x05\xbc\0" }, - { 0xfb36, "\x05\xd6\x05\xbc\0" }, - { 0xfb38, "\x05\xd8\x05\xbc\0" }, - { 0xfb39, "\x05\xd9\x05\xbc\0" }, - { 0xfb3a, "\x05\xda\x05\xbc\0" }, - { 0xfb3b, "\x05\xdb\x05\xbc\0" }, - { 0xfb3c, "\x05\xdc\x05\xbc\0" }, - { 0xfb3e, "\x05\xde\x05\xbc\0" }, - { 0xfb40, "\x05\xe0\x05\xbc\0" }, - { 0xfb41, "\x05\xe1\x05\xbc\0" }, - { 0xfb43, "\x05\xe3\x05\xbc\0" }, - { 0xfb44, "\x05\xe4\x05\xbc\0" }, - { 0xfb46, "\x05\xe6\x05\xbc\0" }, - { 0xfb47, "\x05\xe7\x05\xbc\0" }, - { 0xfb48, "\x05\xe8\x05\xbc\0" }, - { 0xfb49, "\x05\xe9\x05\xbc\0" }, - { 0xfb4a, "\x05\xea\x05\xbc\0" }, - { 0xfb4b, "\x05\xd5\x05\xb9\0" }, - { 0xfb4c, "\x05\xd1\x05\xbf\0" }, - { 0xfb4d, "\x05\xdb\x05\xbf\0" }, - { 0xfb4e, "\x05\xe4\x05\xbf\0" } -}; - -#endif /* DECOMP_H */ diff --git a/guniprop.c b/guniprop.c deleted file mode 100644 index 6b706b13..00000000 --- a/guniprop.c +++ /dev/null @@ -1,471 +0,0 @@ -/* guniprop.c - Unicode character properties. - * - * Copyright (C) 1999 Tom Tromey - * Copyright (C) 2000 Red Hat, Inc. - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "glib.h" -#include "gunichartables.h" - -#include - -#include - -#define asize(x) ((sizeof (x)) / sizeof (x[0])) - -#define ATTTABLE(Page, Char) \ - ((attr_table[Page] == 0) ? 0 : (attr_table[Page][Char])) - -/* We cheat a bit and cast type values to (char *). We detect these - using the &0xff trick. */ -#define TTYPE(Page, Char) \ - (((GPOINTER_TO_INT(type_table[Page]) & 0xff) == GPOINTER_TO_INT(type_table[Page])) \ - ? GPOINTER_TO_INT(type_table[Page]) \ - : (type_table[Page][Char])) - -#define TYPE(Char) (((Char) > (G_UNICODE_LAST_CHAR)) ? G_UNICODE_UNASSIGNED : TTYPE ((Char) >> 8, (Char) & 0xff)) - -#define ISDIGIT(Type) ((Type) == G_UNICODE_DECIMAL_NUMBER \ - || (Type) == G_UNICODE_LETTER_NUMBER \ - || (Type) == G_UNICODE_OTHER_NUMBER) - -#define ISALPHA(Type) ((Type) == G_UNICODE_LOWERCASE_LETTER \ - || (Type) == G_UNICODE_UPPERCASE_LETTER \ - || (Type) == G_UNICODE_TITLECASE_LETTER \ - || (Type) == G_UNICODE_MODIFIER_LETTER \ - || (Type) == G_UNICODE_OTHER_LETTER) - -/** - * g_unichar_isalnum: - * @c: a Unicode character - * - * Determines whether a character is alphanumeric. - * Given some UTF-8 text, obtain a character value - * with g_utf8_get_char(). - * - * Return value: %TRUE if @c is an alphanumeric character - **/ -gboolean -g_unichar_isalnum (gunichar c) -{ - int t = TYPE (c); - return ISDIGIT (t) || ISALPHA (t); -} - -/** - * g_unichar_isalpha: - * @c: a Unicode character - * - * Determines whether a character is alphabetic (i.e. a letter). - * Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is an alphabetic character - **/ -gboolean -g_unichar_isalpha (gunichar c) -{ - int t = TYPE (c); - return ISALPHA (t); -} - - -/** - * g_unichar_iscntrl: - * @c: a Unicode character - * - * Determines whether a character is a control character. - * Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is a control character - **/ -gboolean -g_unichar_iscntrl (gunichar c) -{ - return TYPE (c) == G_UNICODE_CONTROL; -} - -/** - * g_unichar_isdigit: - * @c: a Unicode character - * - * Determines whether a character is numeric (i.e. a digit). This - * covers ASCII 0-9 and also digits in other languages/scripts. Given - * some UTF-8 text, obtain a character value with g_utf8_get_char(). - * - * Return value: %TRUE if @c is a digit - **/ -gboolean -g_unichar_isdigit (gunichar c) -{ - return TYPE (c) == G_UNICODE_DECIMAL_NUMBER; -} - - -/** - * g_unichar_isgraph: - * @c: a Unicode character - * - * Determines whether a character is printable and not a space - * (returns %FALSE for control characters, format characters, and - * spaces). g_unichar_isprint() is similar, but returns %TRUE for - * spaces. Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is printable unless it's a space - **/ -gboolean -g_unichar_isgraph (gunichar c) -{ - int t = TYPE (c); - return (t != G_UNICODE_CONTROL - && t != G_UNICODE_FORMAT - && t != G_UNICODE_UNASSIGNED - && t != G_UNICODE_PRIVATE_USE - && t != G_UNICODE_SURROGATE - && t != G_UNICODE_SPACE_SEPARATOR); -} - -/** - * g_unichar_islower: - * @c: a Unicode character - * - * Determines whether a character is a lowercase letter. - * Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is a lowercase letter - **/ -gboolean -g_unichar_islower (gunichar c) -{ - return TYPE (c) == G_UNICODE_LOWERCASE_LETTER; -} - - -/** - * g_unichar_isprint: - * @c: a Unicode character - * - * Determines whether a character is printable. - * Unlike g_unichar_isgraph(), returns %TRUE for spaces. - * Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is printable - **/ -gboolean -g_unichar_isprint (gunichar c) -{ - int t = TYPE (c); - return (t != G_UNICODE_CONTROL - && t != G_UNICODE_FORMAT - && t != G_UNICODE_UNASSIGNED - && t != G_UNICODE_PRIVATE_USE - && t != G_UNICODE_SURROGATE); -} - -/** - * g_unichar_ispunct: - * @c: a Unicode character - * - * Determines whether a character is punctuation. - * Given some UTF-8 text, obtain a character value with - * g_utf8_get_char(). - * - * Return value: %TRUE if @c is a punctuation character - **/ -gboolean -g_unichar_ispunct (gunichar c) -{ - int t = TYPE (c); - return (t == G_UNICODE_CONNECT_PUNCTUATION || t == G_UNICODE_DASH_PUNCTUATION - || t == G_UNICODE_CLOSE_PUNCTUATION || t == G_UNICODE_FINAL_PUNCTUATION - || t == G_UNICODE_INITIAL_PUNCTUATION || t == G_UNICODE_OTHER_PUNCTUATION - || t == G_UNICODE_OPEN_PUNCTUATION); -} - -/** - * g_unichar_isspace: - * @c: a Unicode character - * - * Determines whether a character is a space, tab, or line separator - * (newline, carriage return, etc.). Given some UTF-8 text, obtain a - * character value with g_utf8_get_char(). - * - * (Note: don't use this to do word breaking; you have to use - * Pango or equivalent to get word breaking right, the algorithm - * is fairly complex.) - * - * Return value: %TRUE if @c is a punctuation character - **/ -gboolean -g_unichar_isspace (gunichar c) -{ - switch (c) - { - /* special-case these since Unicode thinks they are not spaces */ - case '\t': - case '\n': - case '\r': - case '\f': - case '\v': /* vertical tab - as if anyone has ever used this... */ - return TRUE; - break; - - default: - { - int t = TYPE (c); - return (t == G_UNICODE_SPACE_SEPARATOR || t == G_UNICODE_LINE_SEPARATOR - || t == G_UNICODE_PARAGRAPH_SEPARATOR); - } - break; - } -} - -/** - * g_unichar_isupper: - * @c: a unicode character - * - * Determines if a character is uppercase. - * - * Return value: %TRUE if @c is an uppercase character. - **/ -gboolean -g_unichar_isupper (gunichar c) -{ - return TYPE (c) == G_UNICODE_UPPERCASE_LETTER; -} - -/** - * g_unichar_istitle: - * @c: a unicode character - * - * Determines if a character is titlecase. Some characters in - * Unicode which are composites, such as the DZ digraph - * have three case variants instead of just two. The titlecase - * form is used at the beginning of a word where only the - * first letter is capitalized. The titlecase form of the DZ - * digraph is U+01F2 LATIN CAPITAL LETTTER D WITH SMALL LETTER Z - * - * Return value: %TRUE if the character is titlecase. - **/ -gboolean -g_unichar_istitle (gunichar c) -{ - unsigned int i; - for (i = 0; i < asize (title_table); ++i) - if (title_table[i][0] == c) - return 1; - return 0; -} - -/** - * g_unichar_isxdigit: - * @c: a unicode character. - * - * Determines if a characters is a hexidecimal digit - * - * Return value: %TRUE if the character is a hexadecimal digit. - **/ -gboolean -g_unichar_isxdigit (gunichar c) -{ - int t = TYPE (c); - return ((c >= 'a' && c <= 'f') - || (c >= 'A' && c <= 'F') - || ISDIGIT (t)); -} - -/** - * g_unichar_isdefined: - * @c: a unicode character - * - * Determines if a given character is assigned in the Unicode - * standard. - * - * Return value: %TRUE if the character has an assigned value. - **/ -gboolean -g_unichar_isdefined (gunichar c) -{ - int t = TYPE (c); - return t != G_UNICODE_UNASSIGNED; -} - -/** - * g_unichar_iswide: - * @c: a unicode character - * - * Determines if a character is typically rendered in a double-width - * cell. - * - * Return value: %TRUE if the character is wide. - **/ -/* This function stolen from Markus Kuhn . */ -gboolean -g_unichar_iswide (gunichar c) -{ - if (c < 0x1100) - return 0; - - return ((c >= 0x1100 && c <= 0x115f) /* Hangul Jamo */ - || (c >= 0x2e80 && c <= 0xa4cf && (c & ~0x0011) != 0x300a && - c != 0x303f) /* CJK ... Yi */ - || (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */ - || (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility Ideographs */ - || (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */ - || (c >= 0xff00 && c <= 0xff5f) /* Fullwidth Forms */ - || (c >= 0xffe0 && c <= 0xffe6)); -} - -/** - * g_unichar_toupper: - * @c: a unicode character - * - * Convert a character to uppercase. - * - * Return value: the result of converting @c to uppercase. - * If @c is not an lowercase or titlecase character, - * @c is returned unchanged. - **/ -gunichar -g_unichar_toupper (gunichar c) -{ - int t = TYPE (c); - if (t == G_UNICODE_LOWERCASE_LETTER) - return ATTTABLE (c >> 8, c & 0xff); - else if (t == G_UNICODE_TITLECASE_LETTER) - { - unsigned int i; - for (i = 0; i < asize (title_table); ++i) - { - if (title_table[i][0] == c) - return title_table[i][1]; - } - } - return c; -} - -/** - * g_unichar_tolower: - * @c: a unicode character. - * - * Convert a character to lower case - * - * Return value: the result of converting @c to lower case. - * If @c is not an upperlower or titlecase character, - * @c is returned unchanged. - **/ -gunichar -g_unichar_tolower (gunichar c) -{ - int t = TYPE (c); - if (t == G_UNICODE_UPPERCASE_LETTER) - return ATTTABLE (c >> 8, c & 0xff); - else if (t == G_UNICODE_TITLECASE_LETTER) - { - unsigned int i; - for (i = 0; i < asize (title_table); ++i) - { - if (title_table[i][0] == c) - return title_table[i][2]; - } - } - return c; -} - -/** - * g_unichar_totitle: - * @c: a unicode character - * - * Convert a character to the titlecase - * - * Return value: the result of converting @c to titlecase. - * If @c is not an uppercase or lowercase character, - * @c is returned unchanged. - **/ -gunichar -g_unichar_totitle (gunichar c) -{ - unsigned int i; - for (i = 0; i < asize (title_table); ++i) - { - if (title_table[i][0] == c || title_table[i][1] == c - || title_table[i][2] == c) - return title_table[i][0]; - } - return (TYPE (c) == G_UNICODE_LOWERCASE_LETTER - ? ATTTABLE (c >> 8, c & 0xff) - : c); -} - -/** - * g_unichar_digit_value: - * @c: a unicode character - * - * Determines the numeric value of a character as a decimal - * degital. - * - * Return value: If @c is a decimal digit (according to - * `g_unichar_isdigit'), its numeric value. Otherwise, -1. - **/ -int -g_unichar_digit_value (gunichar c) -{ - if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) - return ATTTABLE (c >> 8, c & 0xff); - return -1; -} - -/** - * g_unichar_xdigit_value: - * @c: a unicode character - * - * Determines the numeric value of a character as a hexidecimal - * degital. - * - * Return value: If @c is a hex digit (according to - * `g_unichar_isxdigit'), its numeric value. Otherwise, -1. - **/ -int -g_unichar_xdigit_value (gunichar c) -{ - if (c >= 'A' && c <= 'F') - return c - 'A' + 1; - if (c >= 'a' && c <= 'f') - return c - 'a' + 1; - if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) - return ATTTABLE (c >> 8, c & 0xff); - return -1; -} - -/** - * g_unichar_type: - * @c: a unicode character - * - * Classifies a unicode character by type. - * - * Return value: the type of the character. - **/ -GUnicodeType -g_unichar_type (gunichar c) -{ - return TYPE (c); -} diff --git a/gutf8.c b/gutf8.c deleted file mode 100644 index d1863e92..00000000 --- a/gutf8.c +++ /dev/null @@ -1,1482 +0,0 @@ -/* gutf8.c - Operations on UTF-8 strings. - * - * Copyright (C) 1999 Tom Tromey - * Copyright (C) 2000 Red Hat, Inc. - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#include -#ifdef HAVE_CODESET -#include -#endif -#include - -#include "glib.h" - -#ifdef G_PLATFORM_WIN32 -#include -#define STRICT -#include -#undef STRICT -#endif - -#include "glibintl.h" - -#define UTF8_COMPUTE(Char, Mask, Len) \ - if (Char < 128) \ - { \ - Len = 1; \ - Mask = 0x7f; \ - } \ - else if ((Char & 0xe0) == 0xc0) \ - { \ - Len = 2; \ - Mask = 0x1f; \ - } \ - else if ((Char & 0xf0) == 0xe0) \ - { \ - Len = 3; \ - Mask = 0x0f; \ - } \ - else if ((Char & 0xf8) == 0xf0) \ - { \ - Len = 4; \ - Mask = 0x07; \ - } \ - else if ((Char & 0xfc) == 0xf8) \ - { \ - Len = 5; \ - Mask = 0x03; \ - } \ - else if ((Char & 0xfe) == 0xfc) \ - { \ - Len = 6; \ - Mask = 0x01; \ - } \ - else \ - Len = -1; - -#define UTF8_LENGTH(Char) \ - ((Char) < 0x80 ? 1 : \ - ((Char) < 0x800 ? 2 : \ - ((Char) < 0x10000 ? 3 : \ - ((Char) < 0x200000 ? 4 : \ - ((Char) < 0x4000000 ? 5 : 6))))) - - -#define UTF8_GET(Result, Chars, Count, Mask, Len) \ - (Result) = (Chars)[0] & (Mask); \ - for ((Count) = 1; (Count) < (Len); ++(Count)) \ - { \ - if (((Chars)[(Count)] & 0xc0) != 0x80) \ - { \ - (Result) = -1; \ - break; \ - } \ - (Result) <<= 6; \ - (Result) |= ((Chars)[(Count)] & 0x3f); \ - } - -#define UNICODE_VALID(Char) \ - ((Char) < 0x110000 && \ - ((Char) < 0xD800 || (Char) >= 0xE000) && \ - (Char) != 0xFFFE && (Char) != 0xFFFF) - - -gchar g_utf8_skip[256] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0 -}; - -/** - * g_utf8_find_prev_char: - * @str: pointer to the beginning of a UTF-8 string - * @p: pointer to some position within @str - * - * Given a position @p with a UTF-8 encoded string @str, find the start - * of the previous UTF-8 character starting before @p. Returns %NULL if no - * UTF-8 characters are present in @p before @str. - * - * @p does not have to be at the beginning of a UTF-8 chracter. No check - * is made to see if the character found is actually valid other than - * it starts with an appropriate byte. - * - * Return value: a pointer to the found character or %NULL. - **/ -gchar * -g_utf8_find_prev_char (const char *str, - const char *p) -{ - for (--p; p > str; --p) - { - if ((*p & 0xc0) != 0x80) - return (gchar *)p; - } - return NULL; -} - -/** - * g_utf8_find_next_char: - * @p: a pointer to a position within a UTF-8 encoded string - * @end: a pointer to the end of the string, or %NULL to indicate - * that the string is NULL terminated, in which case - * the returned value will be - * - * Find the start of the next utf-8 character in the string after @p - * - * @p does not have to be at the beginning of a UTF-8 chracter. No check - * is made to see if the character found is actually valid other than - * it starts with an appropriate byte. - * - * Return value: a pointer to the found character or %NULL - **/ -gchar * -g_utf8_find_next_char (const gchar *p, - const gchar *end) -{ - if (*p) - { - if (end) - for (++p; p < end && (*p & 0xc0) == 0x80; ++p) - ; - else - for (++p; (*p & 0xc0) == 0x80; ++p) - ; - } - return (p == end) ? NULL : (gchar *)p; -} - -/** - * g_utf8_prev_char: - * @p: a pointer to a position within a UTF-8 encoded string - * - * Find the previous UTF-8 character in the string before @p. - * - * @p does not have to be at the beginning of a UTF-8 character. No check - * is made to see if the character found is actually valid other than - * it starts with an appropriate byte. If @p might be the first - * character of the string, you must use g_utf8_find_prev_char instead. - * - * Return value: a pointer to the found character. - **/ -gchar * -g_utf8_prev_char (const gchar *p) -{ - while (TRUE) - { - p--; - if ((*p & 0xc0) != 0x80) - return (gchar *)p; - } -} - -/** - * g_utf8_strlen: - * @p: pointer to the start of a UTF-8 string. - * @max: the maximum number of bytes to examine. If @max - * is less than 0, then the string is assumed to be - * nul-terminated. - * - * Return value: the length of the string in characters - **/ -glong -g_utf8_strlen (const gchar *p, - gssize max) -{ - glong len = 0; - const gchar *start = p; - - if (max < 0) - { - while (*p) - { - p = g_utf8_next_char (p); - ++len; - } - } - else - { - if (max == 0 || !*p) - return 0; - - p = g_utf8_next_char (p); - - while (p - start < max && *p) - { - ++len; - p = g_utf8_next_char (p); - } - - /* only do the last len increment if we got a complete - * char (don't count partial chars) - */ - if (p - start == max) - ++len; - } - - return len; -} - -/** - * g_utf8_get_char: - * @p: a pointer to unicode character encoded as UTF-8 - * - * Convert a sequence of bytes encoded as UTF-8 to a unicode character. - * If @p does not point to a valid UTF-8 encoded character, results are - * undefined. - * - * Return value: the resulting character - **/ -gunichar -g_utf8_get_char (const gchar *p) -{ - int i, mask = 0, len; - gunichar result; - unsigned char c = (unsigned char) *p; - - UTF8_COMPUTE (c, mask, len); - if (len == -1) - return (gunichar)-1; - UTF8_GET (result, p, i, mask, len); - - return result; -} - -/** - * g_utf8_offset_to_pointer: - * @str: a UTF-8 encoded string - * @offset: a character offset within the string. - * - * Converts from an integer character offset to a pointer to a position - * within the string. - * - * Return value: the resulting pointer - **/ -gchar * -g_utf8_offset_to_pointer (const gchar *str, - glong offset) -{ - const gchar *s = str; - while (offset--) - s = g_utf8_next_char (s); - - return (gchar *)s; -} - -/** - * g_utf8_pointer_to_offset: - * @str: a UTF-8 encoded string - * @pos: a pointer to a position within @str - * - * Converts from a pointer to position within a string to a integer - * character offset - * - * Return value: the resulting character offset - **/ -glong -g_utf8_pointer_to_offset (const gchar *str, - const gchar *pos) -{ - const gchar *s = str; - glong offset = 0; - - while (s < pos) - { - s = g_utf8_next_char (s); - offset++; - } - - return offset; -} - - -/** - * g_utf8_strncpy: - * @dest: buffer to fill with characters from @src - * @src: UTF-8 string - * @n: character count - * - * Like the standard C strncpy() function, but copies a given number - * of characters instead of a given number of bytes. The @src string - * must be valid UTF-8 encoded text. (Use g_utf8_validate() on all - * text before trying to use UTF-8 utility functions with it.) - * - * Return value: @dest - **/ -gchar * -g_utf8_strncpy (gchar *dest, const gchar *src, size_t n) -{ - const gchar *s = src; - while (n && *s) - { - s = g_utf8_next_char(s); - n--; - } - strncpy(dest, src, s - src); - dest[s - src] = 0; - return dest; -} - -static gboolean -g_utf8_get_charset_internal (char **a) -{ - char *charset = getenv("CHARSET"); - - if (charset && a && ! *a) - *a = charset; - - if (charset && strstr (charset, "UTF-8")) - return TRUE; - -#ifdef HAVE_CODESET - charset = nl_langinfo(CODESET); - if (charset) - { - if (a && ! *a) - *a = charset; - if (strcmp (charset, "UTF-8") == 0) - return TRUE; - } -#endif - -#if 0 /* #ifdef _NL_CTYPE_CODESET_NAME */ - charset = nl_langinfo (_NL_CTYPE_CODESET_NAME); - if (charset) - { - if (a && ! *a) - *a = charset; - if (strcmp (charset, "UTF-8") == 0) - return TRUE; - } -#endif - -#ifdef G_PLATFORM_WIN32 - if (a && ! *a) - { - static char codepage[10]; - - sprintf (codepage, "CP%d", GetACP ()); - *a = codepage; - /* What about codepage 1200? Is that UTF-8? */ - return FALSE; - } -#else - if (a && ! *a) - *a = "US-ASCII"; -#endif - - /* Assume this for compatibility at present. */ - return FALSE; -} - -static int utf8_locale_cache = -1; -static char *utf8_charset_cache = NULL; - -/** - * g_get_charset: - * @charset: return location for character set name - * - * Obtains the character set for the current locale; you might use - * this character set as an argument to g_convert(), to convert from - * the current locale's encoding to some other encoding. (Frequently - * g_locale_to_utf8() and g_locale_from_utf8() are nice shortcuts, - * though.) - * - * The return value is %TRUE if the locale's encoding is UTF-8, in that - * case you can perhaps avoid calling g_convert(). - * - * The string returned in @charset is not allocated, and should not be - * freed. - * - * Return value: %TRUE if the returned charset is UTF-8 - **/ -gboolean -g_get_charset (G_CONST_RETURN char **charset) -{ - if (utf8_locale_cache != -1) - { - if (charset) - *charset = utf8_charset_cache; - return utf8_locale_cache; - } - utf8_locale_cache = g_utf8_get_charset_internal (&utf8_charset_cache); - if (charset) - *charset = utf8_charset_cache; - return utf8_locale_cache; -} - -/* unicode_strchr */ - -/** - * g_unichar_to_utf8: - * @c: a ISO10646 character code - * @outbuf: output buffer, must have at least 6 bytes of space. - * If %NULL, the length will be computed and returned - * and nothing will be written to @out. - * - * Convert a single character to utf8 - * - * Return value: number of bytes written - **/ -int -g_unichar_to_utf8 (gunichar c, - gchar *outbuf) -{ - guint len = 0; - int first; - int i; - - if (c < 0x80) - { - first = 0; - len = 1; - } - else if (c < 0x800) - { - first = 0xc0; - len = 2; - } - else if (c < 0x10000) - { - first = 0xe0; - len = 3; - } - else if (c < 0x200000) - { - first = 0xf0; - len = 4; - } - else if (c < 0x4000000) - { - first = 0xf8; - len = 5; - } - else - { - first = 0xfc; - len = 6; - } - - if (outbuf) - { - for (i = len - 1; i > 0; --i) - { - outbuf[i] = (c & 0x3f) | 0x80; - c >>= 6; - } - outbuf[0] = c | first; - } - - return len; -} - -/** - * g_utf8_strchr: - * @p: a nul-terminated utf-8 string - * @p_len: the maximum length of p - * @c: a iso-10646 character - * - * Find the leftmost occurence of the given iso-10646 character - * in a UTF-8 string, while limiting the search to p_len bytes. - * If len is -1, allow unbounded search. - * - * Return value: NULL if the string does not contain the character, otherwise, a - * a pointer to the start of the leftmost of the character in the string. - **/ -gchar * -g_utf8_strchr (const char *p, - gssize p_len, - gunichar c) -{ - gchar ch[10]; - - gint len = g_unichar_to_utf8 (c, ch); - ch[len] = '\0'; - - return g_strstr_len (p, p_len, ch); -} - - -/** - * g_utf8_strrchr: - * @p: a nul-terminated utf-8 string - * @p_len: the maximum length of p - * @c: a iso-10646 character/ - * - * Find the rightmost occurence of the given iso-10646 character - * in a UTF-8 string, while limiting the search to p_len bytes. - * If len is -1, allow unbounded search. - * - * Return value: NULL if the string does not contain the character, otherwise, a - * a pointer to the start of the rightmost of the character in the string. - **/ -gchar * -g_utf8_strrchr (const char *p, - gssize p_len, - gunichar c) -{ - gchar ch[10]; - - gint len = g_unichar_to_utf8 (c, ch); - ch[len] = '\0'; - - return g_strrstr_len (p, p_len, ch); -} - - -/* Like g_utf8_get_char, but take a maximum length - * and return (gunichar)-2 on incomplete trailing character - */ -static inline gunichar -g_utf8_get_char_extended (const gchar *p, gsize max_len) -{ - guint i, len; - gunichar wc = (guchar) *p; - - if (wc < 0x80) - { - return wc; - } - else if (wc < 0xc0) - { - return (gunichar)-1; - } - else if (wc < 0xe0) - { - len = 2; - wc &= 0x1f; - } - else if (wc < 0xf0) - { - len = 3; - wc &= 0x0f; - } - else if (wc < 0xf8) - { - len = 4; - wc &= 0x07; - } - else if (wc < 0xfc) - { - len = 5; - wc &= 0x03; - } - else if (wc < 0xfe) - { - len = 6; - wc &= 0x01; - } - else - { - return (gunichar)-1; - } - - if (max_len >= 0 && len > max_len) - { - for (i = 1; i < max_len; i++) - { - if ((((guchar *)p)[i] & 0xc0) != 0x80) - return (gunichar)-1; - } - return (gunichar)-2; - } - - for (i = 1; i < len; ++i) - { - gunichar ch = ((guchar *)p)[i]; - - if ((ch & 0xc0) != 0x80) - { - if (ch) - return (gunichar)-1; - else - return (gunichar)-2; - } - - wc <<= 6; - wc |= (ch & 0x3f); - } - - if (UTF8_LENGTH(wc) != len) - return (gunichar)-1; - - return wc; -} - -/** - * g_utf8_to_ucs4_fast: - * @str: a UTF-8 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is %NULL terminated. - * @items_written: location to store the number of characters in the - * result, or %NULL. - * - * Convert a string from UTF-8 to a 32-bit fixed width - * representation as UCS-4, assuming valid UTF-8 input. - * This function is roughly twice as fast as g_utf8_to_ucs4() - * but does no error checking on the input. - * - * Return value: a pointer to a newly allocated UCS-4 string. - * This value must be freed with g_free() - **/ -gunichar * -g_utf8_to_ucs4_fast (const gchar *str, - glong len, - glong *items_written) -{ - gint j, charlen; - gunichar *result; - gint n_chars, i; - const gchar *p; - - g_return_val_if_fail (str != NULL, NULL); - - p = str; - n_chars = 0; - if (len < 0) - { - while (*p) - { - p = g_utf8_next_char (p); - ++n_chars; - } - } - else - { - while (p < str + len && *p) - { - p = g_utf8_next_char (p); - ++n_chars; - } - } - - result = g_new (gunichar, n_chars + 1); - - p = str; - for (i=0; i < n_chars; i++) - { - gunichar wc = ((unsigned char *)p)[0]; - - if (wc < 0x80) - { - result[i] = wc; - p++; - } - else - { - if (wc < 0xe0) - { - charlen = 2; - wc &= 0x1f; - } - else if (wc < 0xf0) - { - charlen = 3; - wc &= 0x0f; - } - else if (wc < 0xf8) - { - charlen = 4; - wc &= 0x07; - } - else if (wc < 0xfc) - { - charlen = 5; - wc &= 0x03; - } - else - { - charlen = 6; - wc &= 0x01; - } - - for (j = 1; j < charlen; j++) - { - wc <<= 6; - wc |= ((unsigned char *)p)[j] & 0x3f; - } - - result[i] = wc; - p += charlen; - } - } - result[i] = 0; - - if (items_written) - *items_written = i; - - return result; -} - -/** - * g_utf8_to_ucs4: - * @str: a UTF-8 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is %NULL terminated. - * @items_read: location to store number of bytes read, or %NULL. - * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be - * returned in case @str contains a trailing partial - * character. If an error occurs then the index of the - * invalid input is stored here. - * @items_written: location to store number of characters written or %NULL. - * The value here stored does not include the trailing 0 - * character. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from UTF-8 to a 32-bit fixed width - * representation as UCS-4. A trailing 0 will be added to the - * string after the converted text. - * - * Return value: a pointer to a newly allocated UCS-4 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gunichar * -g_utf8_to_ucs4 (const gchar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - gunichar *result = NULL; - gint n_chars, i; - const gchar *in; - - in = str; - n_chars = 0; - while ((len < 0 || str + len - in > 0) && *in) - { - gunichar wc = g_utf8_get_char_extended (in, str + len - in); - if (wc & 0x80000000) - { - if (wc == (gunichar)-2) - { - if (items_read) - break; - else - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - _("Partial character sequence at end of input")); - } - else - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid byte sequence in conversion input")); - - goto err_out; - } - - n_chars++; - - in = g_utf8_next_char (in); - } - - result = g_new (gunichar, n_chars + 1); - - in = str; - for (i=0; i < n_chars; i++) - { - result[i] = g_utf8_get_char (in); - in = g_utf8_next_char (in); - } - result[i] = 0; - - if (items_written) - *items_written = n_chars; - - err_out: - if (items_read) - *items_read = in - str; - - return result; -} - -/** - * g_ucs4_to_utf8: - * @str: a UCS-4 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is %NULL terminated. - * @items_read: location to store number of characters read read, or %NULL. - * @items_written: location to store number of bytes written or %NULL. - * The value here stored does not include the trailing 0 - * byte. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from a 32-bit fixed width representation as UCS-4. - * to UTF-8. The result will be terminated with a 0 byte. - * - * Return value: a pointer to a newly allocated UTF-8 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gchar * -g_ucs4_to_utf8 (const gunichar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - gint result_length; - gchar *result = NULL; - gchar *p; - gint i; - - result_length = 0; - for (i = 0; len < 0 || i < len ; i++) - { - if (!str[i]) - break; - - if (str[i] >= 0x80000000) - { - if (items_read) - *items_read = i; - - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Character out of range for UTF-8")); - goto err_out; - } - - result_length += UTF8_LENGTH (str[i]); - } - - result = g_malloc (result_length + 1); - p = result; - - i = 0; - while (p < result + result_length) - p += g_unichar_to_utf8 (str[i++], p); - - *p = '\0'; - - if (items_written) - *items_written = p - result; - - err_out: - if (items_read) - *items_read = i; - - return result; -} - -#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) - -/** - * g_utf16_to_utf8: - * @str: a UTF-16 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is terminated with a 0 character. - * @items_read: location to store number of words read, or %NULL. - * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be - * returned in case @str contains a trailing partial - * character. If an error occurs then the index of the - * invalid input is stored here. - * @items_written: location to store number of bytes written, or %NULL. - * The value stored here does not include the trailing - * 0 byte. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from UTF-16 to UTF-8. The result will be - * terminated with a 0 byte. - * - * Return value: a pointer to a newly allocated UTF-8 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gchar * -g_utf16_to_utf8 (const gunichar2 *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - /* This function and g_utf16_to_ucs4 are almost exactly identical - The lines that differ - * are marked. - */ - const gunichar2 *in; - gchar *out; - gchar *result = NULL; - gint n_bytes; - gunichar high_surrogate; - - g_return_val_if_fail (str != 0, NULL); - - n_bytes = 0; - in = str; - high_surrogate = 0; - while ((len < 0 || in - str < len) && *in) - { - gunichar2 c = *in; - gunichar wc; - - if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ - { - if (high_surrogate) - { - wc = SURROGATE_VALUE (high_surrogate, c); - high_surrogate = 0; - } - else - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - goto err_out; - } - } - else - { - if (high_surrogate) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - goto err_out; - } - - if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ - { - high_surrogate = c; - goto next1; - } - else - wc = c; - } - - /********** DIFFERENT for UTF8/UCS4 **********/ - n_bytes += UTF8_LENGTH (wc); - - next1: - in++; - } - - if (high_surrogate && !items_read) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - _("Partial character sequence at end of input")); - goto err_out; - } - - /* At this point, everything is valid, and we just need to convert - */ - /********** DIFFERENT for UTF8/UCS4 **********/ - result = g_malloc (n_bytes + 1); - - high_surrogate = 0; - out = result; - in = str; - while (out < result + n_bytes) - { - gunichar2 c = *in; - gunichar wc; - - if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ - { - wc = SURROGATE_VALUE (high_surrogate, c); - high_surrogate = 0; - } - else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ - { - high_surrogate = c; - goto next2; - } - else - wc = c; - - /********** DIFFERENT for UTF8/UCS4 **********/ - out += g_unichar_to_utf8 (wc, out); - - next2: - in++; - } - - /********** DIFFERENT for UTF8/UCS4 **********/ - *out = '\0'; - - if (items_written) - /********** DIFFERENT for UTF8/UCS4 **********/ - *items_written = out - result; - - err_out: - if (items_read) - *items_read = in - str; - - return result; -} - -/** - * g_utf16_to_ucs4: - * @str: a UTF-16 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is terminated with a 0 character. - * @items_read: location to store number of words read, or %NULL. - * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be - * returned in case @str contains a trailing partial - * character. If an error occurs then the index of the - * invalid input is stored here. - * @items_written: location to store number of characters written, or %NULL. - * The value stored here does not include the trailing - * 0 character. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from UTF-16 to UCS-4. The result will be - * terminated with a 0 character. - * - * Return value: a pointer to a newly allocated UCS-4 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gunichar * -g_utf16_to_ucs4 (const gunichar2 *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - const gunichar2 *in; - gchar *out; - gchar *result = NULL; - gint n_bytes; - gunichar high_surrogate; - - g_return_val_if_fail (str != 0, NULL); - - n_bytes = 0; - in = str; - high_surrogate = 0; - while ((len < 0 || in - str < len) && *in) - { - gunichar2 c = *in; - gunichar wc; - - if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ - { - if (high_surrogate) - { - wc = SURROGATE_VALUE (high_surrogate, c); - high_surrogate = 0; - } - else - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - goto err_out; - } - } - else - { - if (high_surrogate) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - goto err_out; - } - - if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ - { - high_surrogate = c; - goto next1; - } - else - wc = c; - } - - /********** DIFFERENT for UTF8/UCS4 **********/ - n_bytes += sizeof (gunichar); - - next1: - in++; - } - - if (high_surrogate && !items_read) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - _("Partial character sequence at end of input")); - goto err_out; - } - - /* At this point, everything is valid, and we just need to convert - */ - /********** DIFFERENT for UTF8/UCS4 **********/ - result = g_malloc (n_bytes + 4); - - high_surrogate = 0; - out = result; - in = str; - while (out < result + n_bytes) - { - gunichar2 c = *in; - gunichar wc; - - if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ - { - wc = SURROGATE_VALUE (high_surrogate, c); - high_surrogate = 0; - } - else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ - { - high_surrogate = c; - goto next2; - } - else - wc = c; - - /********** DIFFERENT for UTF8/UCS4 **********/ - *(gunichar *)out = wc; - out += sizeof (gunichar); - - next2: - in++; - } - - /********** DIFFERENT for UTF8/UCS4 **********/ - *(gunichar *)out = 0; - - if (items_written) - /********** DIFFERENT for UTF8/UCS4 **********/ - *items_written = (out - result) / sizeof (gunichar); - - err_out: - if (items_read) - *items_read = in - str; - - return (gunichar *)result; -} - -/** - * g_utf8_to_utf16: - * @str: a UTF-8 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is %NULL terminated. - - * @items_read: location to store number of bytes read, or %NULL. - * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be - * returned in case @str contains a trailing partial - * character. If an error occurs then the index of the - * invalid input is stored here. - * @items_written: location to store number of words written, or %NULL. - * The value stored here does not include the trailing - * 0 word. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from UTF-8 to UTF-16. A 0 word will be - * added to the result after the converted text. - * - * Return value: a pointer to a newly allocated UTF-16 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gunichar2 * -g_utf8_to_utf16 (const gchar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - gunichar2 *result = NULL; - gint n16; - const gchar *in; - gint i; - - g_return_val_if_fail (str != NULL, NULL); - - in = str; - n16 = 0; - while ((len < 0 || str + len - in > 0) && *in) - { - gunichar wc = g_utf8_get_char_extended (in, str + len - in); - if (wc & 0x80000000) - { - if (wc == (gunichar)-2) - { - if (items_read) - break; - else - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - _("Partial character sequence at end of input")); - } - else - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid byte sequence in conversion input")); - - goto err_out; - } - - if (wc < 0xd800) - n16 += 1; - else if (wc < 0xe000) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - - goto err_out; - } - else if (wc < 0x10000) - n16 += 1; - else if (wc < 0x110000) - n16 += 2; - else - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Character out of range for UTF-16")); - - goto err_out; - } - - in = g_utf8_next_char (in); - } - - result = g_new (gunichar2, n16 + 1); - - in = str; - for (i = 0; i < n16;) - { - gunichar wc = g_utf8_get_char (in); - - if (wc < 0x10000) - { - result[i++] = wc; - } - else - { - result[i++] = (wc - 0x10000) / 0x400 + 0xd800; - result[i++] = (wc - 0x10000) % 0x400 + 0xdc00; - } - - in = g_utf8_next_char (in); - } - - result[i] = 0; - - if (items_written) - *items_written = n16; - - err_out: - if (items_read) - *items_read = in - str; - - return result; -} - -/** - * g_ucs4_to_utf16: - * @str: a UCS-4 encoded string - * @len: the maximum length of @str to use. If < 0, then - * the string is terminated with a zero character. - * @items_read: location to store number of bytes read, or %NULL. - * If an error occurs then the index of the invalid input - * is stored here. - * @items_written: location to store number of words written, or %NULL. - * The value stored here does not include the trailing - * 0 word. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from UCS-4 to UTF-16. A 0 word will be - * added to the result after the converted text. - * - * Return value: a pointer to a newly allocated UTF-16 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -gunichar2 * -g_ucs4_to_utf16 (const gunichar *str, - glong len, - glong *items_read, - glong *items_written, - GError **error) -{ - gunichar2 *result = NULL; - gint n16; - gint i, j; - - n16 = 0; - i = 0; - while ((len < 0 || i < len) && str[i]) - { - gunichar wc = str[i]; - - if (wc < 0xd800) - n16 += 1; - else if (wc < 0xe000) - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Invalid sequence in conversion input")); - - goto err_out; - } - else if (wc < 0x10000) - n16 += 1; - else if (wc < 0x110000) - n16 += 2; - else - { - g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Character out of range for UTF-16")); - - goto err_out; - } - - i++; - } - - result = g_new (gunichar2, n16 + 1); - - for (i = 0, j = 0; j < n16; i++) - { - gunichar wc = str[i]; - - if (wc < 0x10000) - { - result[j++] = wc; - } - else - { - result[j++] = (wc - 0x10000) / 0x400 + 0xd800; - result[j++] = (wc - 0x10000) % 0x400 + 0xdc00; - } - } - result[j] = 0; - - if (items_written) - *items_written = n16; - - err_out: - if (items_read) - *items_read = i; - - return result; -} - -/** - * g_utf8_validate: - * @str: a pointer to character data - * @max_len: max bytes to validate, or -1 to go until nul - * @end: return location for end of valid data - * - * Validates UTF-8 encoded text. @str is the text to validate; - * if @str is nul-terminated, then @max_len can be -1, otherwise - * @max_len should be the number of bytes to validate. - * If @end is non-%NULL, then the end of the valid range - * will be stored there (i.e. the address of the first invalid byte - * if some bytes were invalid, or the end of the text being validated - * otherwise). - * - * Returns TRUE if all of @str was valid. Many GLib and GTK+ - * routines require valid UTF8 as input; - * so data read from a file or the network should be checked - * with g_utf8_validate() before doing anything else with it. - * - * Return value: TRUE if the text was valid UTF-8. - **/ -gboolean -g_utf8_validate (const gchar *str, - gssize max_len, - const gchar **end) -{ - - const gchar *p; - - g_return_val_if_fail (str != NULL, FALSE); - - if (end) - *end = str; - - p = str; - - while ((max_len < 0 || (p - str) < max_len) && *p) - { - int i, mask = 0, len; - gunichar result; - unsigned char c = (unsigned char) *p; - - UTF8_COMPUTE (c, mask, len); - - if (len == -1) - break; - - /* check that the expected number of bytes exists in str */ - if (max_len >= 0 && - ((max_len - (p - str)) < len)) - break; - - UTF8_GET (result, p, i, mask, len); - - if (UTF8_LENGTH (result) != len) /* Check for overlong UTF-8 */ - break; - - if (result == (gunichar)-1) - break; - - if (!UNICODE_VALID (result)) - break; - - p += len; - } - - if (end) - *end = p; - - /* See that we covered the entire length if a length was - * passed in, or that we ended on a nul if not - */ - if (max_len >= 0 && - p != (str + max_len)) - return FALSE; - else if (max_len < 0 && - *p != '\0') - return FALSE; - else - return TRUE; -} - -/** - * g_unichar_validate: - * @ch: a Unicode character - * - * Checks whether @ch is a valid Unicode character. Some possible - * integer values of @ch will not be valid. 0 is considered a valid - * character, though it's normally a string terminator. - * - * Return value: %TRUE if @ch is a valid Unicode character - **/ -gboolean -g_unichar_validate (gunichar ch) -{ - return UNICODE_VALID (ch); -} diff --git a/gutils.c b/gutils.c deleted file mode 100644 index e4cc7a6a..00000000 --- a/gutils.c +++ /dev/null @@ -1,1107 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe for the unix part, FIXME: make the win32 part MT safe as well. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include -#include -#include -#ifdef HAVE_PWD_H -#include -#endif -#include -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -/* implement Glib's inline functions - */ -#define G_IMPLEMENT_INLINES 1 -#define __G_UTILS_C__ -#include "glib.h" - -#ifdef MAXPATHLEN -#define G_PATH_LENGTH MAXPATHLEN -#elif defined (PATH_MAX) -#define G_PATH_LENGTH PATH_MAX -#elif defined (_PC_PATH_MAX) -#define G_PATH_LENGTH sysconf(_PC_PATH_MAX) -#else -#define G_PATH_LENGTH 2048 -#endif - -#ifdef G_PLATFORM_WIN32 -# define STRICT /* Strict typing, please */ -# include -# undef STRICT -# include -#endif /* G_PLATFORM_WIN32 */ - -#ifdef G_OS_WIN32 -# include -#endif - -#ifdef HAVE_CODESET -#include -#endif - -const guint glib_major_version = GLIB_MAJOR_VERSION; -const guint glib_minor_version = GLIB_MINOR_VERSION; -const guint glib_micro_version = GLIB_MICRO_VERSION; -const guint glib_interface_age = GLIB_INTERFACE_AGE; -const guint glib_binary_age = GLIB_BINARY_AGE; - -#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY) -void -g_memmove (gpointer dest, gconstpointer src, gulong len) -{ - gchar* destptr = dest; - const gchar* srcptr = src; - if (src + len < dest || dest + len < src) - { - bcopy (src, dest, len); - return; - } - else if (dest <= src) - { - while (len--) - *(destptr++) = *(srcptr++); - } - else - { - destptr += len; - srcptr += len; - while (len--) - *(--destptr) = *(--srcptr); - } -} -#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */ - -void -g_atexit (GVoidFunc func) -{ - gint result; - const gchar *error = NULL; - - /* keep this in sync with glib.h */ - -#ifdef G_NATIVE_ATEXIT - result = ATEXIT (func); - if (result) - error = g_strerror (errno); -#elif defined (HAVE_ATEXIT) -# ifdef NeXT /* @#%@! NeXTStep */ - result = !atexit ((void (*)(void)) func); - if (result) - error = g_strerror (errno); -# else - result = atexit ((void (*)(void)) func); - if (result) - error = g_strerror (errno); -# endif /* NeXT */ -#elif defined (HAVE_ON_EXIT) - result = on_exit ((void (*)(int, void *)) func, NULL); - if (result) - error = g_strerror (errno); -#else - result = 0; - error = "no implementation"; -#endif /* G_NATIVE_ATEXIT */ - - if (error) - g_error ("Could not register atexit() function: %s", error); -} - -/* Based on execvp() from GNU Libc. - * Some of this code is cut-and-pasted into gspawn.c - */ - -static gchar* -my_strchrnul (const gchar *str, gchar c) -{ - gchar *p = (gchar*)str; - while (*p && (*p != c)) - ++p; - - return p; -} - -#ifdef G_OS_WIN32 - -gchar *inner_find_program_in_path (const gchar *program); - -gchar* -g_find_program_in_path (const gchar *program) -{ - const gchar *last_dot = strrchr (program, '.'); - - if (last_dot == NULL || strchr (last_dot, '\\') != NULL) - { - const gint program_length = strlen (program); - const gchar *pathext = getenv ("PATHEXT"); - const gchar *p; - gchar *decorated_program; - gchar *retval; - - if (pathext == NULL) - pathext = ".com;.exe;.bat"; - - p = pathext; - do - { - pathext = p; - p = my_strchrnul (pathext, ';'); - - decorated_program = g_malloc (program_length + (p-pathext) + 1); - memcpy (decorated_program, program, program_length); - memcpy (decorated_program+program_length, pathext, p-pathext); - decorated_program [program_length + (p-pathext)] = '\0'; - - retval = inner_find_program_in_path (decorated_program); - g_free (decorated_program); - - if (retval != NULL) - return retval; - } while (*p++ != '\0'); - return NULL; - } - else - return inner_find_program_in_path (program); -} - -#define g_find_program_in_path inner_find_program_in_path -#endif - -/** - * g_find_program_in_path: - * @program: a program name - * - * Locates the first executable named @program in the user's path, in the - * same way that execvp() would locate it. Returns an allocated string - * with the absolute path name, or NULL if the program is not found in - * the path. If @program is already an absolute path, returns a copy of - * @program if @program exists and is executable, and NULL otherwise. - * - * On Windows, if @program does not have a file type suffix, tries to - * append the suffixes in the PATHEXT environment variable (if that - * doesn't exists, the suffixes .com, .exe, and .bat) in turn, and - * then look for the resulting file name in the same way as - * CreateProcess() would. This means first in the directory where the - * program was loaded from, then in the current directory, then in the - * Windows 32-bit system directory, then in the Windows directory, and - * finally in the directories in the PATH environment variable. If - * the program is found, the return value contains the full name - * including the type suffix. - * - * Return value: absolute path, or NULL - **/ -gchar* -g_find_program_in_path (const gchar *program) -{ - const gchar *path, *p; - gchar *name, *freeme; -#ifdef G_OS_WIN32 - gchar *path_tmp; -#endif - size_t len; - size_t pathlen; - - g_return_val_if_fail (program != NULL, NULL); - - /* If it is an absolute path, or a relative path including subdirectories, - * don't look in PATH. - */ - if (g_path_is_absolute (program) - || strchr (program, G_DIR_SEPARATOR) != NULL) - { - if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE)) - return g_strdup (program); - else - return NULL; - } - - path = g_getenv ("PATH"); -#ifdef G_OS_UNIX - if (path == NULL) - { - /* There is no `PATH' in the environment. The default - * search path in GNU libc is the current directory followed by - * the path `confstr' returns for `_CS_PATH'. - */ - - /* In GLib we put . last, for security, and don't use the - * unportable confstr(); UNIX98 does not actually specify - * what to search if PATH is unset. POSIX may, dunno. - */ - - path = "/bin:/usr/bin:."; - } -#else - { - gchar *tmp; - gchar moddir[MAXPATHLEN], sysdir[MAXPATHLEN], windir[MAXPATHLEN]; - - GetModuleFileName (NULL, moddir, sizeof (moddir)); - tmp = g_path_get_dirname (moddir); - GetSystemDirectory (sysdir, sizeof (sysdir)); - GetWindowsDirectory (windir, sizeof (windir)); - path_tmp = g_strconcat (tmp, ";.;", sysdir, ";", windir, - (path != NULL ? ";" : NULL), - (path != NULL ? path : NULL), - NULL); - g_free (tmp); - path = path_tmp; - } -#endif - - len = strlen (program) + 1; - pathlen = strlen (path); - freeme = name = g_malloc (pathlen + len + 1); - - /* Copy the file name at the top, including '\0' */ - memcpy (name + pathlen + 1, program, len); - name = name + pathlen; - /* And add the slash before the filename */ - *name = G_DIR_SEPARATOR; - - p = path; - do - { - char *startp; - - path = p; - p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR); - - if (p == path) - /* Two adjacent colons, or a colon at the beginning or the end - * of `PATH' means to search the current directory. - */ - startp = name + 1; - else - startp = memcpy (name - (p - path), path, p - path); - - if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE)) - { - gchar *ret; - ret = g_strdup (startp); - g_free (freeme); -#ifdef G_OS_WIN32 - g_free (path_tmp); -#endif - return ret; - } - } - while (*p++ != '\0'); - - g_free (freeme); -#ifdef G_OS_WIN32 - g_free (path_tmp); -#endif - - return NULL; -} - -gint -g_snprintf (gchar *str, - gulong n, - gchar const *fmt, - ...) -{ -#ifdef HAVE_VSNPRINTF - va_list args; - gint retval; - - g_return_val_if_fail (str != NULL, 0); - g_return_val_if_fail (n > 0, 0); - g_return_val_if_fail (fmt != NULL, 0); - - va_start (args, fmt); - retval = vsnprintf (str, n, fmt, args); - va_end (args); - - if (retval < 0) - { - str[n-1] = '\0'; - retval = strlen (str); - } - - return retval; -#else /* !HAVE_VSNPRINTF */ - gchar *printed; - va_list args; - - g_return_val_if_fail (str != NULL, 0); - g_return_val_if_fail (n > 0, 0); - g_return_val_if_fail (fmt != NULL, 0); - - va_start (args, fmt); - printed = g_strdup_vprintf (fmt, args); - va_end (args); - - strncpy (str, printed, n); - str[n-1] = '\0'; - - g_free (printed); - - return strlen (str); -#endif /* !HAVE_VSNPRINTF */ -} - -gint -g_vsnprintf (gchar *str, - gulong n, - gchar const *fmt, - va_list args) -{ -#ifdef HAVE_VSNPRINTF - gint retval; - - g_return_val_if_fail (str != NULL, 0); - g_return_val_if_fail (n > 0, 0); - g_return_val_if_fail (fmt != NULL, 0); - - retval = vsnprintf (str, n, fmt, args); - - if (retval < 0) - { - str[n-1] = '\0'; - retval = strlen (str); - } - - return retval; -#else /* !HAVE_VSNPRINTF */ - gchar *printed; - - g_return_val_if_fail (str != NULL, 0); - g_return_val_if_fail (n > 0, 0); - g_return_val_if_fail (fmt != NULL, 0); - - printed = g_strdup_vprintf (fmt, args); - strncpy (str, printed, n); - str[n-1] = '\0'; - - g_free (printed); - - return strlen (str); -#endif /* !HAVE_VSNPRINTF */ -} - -guint -g_parse_debug_string (const gchar *string, - const GDebugKey *keys, - guint nkeys) -{ - guint i; - guint result = 0; - - g_return_val_if_fail (string != NULL, 0); - - if (!g_strcasecmp (string, "all")) - { - for (i=0; i= 0 && file_name [last_nonslash] == G_DIR_SEPARATOR) - last_nonslash--; - - if (last_nonslash == -1) - /* string only containing slashes */ - return g_strdup (G_DIR_SEPARATOR_S); - -#ifdef G_OS_WIN32 - if (last_nonslash == 1 && isalpha (file_name[0]) && file_name[1] == ':') - /* string only containing slashes and a drive */ - return g_strdup (G_DIR_SEPARATOR_S); -#endif /* G_OS_WIN32 */ - - base = last_nonslash; - - while (base >=0 && file_name [base] != G_DIR_SEPARATOR) - base--; - -#ifdef G_OS_WIN32 - if (base == -1 && isalpha (file_name[0]) && file_name[1] == ':') - base = 1; -#endif /* G_OS_WIN32 */ - - len = last_nonslash - base; - retval = g_malloc (len + 1); - memcpy (retval, file_name + base + 1, len); - retval [len] = '\0'; - return retval; -} - -gboolean -g_path_is_absolute (const gchar *file_name) -{ - g_return_val_if_fail (file_name != NULL, FALSE); - - if (file_name[0] == G_DIR_SEPARATOR) - return TRUE; - -#ifdef G_OS_WIN32 - /* Recognize drive letter on native Windows */ - if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR) - return TRUE; -#endif /* G_OS_WIN32 */ - - return FALSE; -} - -G_CONST_RETURN gchar* -g_path_skip_root (const gchar *file_name) -{ - g_return_val_if_fail (file_name != NULL, NULL); - -#ifdef G_PLATFORM_WIN32 - /* Skip \\server\share (Win32) or //server/share (Cygwin) */ - if (file_name[0] == G_DIR_SEPARATOR && - file_name[1] == G_DIR_SEPARATOR && - file_name[2]) - { - gchar *p; - - if ((p = strchr (file_name + 2, G_DIR_SEPARATOR)) > file_name + 2 && - p[1]) - { - file_name = p + 1; - - while (file_name[0] && file_name[0] != G_DIR_SEPARATOR) - file_name++; - - /* Possibly skip a backslash after the share name */ - if (file_name[0] == G_DIR_SEPARATOR) - file_name++; - - return (gchar *)file_name; - } - } -#endif - - /* Skip initial slashes */ - if (file_name[0] == G_DIR_SEPARATOR) - { - while (file_name[0] == G_DIR_SEPARATOR) - file_name++; - return (gchar *)file_name; - } - -#ifdef G_OS_WIN32 - /* Skip X:\ */ - if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR) - return (gchar *)file_name + 3; -#endif - - return NULL; -} - -gchar* -g_path_get_dirname (const gchar *file_name) -{ - register gchar *base; - register gsize len; - - g_return_val_if_fail (file_name != NULL, NULL); - - base = strrchr (file_name, G_DIR_SEPARATOR); - if (!base) - return g_strdup ("."); - while (base > file_name && *base == G_DIR_SEPARATOR) - base--; - len = (guint) 1 + base - file_name; - - base = g_new (gchar, len + 1); - g_memmove (base, file_name, len); - base[len] = 0; - - return base; -} - -gchar* -g_get_current_dir (void) -{ - gchar *buffer = NULL; - gchar *dir = NULL; - static gulong max_len = 0; - - if (max_len == 0) - max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH; - - /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd") - * and, if that wasn't bad enough, hangs in doing so. - */ -#if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD) - buffer = g_new (gchar, max_len + 1); - *buffer = 0; - dir = getwd (buffer); -#else /* !sun || !HAVE_GETCWD */ - while (max_len < G_MAXULONG / 2) - { - buffer = g_new (gchar, max_len + 1); - *buffer = 0; - dir = getcwd (buffer, max_len); - - if (dir || errno != ERANGE) - break; - - g_free (buffer); - max_len *= 2; - } -#endif /* !sun || !HAVE_GETCWD */ - - if (!dir || !*buffer) - { - /* hm, should we g_error() out here? - * this can happen if e.g. "./" has mode \0000 - */ - buffer[0] = G_DIR_SEPARATOR; - buffer[1] = 0; - } - - dir = g_strdup (buffer); - g_free (buffer); - - return dir; -} - -G_CONST_RETURN gchar* -g_getenv (const gchar *variable) -{ -#ifndef G_OS_WIN32 - g_return_val_if_fail (variable != NULL, NULL); - - return getenv (variable); -#else - G_LOCK_DEFINE_STATIC (getenv); - struct env_struct - { - gchar *key; - gchar *value; - } *env; - static GArray *environs = NULL; - gchar *system_env; - guint length, i; - gchar dummy[2]; - - g_return_val_if_fail (variable != NULL, NULL); - - G_LOCK (getenv); - - if (!environs) - environs = g_array_new (FALSE, FALSE, sizeof (struct env_struct)); - - /* First we try to find the envinronment variable inside the already - * found ones. - */ - - for (i = 0; i < environs->len; i++) - { - env = &g_array_index (environs, struct env_struct, i); - if (strcmp (env->key, variable) == 0) - { - g_assert (env->value); - G_UNLOCK (getenv); - return env->value; - } - } - - /* If not found, we ask the system */ - - system_env = getenv (variable); - if (!system_env) - { - G_UNLOCK (getenv); - return NULL; - } - - /* On Windows NT, it is relatively typical that environment variables - * contain references to other environment variables. Handle that by - * calling ExpandEnvironmentStrings. - */ - - g_array_set_size (environs, environs->len + 1); - - env = &g_array_index (environs, struct env_struct, environs->len - 1); - - /* First check how much space we need */ - length = ExpandEnvironmentStrings (system_env, dummy, 2); - - /* Then allocate that much, and actualy do the expansion and insert - * the new found pair into our buffer - */ - - env->value = g_malloc (length); - env->key = g_strdup (variable); - - ExpandEnvironmentStrings (system_env, env->value, length); - - G_UNLOCK (getenv); - return env->value; -#endif -} - - -G_LOCK_DEFINE_STATIC (g_utils_global); - -static gchar *g_tmp_dir = NULL; -static gchar *g_user_name = NULL; -static gchar *g_real_name = NULL; -static gchar *g_home_dir = NULL; - -/* HOLDS: g_utils_global_lock */ -static void -g_get_any_init (void) -{ - if (!g_tmp_dir) - { - g_tmp_dir = g_strdup (g_getenv ("TMPDIR")); - if (!g_tmp_dir) - g_tmp_dir = g_strdup (g_getenv ("TMP")); - if (!g_tmp_dir) - g_tmp_dir = g_strdup (g_getenv ("TEMP")); - -#ifdef P_tmpdir - if (!g_tmp_dir) - { - gsize k; - g_tmp_dir = g_strdup (P_tmpdir); - k = strlen (g_tmp_dir); - if (k > 1 && g_tmp_dir[k - 1] == G_DIR_SEPARATOR) - g_tmp_dir[k - 1] = '\0'; - } -#endif - - if (!g_tmp_dir) - { -#ifndef G_OS_WIN32 - g_tmp_dir = g_strdup ("/tmp"); -#else /* G_OS_WIN32 */ - g_tmp_dir = g_strdup ("C:\\"); -#endif /* G_OS_WIN32 */ - } - - if (!g_home_dir) - g_home_dir = g_strdup (g_getenv ("HOME")); - -#ifdef G_OS_WIN32 - /* In case HOME is Unix-style (it happens), convert it to - * Windows style. - */ - if (g_home_dir) - { - gchar *p; - while ((p = strchr (g_home_dir, '/')) != NULL) - *p = '\\'; - } - - if (!g_home_dir) - { - /* USERPROFILE is probably the closest equivalent to $HOME? */ - if (getenv ("USERPROFILE") != NULL) - g_home_dir = g_strdup (g_getenv ("USERPROFILE")); - } - - if (!g_home_dir) - { - /* At least at some time, HOMEDRIVE and HOMEPATH were used - * to point to the home directory, I think. But on Windows - * 2000 HOMEDRIVE seems to be equal to SYSTEMDRIVE, and - * HOMEPATH is its root "\"? - */ - if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL) - { - gchar *homedrive, *homepath; - - homedrive = g_strdup (g_getenv ("HOMEDRIVE")); - homepath = g_strdup (g_getenv ("HOMEPATH")); - - g_home_dir = g_strconcat (homedrive, homepath, NULL); - g_free (homedrive); - g_free (homepath); - } - } -#endif /* G_OS_WIN32 */ - -#ifdef HAVE_PWD_H - { - struct passwd *pw = NULL; - gpointer buffer = NULL; - -# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R) - struct passwd pwd; -# ifdef _SC_GETPW_R_SIZE_MAX - /* This reurns the maximum length */ - glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); -# else /* _SC_GETPW_R_SIZE_MAX */ - glong bufsize = 64; -# endif /* _SC_GETPW_R_SIZE_MAX */ - gint error; - - do - { - g_free (buffer); - buffer = g_malloc (bufsize); - errno = 0; - -# ifdef HAVE_POSIX_GETPWUID_R - error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); - error = error < 0 ? errno : error; -# else /* HAVE_NONPOSIX_GETPWUID_R */ -# ifdef _AIX - error = getpwuid_r (getuid (), &pwd, buffer, bufsize); - pw = error == 0 ? &pwd : NULL; -# else /* !_AIX */ - pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); - error = pw ? 0 : errno; -# endif /* !_AIX */ -# endif /* HAVE_NONPOSIX_GETPWUID_R */ - - if (!pw) - { - /* we bail out prematurely if the user id can't be found - * (should be pretty rare case actually), or if the buffer - * should be sufficiently big and lookups are still not - * successfull. - */ - if (error == 0 || error == ENOENT) - { - g_warning ("getpwuid_r(): failed due to unknown user id (%lu)", - (gulong) getuid ()); - break; - } - if (bufsize > 32 * 1024) - { - g_warning ("getpwuid_r(): failed due to: %s.", - g_strerror (error)); - break; - } - - bufsize *= 2; - } - } - while (!pw); -# endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */ - - if (!pw) - { - setpwent (); - pw = getpwuid (getuid ()); - endpwent (); - } - if (pw) - { - g_user_name = g_strdup (pw->pw_name); - g_real_name = g_strdup (pw->pw_gecos); - if (!g_home_dir) - g_home_dir = g_strdup (pw->pw_dir); - } - g_free (buffer); - } - -#else /* !HAVE_PWD_H */ - -# ifdef G_OS_WIN32 - { - guint len = 17; - gchar buffer[17]; - - if (GetUserName ((LPTSTR) buffer, (LPDWORD) &len)) - { - g_user_name = g_strdup (buffer); - g_real_name = g_strdup (buffer); - } - } -# endif /* G_OS_WIN32 */ - -#endif /* !HAVE_PWD_H */ - -#ifdef __EMX__ - /* change '\\' in %HOME% to '/' */ - g_strdelimit (g_home_dir, "\\",'/'); -#endif - if (!g_user_name) - g_user_name = g_strdup ("somebody"); - if (!g_real_name) - g_real_name = g_strdup ("Unknown"); - else - { - gchar *p; - - for (p = g_real_name; *p; p++) - if (*p == ',') - { - *p = 0; - p = g_strdup (g_real_name); - g_free (g_real_name); - g_real_name = p; - break; - } - } - } -} - -G_CONST_RETURN gchar* -g_get_user_name (void) -{ - G_LOCK (g_utils_global); - if (!g_tmp_dir) - g_get_any_init (); - G_UNLOCK (g_utils_global); - - return g_user_name; -} - -G_CONST_RETURN gchar* -g_get_real_name (void) -{ - G_LOCK (g_utils_global); - if (!g_tmp_dir) - g_get_any_init (); - G_UNLOCK (g_utils_global); - - return g_real_name; -} - -/* Return the home directory of the user. If there is a HOME - * environment variable, its value is returned, otherwise use some - * system-dependent way of finding it out. If no home directory can be - * deduced, return NULL. - */ - -G_CONST_RETURN gchar* -g_get_home_dir (void) -{ - G_LOCK (g_utils_global); - if (!g_tmp_dir) - g_get_any_init (); - G_UNLOCK (g_utils_global); - - return g_home_dir; -} - -/* Return a directory to be used to store temporary files. This is the - * value of the TMPDIR, TMP or TEMP environment variables (they are - * checked in that order). If none of those exist, use P_tmpdir from - * stdio.h. If that isn't defined, return "/tmp" on POSIXly systems, - * and C:\ on Windows. - */ - -G_CONST_RETURN gchar* -g_get_tmp_dir (void) -{ - G_LOCK (g_utils_global); - if (!g_tmp_dir) - g_get_any_init (); - G_UNLOCK (g_utils_global); - - return g_tmp_dir; -} - -static gchar *g_prgname = NULL; - -gchar* -g_get_prgname (void) -{ - gchar* retval; - - G_LOCK (g_utils_global); - retval = g_prgname; - G_UNLOCK (g_utils_global); - - return retval; -} - -void -g_set_prgname (const gchar *prgname) -{ - gchar *c; - - G_LOCK (g_utils_global); - c = g_prgname; - g_prgname = g_strdup (prgname); - g_free (c); - G_UNLOCK (g_utils_global); -} - -guint -g_direct_hash (gconstpointer v) -{ - return GPOINTER_TO_UINT (v); -} - -gboolean -g_direct_equal (gconstpointer v1, - gconstpointer v2) -{ - return v1 == v2; -} - -gboolean -g_int_equal (gconstpointer v1, - gconstpointer v2) -{ - return *((const gint*) v1) == *((const gint*) v2); -} - -guint -g_int_hash (gconstpointer v) -{ - return *(const gint*) v; -} - -/** - * g_get_codeset: - * - * Get the codeset for the current locale. - * - * Return value: a newly allocated string containing the name - * of the codeset. This string must be freed with g_free(). - **/ -gchar * -g_get_codeset (void) -{ -#ifdef HAVE_CODESET - char *result = nl_langinfo (CODESET); - return g_strdup (result); -#else -#ifdef G_PLATFORM_WIN32 - return g_strdup_printf ("CP%d", GetACP ()); -#else - /* FIXME: Do something more intelligent based on setlocale (LC_CTYPE, NULL) - */ - return g_strdup ("ISO-8859-1"); -#endif -#endif -} - -#ifdef ENABLE_NLS - -#include - - -#ifndef GLIB_LOCALE_DIR -#ifdef G_PLATFORM_WIN32 - -#define GLIB_LOCALE_DIR \ - g_win32_get_package_installation_subdirectory \ - (GETTEXT_PACKAGE, g_strdup_printf ("glib-%d.%d.dll", \ - GLIB_MAJOR_VERSION, \ - GLIB_MINOR_VERSION), \ - "locale") - -#endif /* G_PLATFORM_WIN32 */ -#endif /* !GLIB_LOCALE_DIR */ - -G_CONST_RETURN gchar * -_glib_gettext (const gchar *str) -{ - static gboolean _glib_gettext_initialized = FALSE; - - if (!_glib_gettext_initialized) - { - bindtextdomain(GETTEXT_PACKAGE, GLIB_LOCALE_DIR); - _glib_gettext_initialized = TRUE; - } - - return dgettext (GETTEXT_PACKAGE, str); -} - -#endif /* ENABLE_NLS */ - - diff --git a/gutils.h b/gutils.h deleted file mode 100644 index 3e3d30fe..00000000 --- a/gutils.h +++ /dev/null @@ -1,332 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_UTILS_H__ -#define __G_UTILS_H__ - -#include -#include - -G_BEGIN_DECLS - -#ifdef G_OS_WIN32 - -/* On native Win32, directory separator is the backslash, and search path - * separator is the semicolon. - */ -#define G_DIR_SEPARATOR '\\' -#define G_DIR_SEPARATOR_S "\\" -#define G_SEARCHPATH_SEPARATOR ';' -#define G_SEARCHPATH_SEPARATOR_S ";" - -#else /* !G_OS_WIN32 */ - -/* Unix */ - -#define G_DIR_SEPARATOR '/' -#define G_DIR_SEPARATOR_S "/" -#define G_SEARCHPATH_SEPARATOR ':' -#define G_SEARCHPATH_SEPARATOR_S ":" - -#endif /* !G_OS_WIN32 */ - -/* Define G_VA_COPY() to do the right thing for copying va_list variables. - * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy. - */ -#if !defined (G_VA_COPY) -# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) -# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) -# elif defined (G_VA_COPY_AS_ARRAY) -# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list)) -# else /* va_list is a pointer */ -# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2)) -# endif /* va_list is a pointer */ -#endif /* !G_VA_COPY */ - -/* inlining hassle. for compilers that don't allow the `inline' keyword, - * mostly because of strict ANSI C compliance or dumbness, we try to fall - * back to either `__inline__' or `__inline'. - * we define G_CAN_INLINE, if the compiler seems to be actually - * *capable* to do function inlining, in which case inline function bodys - * do make sense. we also define G_INLINE_FUNC to properly export the - * function prototypes if no inlining can be performed. - * inline function bodies have to be special cased with G_CAN_INLINE and a - * .c file specific macro to allow one compiled instance with extern linkage - * of the functions by defining G_IMPLEMENT_INLINES and the .c file macro. - */ -#ifdef G_IMPLEMENT_INLINES -# define G_INLINE_FUNC extern -# undef G_CAN_INLINE -#endif -#ifndef G_INLINE_FUNC -# define G_CAN_INLINE 1 -#endif -#if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) -# undef inline -# define inline __inline__ -#elif !defined (G_HAVE_INLINE) -# undef inline -# if defined (G_HAVE___INLINE__) -# define inline __inline__ -# elif defined (G_HAVE___INLINE) -# define inline __inline -# else /* !inline && !__inline__ && !__inline */ -# define inline /* don't inline, then */ -# ifndef G_INLINE_FUNC -# undef G_CAN_INLINE -# endif -# endif -#endif -#ifndef G_INLINE_FUNC -# if defined (__GNUC__) && (__OPTIMIZE__) -# define G_INLINE_FUNC extern inline -# elif defined (G_CAN_INLINE) && !defined (__GNUC__) -# define G_INLINE_FUNC static inline -# else /* can't inline */ -# define G_INLINE_FUNC extern -# undef G_CAN_INLINE -# endif -#endif /* !G_INLINE_FUNC */ - -/* Retrive static string info - */ -G_CONST_RETURN gchar* g_get_user_name (void); -G_CONST_RETURN gchar* g_get_real_name (void); -G_CONST_RETURN gchar* g_get_home_dir (void); -G_CONST_RETURN gchar* g_get_tmp_dir (void); -gchar* g_get_prgname (void); -void g_set_prgname (const gchar *prgname); - - -typedef struct _GDebugKey GDebugKey; -struct _GDebugKey -{ - gchar *key; - guint value; -}; - -/* Miscellaneous utility functions - */ -guint g_parse_debug_string (const gchar *string, - const GDebugKey *keys, - guint nkeys); - -gint g_snprintf (gchar *string, - gulong n, - gchar const *format, - ...) G_GNUC_PRINTF (3, 4); -gint g_vsnprintf (gchar *string, - gulong n, - gchar const *format, - va_list args); - -/* Check if a file name is an absolute path */ -gboolean g_path_is_absolute (const gchar *file_name); - -/* In case of absolute paths, skip the root part */ -G_CONST_RETURN gchar* g_path_skip_root (const gchar *file_name); - -#ifndef G_DISABLE_DEPRECATED - -/* These two functions are deprecated and will be removed in the next - * major release of GLib. Use g_path_get_dirname/g_path_get_basename - * instead. Whatch out! The string returned by g_path_get_basename - * must be g_freed, while the string returned by g_basename must not.*/ -G_CONST_RETURN gchar* g_basename (const gchar *file_name); -#define g_dirname g_path_get_dirname - -#endif /* G_DISABLE_DEPRECATED */ - -/* The returned strings are newly allocated with g_malloc() */ -gchar* g_get_current_dir (void); -gchar* g_path_get_basename (const gchar *file_name); -gchar* g_path_get_dirname (const gchar *file_name); - -/* Get the codeset for the current locale */ -/* gchar * g_get_codeset (void); */ - -/* return the environment string for the variable. The returned memory - * must not be freed. */ -G_CONST_RETURN gchar* g_getenv (const gchar *variable); - - -/* we try to provide a usefull equivalent for ATEXIT if it is - * not defined, but use is actually abandoned. people should - * use g_atexit() instead. - */ -typedef void (*GVoidFunc) (void); -#ifndef ATEXIT -# define ATEXIT(proc) g_ATEXIT(proc) -#else -# define G_NATIVE_ATEXIT -#endif /* ATEXIT */ -/* we use a GLib function as a replacement for ATEXIT, so - * the programmer is not required to check the return value - * (if there is any in the implementation) and doesn't encounter - * missing include files. - */ -void g_atexit (GVoidFunc func); - -/* Look for an executable in PATH, following execvp() rules */ -gchar* g_find_program_in_path (const gchar *program); - -/* Bit tests - */ -G_INLINE_FUNC gint g_bit_nth_lsf (guint32 mask, - gint nth_bit); -G_INLINE_FUNC gint g_bit_nth_msf (guint32 mask, - gint nth_bit); -G_INLINE_FUNC guint g_bit_storage (guint number); - -/* Trash Stacks - * elements need to be >= sizeof (gpointer) - */ -typedef struct _GTrashStack GTrashStack; -struct _GTrashStack -{ - GTrashStack *next; -}; - -G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, - gpointer data_p); -G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p); -G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p); -G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p); - -/* inline function implementations - */ -#if defined (G_CAN_INLINE) || defined (__G_UTILS_C__) -G_INLINE_FUNC gint -g_bit_nth_lsf (guint32 mask, - gint nth_bit) -{ - do - { - nth_bit++; - if (mask & (1 << (guint) nth_bit)) - return nth_bit; - } - while (nth_bit < 32); - return -1; -} -G_INLINE_FUNC gint -g_bit_nth_msf (guint32 mask, - gint nth_bit) -{ - if (nth_bit < 0) - nth_bit = 32; - do - { - nth_bit--; - if (mask & (1 << (guint) nth_bit)) - return nth_bit; - } - while (nth_bit > 0); - return -1; -} -G_INLINE_FUNC guint -g_bit_storage (guint number) -{ - register guint n_bits = 0; - - do - { - n_bits++; - number >>= 1; - } - while (number); - return n_bits; -} -G_INLINE_FUNC void -g_trash_stack_push (GTrashStack **stack_p, - gpointer data_p) -{ - GTrashStack *data = (GTrashStack *) data_p; - - data->next = *stack_p; - *stack_p = data; -} -G_INLINE_FUNC gpointer -g_trash_stack_pop (GTrashStack **stack_p) -{ - GTrashStack *data; - - data = *stack_p; - if (data) - { - *stack_p = data->next; - /* NULLify private pointer here, most platforms store NULL as - * subsequent 0 bytes - */ - data->next = NULL; - } - - return data; -} -G_INLINE_FUNC gpointer -g_trash_stack_peek (GTrashStack **stack_p) -{ - GTrashStack *data; - - data = *stack_p; - - return data; -} -G_INLINE_FUNC guint -g_trash_stack_height (GTrashStack **stack_p) -{ - GTrashStack *data; - guint i = 0; - - for (data = *stack_p; data; data = data->next) - i++; - - return i; -} -#endif /* G_CAN_INLINE || __G_UTILS_C__ */ - -/* Glib version. - * we prefix variable declarations so they can - * properly get exported in windows dlls. - */ -GLIB_VAR const guint glib_major_version; -GLIB_VAR const guint glib_minor_version; -GLIB_VAR const guint glib_micro_version; -GLIB_VAR const guint glib_interface_age; -GLIB_VAR const guint glib_binary_age; - -#define GLIB_CHECK_VERSION(major,minor,micro) \ - (GLIB_MAJOR_VERSION > (major) || \ - (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \ - (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \ - GLIB_MICRO_VERSION >= (micro))) - -G_END_DECLS - -#endif /* __G_UTILS_H__ */ - - - diff --git a/gwin32.c b/gwin32.c deleted file mode 100644 index 594fbbe9..00000000 --- a/gwin32.c +++ /dev/null @@ -1,1032 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald - * Copyright (C) 1998-1999 Tor Lillqvist - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * MT safe for the unix part, FIXME: make the win32 part MT safe as well. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "glibconfig.h" - -#include -#include -#include -#include - -#define STRICT /* Strict typing, please */ -#include -#undef STRICT -#ifndef G_WITH_CYGWIN -#include -#endif -#include -#include -#ifdef _MSC_VER -# include -#endif /* _MSC_VER */ - -#include "glib.h" - -#ifdef G_WITH_CYGWIN -#include -#endif - -#ifndef G_WITH_CYGWIN - -gint -g_win32_ftruncate (gint fd, - guint size) -{ - HANDLE hfile; - guint curpos; - - g_return_val_if_fail (fd >= 0, -1); - - hfile = (HANDLE) _get_osfhandle (fd); - curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT); - if (curpos == 0xFFFFFFFF - || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF - || !SetEndOfFile (hfile)) - { - gint error = GetLastError (); - - switch (error) - { - case ERROR_INVALID_HANDLE: - errno = EBADF; - break; - default: - errno = EIO; - break; - } - - return -1; - } - - return 0; -} - -DIR* -g_win32_opendir (const char *dirname) -{ - DIR *result; - gchar *mask; - guint k; - - g_return_val_if_fail (dirname != NULL, NULL); - - result = g_new0 (DIR, 1); - result->find_file_data = g_new0 (WIN32_FIND_DATA, 1); - result->dir_name = g_strdup (dirname); - - k = strlen (result->dir_name); - if (k && result->dir_name[k - 1] == '\\') - { - result->dir_name[k - 1] = '\0'; - } - mask = g_strdup_printf ("%s\\*", result->dir_name); - - result->find_file_handle = (guint) FindFirstFile (mask, - (LPWIN32_FIND_DATA) result->find_file_data); - g_free (mask); - - if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE) - { - int error = GetLastError (); - - g_free (result->dir_name); - g_free (result->find_file_data); - g_free (result); - switch (error) - { - default: - errno = EIO; - return NULL; - } - } - result->just_opened = TRUE; - - return result; -} - -struct dirent* -g_win32_readdir (DIR *dir) -{ - gchar *basename; - - g_return_val_if_fail (dir != NULL, NULL); - - if (dir->just_opened) - dir->just_opened = FALSE; - else - { - if (!FindNextFile ((HANDLE) dir->find_file_handle, - (LPWIN32_FIND_DATA) dir->find_file_data)) - { - int error = GetLastError (); - - switch (error) - { - case ERROR_NO_MORE_FILES: - return NULL; - default: - errno = EIO; - return NULL; - } - } - } - - basename = g_path_get_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName); - - strcpy (dir->readdir_result.d_name, basename); - - g_free (basename); - - return &dir->readdir_result; -} - -void -g_win32_rewinddir (DIR *dir) -{ - gchar *mask; - - g_return_if_fail (dir != NULL); - - if (!FindClose ((HANDLE) dir->find_file_handle)) - g_warning ("gwin_rewinddir(): FindClose() failed\n"); - - mask = g_strdup_printf ("%s\\*", dir->dir_name); - dir->find_file_handle = (guint) FindFirstFile (mask, - (LPWIN32_FIND_DATA) dir->find_file_data); - g_free (mask); - - if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE) - { - int error = GetLastError (); - - switch (error) - { - default: - errno = EIO; - return; - } - } - dir->just_opened = TRUE; -} - -gint -g_win32_closedir (DIR *dir) -{ - g_return_val_if_fail (dir != NULL, -1); - - if (!FindClose ((HANDLE) dir->find_file_handle)) - { - int error = GetLastError (); - - switch (error) - { - default: - errno = EIO; return -1; - } - } - - g_free (dir->dir_name); - g_free (dir->find_file_data); - g_free (dir); - - return 0; -} -#endif - -/* Mingw headers don't have latest language and sublanguage codes */ -#ifndef LANG_AFRIKAANS -#define LANG_AFRIKAANS 0x36 -#endif -#ifndef LANG_ALBANIAN -#define LANG_ALBANIAN 0x1c -#endif -#ifndef LANG_ARABIC -#define LANG_ARABIC 0x01 -#endif -#ifndef LANG_ARMENIAN -#define LANG_ARMENIAN 0x2b -#endif -#ifndef LANG_ASSAMESE -#define LANG_ASSAMESE 0x4d -#endif -#ifndef LANG_AZERI -#define LANG_AZERI 0x2c -#endif -#ifndef LANG_BASQUE -#define LANG_BASQUE 0x2d -#endif -#ifndef LANG_BELARUSIAN -#define LANG_BELARUSIAN 0x23 -#endif -#ifndef LANG_BENGALI -#define LANG_BENGALI 0x45 -#endif -#ifndef LANG_CATALAN -#define LANG_CATALAN 0x03 -#endif -#ifndef LANG_ESTONIAN -#define LANG_ESTONIAN 0x25 -#endif -#ifndef LANG_FAEROESE -#define LANG_FAEROESE 0x38 -#endif -#ifndef LANG_FARSI -#define LANG_FARSI 0x29 -#endif -#ifndef LANG_GEORGIAN -#define LANG_GEORGIAN 0x37 -#endif -#ifndef LANG_GUJARATI -#define LANG_GUJARATI 0x47 -#endif -#ifndef LANG_HEBREW -#define LANG_HEBREW 0x0d -#endif -#ifndef LANG_HINDI -#define LANG_HINDI 0x39 -#endif -#ifndef LANG_INDONESIAN -#define LANG_INDONESIAN 0x21 -#endif -#ifndef LANG_KANNADA -#define LANG_KANNADA 0x4b -#endif -#ifndef LANG_KASHMIRI -#define LANG_KASHMIRI 0x60 -#endif -#ifndef LANG_KAZAK -#define LANG_KAZAK 0x3f -#endif -#ifndef LANG_KONKANI -#define LANG_KONKANI 0x57 -#endif -#ifndef LANG_LATVIAN -#define LANG_LATVIAN 0x26 -#endif -#ifndef LANG_LITHUANIAN -#define LANG_LITHUANIAN 0x27 -#endif -#ifndef LANG_MACEDONIAN -#define LANG_MACEDONIAN 0x2f -#endif -#ifndef LANG_MALAY -#define LANG_MALAY 0x3e -#endif -#ifndef LANG_MALAYALAM -#define LANG_MALAYALAM 0x4c -#endif -#ifndef LANG_MANIPURI -#define LANG_MANIPURI 0x58 -#endif -#ifndef LANG_MARATHI -#define LANG_MARATHI 0x4e -#endif -#ifndef LANG_NEPALI -#define LANG_NEPALI 0x61 -#endif -#ifndef LANG_ORIYA -#define LANG_ORIYA 0x48 -#endif -#ifndef LANG_PUNJABI -#define LANG_PUNJABI 0x46 -#endif -#ifndef LANG_SANSKRIT -#define LANG_SANSKRIT 0x4f -#endif -#ifndef LANG_SERBIAN -#define LANG_SERBIAN 0x1a -#endif -#ifndef LANG_SINDHI -#define LANG_SINDHI 0x59 -#endif -#ifndef LANG_SLOVAK -#define LANG_SLOVAK 0x1b -#endif -#ifndef LANG_SWAHILI -#define LANG_SWAHILI 0x41 -#endif -#ifndef LANG_TAMIL -#define LANG_TAMIL 0x49 -#endif -#ifndef LANG_TATAR -#define LANG_TATAR 0x44 -#endif -#ifndef LANG_TELUGU -#define LANG_TELUGU 0x4a -#endif -#ifndef LANG_THAI -#define LANG_THAI 0x1e -#endif -#ifndef LANG_UKRAINIAN -#define LANG_UKRAINIAN 0x22 -#endif -#ifndef LANG_URDU -#define LANG_URDU 0x20 -#endif -#ifndef LANG_UZBEK -#define LANG_UZBEK 0x43 -#endif -#ifndef LANG_VIETNAMESE -#define LANG_VIETNAMESE 0x2a -#endif -#ifndef SUBLANG_ARABIC_SAUDI_ARABIA -#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 -#endif -#ifndef SUBLANG_ARABIC_IRAQ -#define SUBLANG_ARABIC_IRAQ 0x02 -#endif -#ifndef SUBLANG_ARABIC_EGYPT -#define SUBLANG_ARABIC_EGYPT 0x03 -#endif -#ifndef SUBLANG_ARABIC_LIBYA -#define SUBLANG_ARABIC_LIBYA 0x04 -#endif -#ifndef SUBLANG_ARABIC_ALGERIA -#define SUBLANG_ARABIC_ALGERIA 0x05 -#endif -#ifndef SUBLANG_ARABIC_MOROCCO -#define SUBLANG_ARABIC_MOROCCO 0x06 -#endif -#ifndef SUBLANG_ARABIC_TUNISIA -#define SUBLANG_ARABIC_TUNISIA 0x07 -#endif -#ifndef SUBLANG_ARABIC_OMAN -#define SUBLANG_ARABIC_OMAN 0x08 -#endif -#ifndef SUBLANG_ARABIC_YEMEN -#define SUBLANG_ARABIC_YEMEN 0x09 -#endif -#ifndef SUBLANG_ARABIC_SYRIA -#define SUBLANG_ARABIC_SYRIA 0x0a -#endif -#ifndef SUBLANG_ARABIC_JORDAN -#define SUBLANG_ARABIC_JORDAN 0x0b -#endif -#ifndef SUBLANG_ARABIC_LEBANON -#define SUBLANG_ARABIC_LEBANON 0x0c -#endif -#ifndef SUBLANG_ARABIC_KUWAIT -#define SUBLANG_ARABIC_KUWAIT 0x0d -#endif -#ifndef SUBLANG_ARABIC_UAE -#define SUBLANG_ARABIC_UAE 0x0e -#endif -#ifndef SUBLANG_ARABIC_BAHRAIN -#define SUBLANG_ARABIC_BAHRAIN 0x0f -#endif -#ifndef SUBLANG_ARABIC_QATAR -#define SUBLANG_ARABIC_QATAR 0x10 -#endif -#ifndef SUBLANG_AZERI_LATIN -#define SUBLANG_AZERI_LATIN 0x01 -#endif -#ifndef SUBLANG_AZERI_CYRILLIC -#define SUBLANG_AZERI_CYRILLIC 0x02 -#endif -#ifndef SUBLANG_CHINESE_MACAU -#define SUBLANG_CHINESE_MACAU 0x05 -#endif -#ifndef SUBLANG_ENGLISH_SOUTH_AFRICA -#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 -#endif -#ifndef SUBLANG_ENGLISH_JAMAICA -#define SUBLANG_ENGLISH_JAMAICA 0x08 -#endif -#ifndef SUBLANG_ENGLISH_CARIBBEAN -#define SUBLANG_ENGLISH_CARIBBEAN 0x09 -#endif -#ifndef SUBLANG_ENGLISH_BELIZE -#define SUBLANG_ENGLISH_BELIZE 0x0a -#endif -#ifndef SUBLANG_ENGLISH_TRINIDAD -#define SUBLANG_ENGLISH_TRINIDAD 0x0b -#endif -#ifndef SUBLANG_ENGLISH_ZIMBABWE -#define SUBLANG_ENGLISH_ZIMBABWE 0x0c -#endif -#ifndef SUBLANG_ENGLISH_PHILIPPINES -#define SUBLANG_ENGLISH_PHILIPPINES 0x0d -#endif -#ifndef SUBLANG_FRENCH_LUXEMBOURG -#define SUBLANG_FRENCH_LUXEMBOURG 0x05 -#endif -#ifndef SUBLANG_FRENCH_MONACO -#define SUBLANG_FRENCH_MONACO 0x06 -#endif -#ifndef SUBLANG_GERMAN_LUXEMBOURG -#define SUBLANG_GERMAN_LUXEMBOURG 0x04 -#endif -#ifndef SUBLANG_GERMAN_LIECHTENSTEIN -#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 -#endif -#ifndef SUBLANG_KASHMIRI_INDIA -#define SUBLANG_KASHMIRI_INDIA 0x02 -#endif -#ifndef SUBLANG_MALAY_MALAYSIA -#define SUBLANG_MALAY_MALAYSIA 0x01 -#endif -#ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM -#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 -#endif -#ifndef SUBLANG_NEPALI_INDIA -#define SUBLANG_NEPALI_INDIA 0x02 -#endif -#ifndef SUBLANG_SERBIAN_LATIN -#define SUBLANG_SERBIAN_LATIN 0x02 -#endif -#ifndef SUBLANG_SERBIAN_CYRILLIC -#define SUBLANG_SERBIAN_CYRILLIC 0x03 -#endif -#ifndef SUBLANG_SPANISH_GUATEMALA -#define SUBLANG_SPANISH_GUATEMALA 0x04 -#endif -#ifndef SUBLANG_SPANISH_COSTA_RICA -#define SUBLANG_SPANISH_COSTA_RICA 0x05 -#endif -#ifndef SUBLANG_SPANISH_PANAMA -#define SUBLANG_SPANISH_PANAMA 0x06 -#endif -#ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC -#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 -#endif -#ifndef SUBLANG_SPANISH_VENEZUELA -#define SUBLANG_SPANISH_VENEZUELA 0x08 -#endif -#ifndef SUBLANG_SPANISH_COLOMBIA -#define SUBLANG_SPANISH_COLOMBIA 0x09 -#endif -#ifndef SUBLANG_SPANISH_PERU -#define SUBLANG_SPANISH_PERU 0x0a -#endif -#ifndef SUBLANG_SPANISH_ARGENTINA -#define SUBLANG_SPANISH_ARGENTINA 0x0b -#endif -#ifndef SUBLANG_SPANISH_ECUADOR -#define SUBLANG_SPANISH_ECUADOR 0x0c -#endif -#ifndef SUBLANG_SPANISH_CHILE -#define SUBLANG_SPANISH_CHILE 0x0d -#endif -#ifndef SUBLANG_SPANISH_URUGUAY -#define SUBLANG_SPANISH_URUGUAY 0x0e -#endif -#ifndef SUBLANG_SPANISH_PARAGUAY -#define SUBLANG_SPANISH_PARAGUAY 0x0f -#endif -#ifndef SUBLANG_SPANISH_BOLIVIA -#define SUBLANG_SPANISH_BOLIVIA 0x10 -#endif -#ifndef SUBLANG_SPANISH_EL_SALVADOR -#define SUBLANG_SPANISH_EL_SALVADOR 0x11 -#endif -#ifndef SUBLANG_SPANISH_HONDURAS -#define SUBLANG_SPANISH_HONDURAS 0x12 -#endif -#ifndef SUBLANG_SPANISH_NICARAGUA -#define SUBLANG_SPANISH_NICARAGUA 0x13 -#endif -#ifndef SUBLANG_SPANISH_PUERTO_RICO -#define SUBLANG_SPANISH_PUERTO_RICO 0x14 -#endif -#ifndef SUBLANG_SWEDISH_FINLAND -#define SUBLANG_SWEDISH_FINLAND 0x02 -#endif -#ifndef SUBLANG_URDU_PAKISTAN -#define SUBLANG_URDU_PAKISTAN 0x01 -#endif -#ifndef SUBLANG_URDU_INDIA -#define SUBLANG_URDU_INDIA 0x02 -#endif -#ifndef SUBLANG_UZBEK_LATIN -#define SUBLANG_UZBEK_LATIN 0x01 -#endif -#ifndef SUBLANG_UZBEK_CYRILLIC -#define SUBLANG_UZBEK_CYRILLIC 0x02 -#endif - -/** - * g_win32_getlocale: - * - * The setlocale in the Microsoft C library uses locale names of the - * form "English_United States.1252" etc. We want the Unixish standard - * form "en", "zh_TW" etc. This function gets the current thread - * locale from Windows and returns it as a string of the above form - * for use in forming file names etc. The returned string should be - * deallocated with g_free(). - * - * Returns: allocated locale name - */ - -gchar * -g_win32_getlocale (void) -{ - LCID lcid; - gchar *ev; - gint primary, sub; - gchar *l = NULL, *sl = NULL; - gchar bfr[20]; - - if ((ev = getenv ("LC_ALL")) != NULL - || (ev = getenv ("LC_CTYPE")) != NULL - || (ev = getenv ("LANG")) != NULL) - return g_strdup (ev); - - lcid = GetThreadLocale (); - primary = PRIMARYLANGID (LANGIDFROMLCID (lcid)); - sub = SUBLANGID (LANGIDFROMLCID (lcid)); - switch (primary) - { - case LANG_AFRIKAANS: l = "af"; break; - case LANG_ALBANIAN: l = "sq"; break; - case LANG_ARABIC: - l = "ar"; - switch (sub) - { - case SUBLANG_ARABIC_SAUDI_ARABIA: sl = "SA"; break; - case SUBLANG_ARABIC_IRAQ: sl = "IQ"; break; - case SUBLANG_ARABIC_EGYPT: sl = "EG"; break; - case SUBLANG_ARABIC_LIBYA: sl = "LY"; break; - case SUBLANG_ARABIC_ALGERIA: sl = "DZ"; break; - case SUBLANG_ARABIC_MOROCCO: sl = "MA"; break; - case SUBLANG_ARABIC_TUNISIA: sl = "TN"; break; - case SUBLANG_ARABIC_OMAN: sl = "OM"; break; - case SUBLANG_ARABIC_YEMEN: sl = "YE"; break; - case SUBLANG_ARABIC_SYRIA: sl = "SY"; break; - case SUBLANG_ARABIC_JORDAN: sl = "JO"; break; - case SUBLANG_ARABIC_LEBANON: sl = "LB"; break; - case SUBLANG_ARABIC_KUWAIT: sl = "KW"; break; - case SUBLANG_ARABIC_UAE: sl = "AE"; break; - case SUBLANG_ARABIC_BAHRAIN: sl = "BH"; break; - case SUBLANG_ARABIC_QATAR: sl = "QA"; break; - } - break; - case LANG_ARMENIAN: l = "hy"; break; - case LANG_ASSAMESE: l = "as"; break; - case LANG_AZERI: l = "az"; break; - case LANG_BASQUE: l = "eu"; break; - case LANG_BELARUSIAN: l = "be"; break; - case LANG_BENGALI: l = "bn"; break; - case LANG_BULGARIAN: l = "bg"; break; - case LANG_CATALAN: l = "ca"; break; - case LANG_CHINESE: - l = "zh"; - switch (sub) - { - case SUBLANG_CHINESE_TRADITIONAL: sl = "TW"; break; - case SUBLANG_CHINESE_SIMPLIFIED: sl = "CH"; break; - case SUBLANG_CHINESE_HONGKONG: sl = "HK"; break; - case SUBLANG_CHINESE_SINGAPORE: sl = "SG"; break; - case SUBLANG_CHINESE_MACAU: sl = "MO"; break; - } - break; - case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN - * What used to be called Serbo-Croatian - * should really now be two separate - * languages because of political reasons. - * (Says tml, who knows nothing about Serbian - * or Croatian.) - * (I can feel those flames coming already.) - */ - switch (sub) - { - case SUBLANG_SERBIAN_LATIN: l = "sp"; break; - case SUBLANG_SERBIAN_CYRILLIC: l = "sr"; break; - default: l = "hr"; /* ??? */ - } - break; - case LANG_CZECH: l = "cs"; break; - case LANG_DANISH: l = "da"; break; - case LANG_DUTCH: - l = "nl"; - switch (sub) - { - case SUBLANG_DUTCH_BELGIAN: sl = "BE"; break; - } - break; - case LANG_ENGLISH: - l = "en"; - switch (sub) - { - /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought - * English was the language spoken in England. - * Oh well. - */ - case SUBLANG_ENGLISH_UK: sl = "GB"; break; - case SUBLANG_ENGLISH_AUS: sl = "AU"; break; - case SUBLANG_ENGLISH_CAN: sl = "CA"; break; - case SUBLANG_ENGLISH_NZ: sl = "NZ"; break; - case SUBLANG_ENGLISH_EIRE: sl = "IE"; break; - case SUBLANG_ENGLISH_SOUTH_AFRICA: sl = "ZA"; break; - case SUBLANG_ENGLISH_JAMAICA: sl = "JM"; break; - case SUBLANG_ENGLISH_CARIBBEAN: sl = "@caribbean"; break; /* ??? */ - case SUBLANG_ENGLISH_BELIZE: sl = "BZ"; break; - case SUBLANG_ENGLISH_TRINIDAD: sl = "TT"; break; - case SUBLANG_ENGLISH_ZIMBABWE: sl = "ZW"; break; - case SUBLANG_ENGLISH_PHILIPPINES: sl = "PH"; break; - } - break; - case LANG_ESTONIAN: l = "et"; break; - case LANG_FAEROESE: l = "fo"; break; - case LANG_FARSI: l = "fa"; break; - case LANG_FINNISH: l = "fi"; break; - case LANG_FRENCH: - l = "fr"; - switch (sub) - { - case SUBLANG_FRENCH_BELGIAN: sl = "BE"; break; - case SUBLANG_FRENCH_CANADIAN: sl = "CA"; break; - case SUBLANG_FRENCH_SWISS: sl = "CH"; break; - case SUBLANG_FRENCH_LUXEMBOURG: sl = "LU"; break; - case SUBLANG_FRENCH_MONACO: sl = "MC"; break; - } - break; - case LANG_GEORGIAN: l = "ka"; break; - case LANG_GERMAN: - l = "de"; - switch (sub) - { - case SUBLANG_GERMAN_SWISS: sl = "CH"; break; - case SUBLANG_GERMAN_AUSTRIAN: sl = "AT"; break; - case SUBLANG_GERMAN_LUXEMBOURG: sl = "LU"; break; - case SUBLANG_GERMAN_LIECHTENSTEIN: sl = "LI"; break; - } - break; - case LANG_GREEK: l = "el"; break; - case LANG_GUJARATI: l = "gu"; break; - case LANG_HEBREW: l = "he"; break; - case LANG_HINDI: l = "hi"; break; - case LANG_HUNGARIAN: l = "hu"; break; - case LANG_ICELANDIC: l = "is"; break; - case LANG_INDONESIAN: l = "id"; break; - case LANG_ITALIAN: - l = "it"; - switch (sub) - { - case SUBLANG_ITALIAN_SWISS: sl = "CH"; break; - } - break; - case LANG_JAPANESE: l = "ja"; break; - case LANG_KANNADA: l = "kn"; break; - case LANG_KASHMIRI: - l = "ks"; - switch (sub) - { - case SUBLANG_KASHMIRI_INDIA: sl = "IN"; break; - } - break; - case LANG_KAZAK: l = "kk"; break; - case LANG_KONKANI: l = "kok"; break; /* ??? */ - case LANG_KOREAN: l = "ko"; break; - case LANG_LATVIAN: l = "lv"; break; - case LANG_LITHUANIAN: l = "lt"; break; - case LANG_MACEDONIAN: l = "mk"; break; - case LANG_MALAY: - l = "ms"; - switch (sub) - { - case SUBLANG_MALAY_BRUNEI_DARUSSALAM: sl = "BN"; break; - } - break; - case LANG_MALAYALAM: l = "ml"; break; - case LANG_MANIPURI: l = "mni"; break; - case LANG_MARATHI: l = "mr"; break; - case LANG_NEPALI: - l = "ne"; - switch (sub) - { - case SUBLANG_NEPALI_INDIA: sl = "IN"; break; - } - break; - case LANG_NORWEGIAN: - l = "no"; - switch (sub) - { - /* SUBLANG_NORWEGIAN_BOKMAL == SUBLANG_DEFAULT */ - case SUBLANG_NORWEGIAN_NYNORSK: l = "nn"; break; - } - break; - case LANG_ORIYA: l = "or"; break; - case LANG_POLISH: l = "pl"; break; - case LANG_PORTUGUESE: - l = "pt"; - switch (sub) - { - /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT */ - case SUBLANG_PORTUGUESE_BRAZILIAN: sl = "BR"; break; - } - break; - case LANG_PUNJABI: l = "pa"; break; - case LANG_ROMANIAN: l = "ro"; break; - case LANG_RUSSIAN: l = "ru"; break; - case LANG_SANSKRIT: l = "sa"; break; - case LANG_SINDHI: l = "sd"; break; - case LANG_SLOVAK: l = "sk"; break; - case LANG_SLOVENIAN: l = "sl"; break; - case LANG_SPANISH: - l = "es"; - switch (sub) - { - case SUBLANG_SPANISH_MEXICAN: sl = "MX"; break; - case SUBLANG_SPANISH_MODERN: sl = "@modern"; break; /* ??? */ - case SUBLANG_SPANISH_GUATEMALA: sl = "GT"; break; - case SUBLANG_SPANISH_COSTA_RICA: sl = "CR"; break; - case SUBLANG_SPANISH_PANAMA: sl = "PA"; break; - case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: sl = "DO"; break; - case SUBLANG_SPANISH_VENEZUELA: sl = "VE"; break; - case SUBLANG_SPANISH_COLOMBIA: sl = "CO"; break; - case SUBLANG_SPANISH_PERU: sl = "PE"; break; - case SUBLANG_SPANISH_ARGENTINA: sl = "AR"; break; - case SUBLANG_SPANISH_ECUADOR: sl = "EC"; break; - case SUBLANG_SPANISH_CHILE: sl = "CL"; break; - case SUBLANG_SPANISH_URUGUAY: sl = "UY"; break; - case SUBLANG_SPANISH_PARAGUAY: sl = "PY"; break; - case SUBLANG_SPANISH_BOLIVIA: sl = "BO"; break; - case SUBLANG_SPANISH_EL_SALVADOR: sl = "SV"; break; - case SUBLANG_SPANISH_HONDURAS: sl = "HN"; break; - case SUBLANG_SPANISH_NICARAGUA: sl = "NI"; break; - case SUBLANG_SPANISH_PUERTO_RICO: sl = "PR"; break; - } - break; - case LANG_SWAHILI: l = "sw"; break; - case LANG_SWEDISH: - l = "sv"; - switch (sub) - { - case SUBLANG_SWEDISH_FINLAND: sl = "FI"; break; - } - break; - case LANG_TAMIL: l = "ta"; break; - case LANG_TATAR: l = "tt"; break; - case LANG_TELUGU: l = "te"; break; - case LANG_THAI: l = "th"; break; - case LANG_TURKISH: l = "tr"; break; - case LANG_UKRAINIAN: l = "uk"; break; - case LANG_URDU: - l = "ur"; - switch (sub) - { - case SUBLANG_URDU_PAKISTAN: sl = "PK"; break; - case SUBLANG_URDU_INDIA: sl = "IN"; break; - } - break; - case LANG_UZBEK: - l = "uz"; - switch (sub) - { - case SUBLANG_UZBEK_CYRILLIC: sl = "@cyrillic"; break; - } - break; - case LANG_VIETNAMESE: l = "vi"; break; - default: l = "xx"; break; - } - strcpy (bfr, l); - if (sl != NULL) - { - if (sl[0] != '@') - strcat (bfr, "_"); - strcat (bfr, sl); - } - - return g_strdup (bfr); -} - -/** - * g_win32_error_message: - * @error: error code - * - * Translate a Win32 error code (as returned by GetLastError()) into - * the corresponding message. The message is either language neutral, - * or in the thread's language, or the user's language, the system's - * langauge, or US English (see docs for FormatMessage). The returned - * string should be deallocated with g_free(). - * - * Returns: allocated error message - */ -gchar * -g_win32_error_message (gint error) -{ - gchar *msg; - gchar *retval; - int nbytes; - - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER - |FORMAT_MESSAGE_IGNORE_INSERTS - |FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, 0, - (LPTSTR) &msg, 0, NULL); - nbytes = strlen (msg); - - if (nbytes > 2 && msg[nbytes-1] == '\n' && msg[nbytes-2] == '\r') - msg[nbytes-2] = '\0'; - - retval = g_strdup (msg); - - if (msg != NULL) - LocalFree (msg); - - return retval; -} - -static gchar * -get_package_directory_from_module (gchar *module_name) -{ - static GHashTable *module_dirs = NULL; - HMODULE hmodule = NULL; - gchar *fn; - gchar *p; - gchar *result; - - if (module_dirs == NULL) - module_dirs = g_hash_table_new (g_str_hash, g_str_equal); - - result = g_hash_table_lookup (module_dirs, module_name ? module_name : ""); - - if (result) - return g_strdup (result); - - if (module_name) - { - hmodule = GetModuleHandle (module_name); - if (!hmodule) - return NULL; - } - - fn = g_malloc (MAX_PATH); - if (!GetModuleFileName (hmodule, fn, MAX_PATH)) - return NULL; - -#ifdef G_WITH_CYGWIN - /* In Cygwin we need to have POSIX paths */ - { - gchar tmp[MAX_PATH]; - - cygwin_conv_to_posix_path(fn, tmp); - g_free(fn); - fn = g_strdup(tmp); - } -#endif - - if ((p = strrchr (fn, G_DIR_SEPARATOR)) != NULL) - *p = '\0'; - - if (module_name) - { - p = strrchr (fn, G_DIR_SEPARATOR); - if (p && (g_strcasecmp (p + 1, "bin") == 0 || - g_strcasecmp (p + 1, "lib") == 0)) - *p = '\0'; - } - - g_hash_table_insert (module_dirs, module_name ? module_name : "", fn); - - return g_strdup (fn); -} - -/** - * g_win32_get_package_installation_directory: - * @package: An identifier for a software package, or NULL - * @dll_name: The name of a DLL that a package provides, or NULL - * - * Try to determine the installation directory for a software package. - * Typically used by GNU software packages. - * - * @package should be a short identifier for the package. Typically it - * is the same identifier as used for GETTEXT_PACKAGE in software - * configured accoring to GNU standards. The function first looks in - * the Windows Registry for the value #InstallationDirectory in the - * key #HKLM\Software\@package, and if that value exists and is a - * string, returns that. - * - * If @package is NULL, or the above value isn't found in the - * Registry, but @dll_name is non-NULL, it should name a DLL loaded - * into the current process. Typically that would be the name of the - * DLL calling this function, looking for its installation - * directory. The function then asks Windows what directory that DLL - * was loaded from. If that directory's last component is "bin" or - * "lib", the parent directory is returned, otherwise the directory - * itself. If that DLL isn't loaded, the function proceeds as if - * @dll_name was NULL. - * - * If both @package and @dll_name are NULL, the directory from where - * the main executable of the process was loaded is uses instead in - * the same way as above. - * - * The return value should be freed with g_free() when not needed any longer. */ - -gchar * -g_win32_get_package_installation_directory (gchar *package, - gchar *dll_name) -{ - static GHashTable *package_dirs = NULL; - gchar *result = NULL; - gchar *key; - HKEY reg_key = NULL; - DWORD type; - DWORD nbytes; - - if (package != NULL) - { - if (package_dirs == NULL) - package_dirs = g_hash_table_new (g_str_hash, g_str_equal); - - result = g_hash_table_lookup (package_dirs, package); - - if (result && result[0]) - return g_strdup (result); - - key = g_strconcat ("Software\\", package, NULL); - - nbytes = 0; - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, key, 0, - KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS - && RegQueryValueEx (reg_key, "InstallationDirectory", 0, - &type, NULL, &nbytes) == ERROR_SUCCESS - && type == REG_SZ) - { - result = g_malloc (nbytes + 1); - RegQueryValueEx (reg_key, "InstallationDirectory", 0, - &type, result, &nbytes); - result[nbytes] = '\0'; - } - - if (reg_key != NULL) - RegCloseKey (reg_key); - - g_free (key); - - } - if (result) - { - g_hash_table_insert (package_dirs, package, result); - return g_strdup (result); - } - - if (dll_name != NULL) - result = get_package_directory_from_module (dll_name); - - if (result == NULL) - result = get_package_directory_from_module (NULL); - - return result; -} - -/** - * g_win32_get_package_installation_subdirectory: - * @package: An identifier for a software package, or NULL - * @dll_name: The name of a DLL that a package provides, or NULL - * @subdir: A subdirectory of the package installation directory. - * - * Returns a string containg the path of the subdirectory @subdir in - * the return value from calling - * g_win32_get_package_installation_directory() with the @package and - * @dll_name parameters. The return value should be freed with - * g_free() when no longer needed. - */ - -gchar * -g_win32_get_package_installation_subdirectory (gchar *package, - gchar *dll_name, - gchar *subdir) -{ - gchar *prefix; - gchar *sep; - - prefix = g_win32_get_package_installation_directory (package, dll_name); - - sep = (prefix[strlen (prefix) - 1] == G_DIR_SEPARATOR ? - "" : G_DIR_SEPARATOR_S); - - return g_strconcat (prefix, sep, subdir, NULL); -} diff --git a/gwin32.h b/gwin32.h deleted file mode 100644 index d3592490..00000000 --- a/gwin32.h +++ /dev/null @@ -1,130 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __G_WIN32_H__ -#define __G_WIN32_H__ - -#include - -#ifdef G_PLATFORM_WIN32 - -/* Windows emulation stubs for common Unix functions - */ - -G_BEGIN_DECLS - -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -#ifdef _MSC_VER -typedef int pid_t; -#endif - -#ifdef G_OS_WIN32 - -/* - * To get prototypes for the following POSIXish functions, you have to - * include the indicated non-POSIX headers. The functions are defined - * in OLDNAMES.LIB (MSVC) or -lmoldname-msvc (mingw32). - * - * getcwd: (MSVC), (mingw32) - * getpid: - * access: - * unlink: or - * open, read, write, lseek, close: - * rmdir: - * pipe: - */ - -/* pipe is not in OLDNAMES.LIB or -lmoldname-msvc. */ -#define pipe(phandles) _pipe (phandles, 4096, _O_BINARY) - -/* For some POSIX functions that are not provided by the MS runtime, - * we provide emulators in glib, which are prefixed with g_win32_. - */ -# define ftruncate(fd, size) g_win32_ftruncate (fd, size) - -/* -lmingw32 also has emulations for these, but we need our own - * for MSVC anyhow, so we might aswell use them always. - */ -# define opendir g_win32_opendir -# define readdir g_win32_readdir -# define rewinddir g_win32_rewinddir -# define closedir g_win32_closedir -# define NAME_MAX 255 - -struct dirent -{ - gchar d_name[NAME_MAX + 1]; -}; - -struct DIR -{ - gchar *dir_name; - gboolean just_opened; - guint find_file_handle; - gpointer find_file_data; - struct dirent readdir_result; -}; -typedef struct DIR DIR; - -/* emulation functions */ -gint g_win32_ftruncate (gint f, - guint size); -DIR* g_win32_opendir (const gchar *dirname); -struct dirent* g_win32_readdir (DIR *dir); -void g_win32_rewinddir (DIR *dir); -gint g_win32_closedir (DIR *dir); - -#endif /* G_OS_WIN32 */ - -/* The MS setlocale uses locale names of the form "English_United - * States.1252" etc. We want the Unixish standard form "en", "zh_TW" - * etc. This function gets the current thread locale from Windows and - * returns it as a string of the above form for use in forming file - * names etc. The returned string should be deallocated with g_free(). - */ -gchar* g_win32_getlocale (void); - -/* Translate a Win32 error code (as returned by GetLastError()) into - * the corresponding message. The returned string should be deallocated - * with g_free(). - */ -gchar* g_win32_error_message (gint error); - -gchar* g_win32_get_package_installation_directory (gchar *package, - gchar *dll_name); - -gchar* g_win32_get_package_installation_subdirectory (gchar *package, - gchar *dll_name, - gchar *subdir); - -G_END_DECLS - -#endif /* G_PLATFORM_WIN32 */ - -#endif /* __G_WIN32_H__ */ diff --git a/testgdate.c b/testgdate.c deleted file mode 100644 index 01365f3f..00000000 --- a/testgdate.c +++ /dev/null @@ -1,489 +0,0 @@ -#ifdef GLIB_COMPILATION -#undef GLIB_COMPILATION -#endif - -#include "glib.h" - -#include -#include -#include -#include - -gboolean failed = FALSE; -guint32 passed = 0; -guint32 notpassed = 0; - -#define TEST(m,cond) G_STMT_START { failed = !(cond); \ -if (failed) \ - { ++notpassed; \ - if (!m) \ - g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ - else \ - g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ - } \ -else \ - ++passed; \ - if ((passed+notpassed) % 10000 == 0) g_print ("."); fflush (stdout); \ -} G_STMT_END - -void g_date_debug_print(GDate* d) -{ - if (!d) g_print("NULL!\n"); - else - g_print("julian: %u (%s) DMY: %u %u %u (%s)\n", - d->julian_days, - d->julian ? "valid" : "invalid", - d->day, - d->month, - d->year, - d->dmy ? "valid" : "invalid"); - - fflush(stdout); -} - -int main(int argc, char** argv) -{ - GDate* d; - guint32 j; - GDateMonth m; - GDateYear y, prev_y; - GDateDay day; - gchar buf[101]; - gchar* loc; - /* Try to get all the leap year cases. */ - GDateYear check_years[] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, - 1598, 1599, 1600, 1601, 1602, 1650, 1651, - 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1961, 1962, 1963, 1964, 1965, 1967, - 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, - 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, - 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, - 3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003 - }; - guint n_check_years = sizeof(check_years)/sizeof(GDateYear); - guint i; - gboolean discontinuity; - - g_print("checking GDate..."); - - TEST("sizeof(GDate) is not more than 8 bytes on this platform", sizeof(GDate) < 9); - - d = g_date_new(); - - TEST("Empty constructor produces invalid date", !g_date_valid(d)); - - g_date_free(d); - - d = g_date_new_dmy(1,1,1); - - TEST("January 1, Year 1 created and valid", g_date_valid(d)); - - j = g_date_get_julian(d); - - TEST("January 1, Year 1 is Julian date 1", j == 1); - - TEST("Returned month is January", g_date_get_month(d) == G_DATE_JANUARY); - TEST("Returned day is 1", g_date_get_day(d) == 1); - TEST("Returned year is 1", g_date_get_year(d) == 1); - - TEST("Bad month is invalid", !g_date_valid_month(G_DATE_BAD_MONTH)); - TEST("Month 13 is invalid", !g_date_valid_month(13)); - TEST("Bad day is invalid", !g_date_valid_day(G_DATE_BAD_DAY)); - TEST("Day 32 is invalid", !g_date_valid_day(32)); - TEST("Bad year is invalid", !g_date_valid_year(G_DATE_BAD_YEAR)); - TEST("Bad julian is invalid", !g_date_valid_julian(G_DATE_BAD_JULIAN)); - TEST("Bad weekday is invalid", !g_date_valid_weekday(G_DATE_BAD_WEEKDAY)); - TEST("Year 2000 is a leap year", g_date_is_leap_year(2000)); - TEST("Year 1999 is not a leap year", !g_date_is_leap_year(1999)); - TEST("Year 1996 is a leap year", g_date_is_leap_year(1996)); - TEST("Year 1600 is a leap year", g_date_is_leap_year(1600)); - TEST("Year 2100 is not a leap year", !g_date_is_leap_year(2100)); - TEST("Year 1800 is not a leap year", !g_date_is_leap_year(1800)); - - g_date_free(d); - - loc = setlocale(LC_ALL,""); - if (loc) - g_print("\nLocale set to %s\n", loc); - else - g_print("\nLocale unchanged\n"); - - d = g_date_new(); - g_date_set_time(d, time(NULL)); - TEST("Today is valid", g_date_valid(d)); - - g_date_strftime(buf,100,"Today is a %A, %x\n", d); - g_print("%s", buf); - - g_date_set_time(d, 1); - TEST("Beginning of Unix epoch is valid", g_date_valid(d)); - - g_date_strftime(buf,100,"1 second into the Unix epoch it was a %A, in the month of %B, %x\n", d); - g_print("%s", buf); - - g_date_set_julian(d, 1); - TEST("GDate's \"Julian\" epoch's first day is valid", g_date_valid(d)); - - g_date_strftime(buf,100,"Our \"Julian\" epoch begins on a %A, in the month of %B, %x\n", - d); - g_print("%s", buf); - - g_date_set_dmy(d, 10, 1, 2000); - - g_date_strftime(buf,100,"%x", d); - - g_date_set_parse(d, buf); - /* Note: this test will hopefully work, but no promises. */ - TEST("Successfully parsed a %x-formatted string", - g_date_valid(d) && - g_date_get_month(d) == 1 && - g_date_get_day(d) == 10 && - g_date_get_year(d) == 2000); - if (failed) - g_date_debug_print(d); - - g_date_free(d); - - j = G_DATE_BAD_JULIAN; - - i = 0; - discontinuity = TRUE; - y = check_years[0]; - prev_y = G_DATE_BAD_YEAR; - while (i < n_check_years) - { - guint32 first_day_of_year = G_DATE_BAD_JULIAN; - guint16 days_in_year = g_date_is_leap_year(y) ? 366 : 365; - guint sunday_week_of_year = 0; - guint sunday_weeks_in_year = g_date_get_sunday_weeks_in_year(y); - guint monday_week_of_year = 0; - guint monday_weeks_in_year = g_date_get_monday_weeks_in_year(y); - - if (discontinuity) - g_print(" (Break in sequence of requested years to check)\n"); - - g_print("Checking year %u", y); - - TEST("Year is valid", g_date_valid_year(y)); - - TEST("Number of Sunday weeks in year is 52 or 53", - sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53); - - TEST("Number of Monday weeks in year is 52 or 53", - monday_weeks_in_year == 52 || monday_weeks_in_year == 53); - - m = 1; - while (m < 13) - { - guint8 dim = g_date_get_days_in_month(m,y); - GDate days[31]; /* This is the fast way, no allocation */ - - TEST("Sensible number of days in month", (dim > 0 && dim < 32)); - - TEST("Month between 1 and 12 is valid", g_date_valid_month(m)); - - day = 1; - - g_date_clear(days, 31); - - while (day <= dim) - { - guint i; - GDate tmp; - - TEST("DMY triplet is valid", g_date_valid_dmy(day,m,y)); - - /* Create GDate with triplet */ - - d = &days[day-1]; - - TEST("Cleared day is invalid", !g_date_valid(d)); - - g_date_set_dmy(d,day,m,y); - - TEST("Set day is valid", g_date_valid(d)); - - if (m == G_DATE_JANUARY && day == 1) - { - first_day_of_year = g_date_get_julian(d); - } - - g_assert(first_day_of_year != G_DATE_BAD_JULIAN); - - TEST("Date with DMY triplet is valid", g_date_valid(d)); - TEST("Month accessor works", g_date_get_month(d) == m); - TEST("Year accessor works", g_date_get_year(d) == y); - TEST("Day of month accessor works", g_date_get_day(d) == day); - - TEST("Day of year is consistent with Julian dates", - ((g_date_get_julian(d) + 1 - first_day_of_year) == - (g_date_get_day_of_year(d)))); - - if (failed) - { - g_print("first day: %u this day: %u day of year: %u\n", - first_day_of_year, - g_date_get_julian(d), - g_date_get_day_of_year(d)); - } - - if (m == G_DATE_DECEMBER && day == 31) - { - TEST("Last day of year equals number of days in year", - g_date_get_day_of_year(d) == days_in_year); - if (failed) - { - g_print("last day: %u days in year: %u\n", - g_date_get_day_of_year(d), days_in_year); - } - } - - TEST("Day of year is not more than number of days in the year", - g_date_get_day_of_year(d) <= days_in_year); - - TEST("Monday week of year is not more than number of weeks in the year", - g_date_get_monday_week_of_year(d) <= monday_weeks_in_year); - if (failed) - { - g_print("Weeks in year: %u\n", monday_weeks_in_year); - g_date_debug_print(d); - } - TEST("Monday week of year is >= than last week of year", - g_date_get_monday_week_of_year(d) >= monday_week_of_year); - - if (g_date_get_weekday(d) == G_DATE_MONDAY) - { - - TEST("Monday week of year on Monday 1 more than previous day's week of year", - (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 1); - } - else - { - TEST("Monday week of year on non-Monday 0 more than previous day's week of year", - (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 0); - } - - - monday_week_of_year = g_date_get_monday_week_of_year(d); - - - TEST("Sunday week of year is not more than number of weeks in the year", - g_date_get_sunday_week_of_year(d) <= sunday_weeks_in_year); - if (failed) - { - g_date_debug_print(d); - } - TEST("Sunday week of year is >= than last week of year", - g_date_get_sunday_week_of_year(d) >= sunday_week_of_year); - - if (g_date_get_weekday(d) == G_DATE_SUNDAY) - { - TEST("Sunday week of year on Sunday 1 more than previous day's week of year", - (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 1); - } - else - { - TEST("Sunday week of year on non-Sunday 0 more than previous day's week of year", - (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 0); - } - - sunday_week_of_year = g_date_get_sunday_week_of_year(d); - - TEST("Date is equal to itself", - g_date_compare(d,d) == 0); - - - /*************** Increments ***********/ - - i = 1; - while (i < 402) /* Need to get 400 year increments in */ - { - - /***** Days ******/ - tmp = *d; - g_date_add_days(d, i); - - TEST("Adding days gives a value greater than previous", - g_date_compare(d, &tmp) > 0); - - g_date_subtract_days(d, i); - TEST("Forward days then backward days returns us to current day", - g_date_get_day(d) == day); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - TEST("Forward days then backward days returns us to current month", - g_date_get_month(d) == m); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - TEST("Forward days then backward days returns us to current year", - g_date_get_year(d) == y); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - /******* Months ********/ - - tmp = *d; - g_date_add_months(d, i); - TEST("Adding months gives a larger value", - g_date_compare(d, &tmp) > 0); - g_date_subtract_months(d, i); - - TEST("Forward months then backward months returns us to current month", - g_date_get_month(d) == m); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - TEST("Forward months then backward months returns us to current year", - g_date_get_year(d) == y); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - - if (day < 29) - { - /* Day should be unchanged */ - - TEST("Forward months then backward months returns us to current day", - g_date_get_day(d) == day); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - } - else - { - /* reset the day for later tests */ - g_date_set_day(d, day); - } - - /******* Years ********/ - - tmp = *d; - g_date_add_years(d, i); - - TEST("Adding years gives a larger value", - g_date_compare(d,&tmp) > 0); - - g_date_subtract_years(d, i); - - TEST("Forward years then backward years returns us to current month", - g_date_get_month(d) == m); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - TEST("Forward years then backward years returns us to current year", - g_date_get_year(d) == y); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - - if (m != 2 && day != 29) - { - TEST("Forward years then backward years returns us to current day", - g_date_get_day(d) == day); - - if (failed) - { - g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); - g_date_debug_print(d); - } - } - else - { - g_date_set_day(d, day); /* reset */ - } - - i += 10; - } - - /***** increment test relative to our local Julian count */ - - if (!discontinuity) { - - /* We can only run sequence tests between sequential years */ - - TEST("Julians are sequential with increment 1", - j+1 == g_date_get_julian(d)); - if (failed) - { - g_print("Out of sequence, prev: %u expected: %u got: %u\n", - j, j+1, g_date_get_julian(d)); - } - - g_date_add_days(d,1); - TEST("Next day has julian 1 higher", - g_date_get_julian(d) == j + 2); - g_date_subtract_days(d, 1); - - if (j != G_DATE_BAD_JULIAN) - { - g_date_subtract_days(d, 1); - - TEST("Previous day has julian 1 lower", - g_date_get_julian(d) == j); - - g_date_add_days(d, 1); /* back to original */ - } - } - discontinuity = FALSE; /* goes away now */ - - fflush(stdout); - fflush(stderr); - - j = g_date_get_julian(d); /* inc current julian */ - - ++day; - } - ++m; - } - g_print(" done\n"); - ++i; - prev_y = y; - y = check_years[i]; - if (prev_y == G_DATE_BAD_YEAR || - (prev_y + 1) != y) discontinuity = TRUE; - } - - - g_print("\n%u tests passed, %u failed\n",passed, notpassed); - - return 0; -} - - diff --git a/testgdateparser.c b/testgdateparser.c deleted file mode 100644 index c6be8238..00000000 --- a/testgdateparser.c +++ /dev/null @@ -1,112 +0,0 @@ -#ifdef GLIB_COMPILATION -#undef GLIB_COMPILATION -#endif - -#include "glib.h" - -#include -#include -#include - -void g_date_debug_print(GDate* d) -{ - if (!d) g_print("NULL!\n"); - else - g_print("julian: %u (%s) DMY: %u %u %u (%s)\n", - d->julian_days, - d->julian ? "valid" : "invalid", - d->day, - d->month, - d->year, - d->dmy ? "valid" : "invalid"); - - fflush(stdout); -} - -/* These only work in the POSIX locale, maybe C too - - * type POSIX into the program to check them - */ -char* posix_tests [] = { - "19981024", - "981024", - "October 1998", - "October 98", - "oCT 98", - "10/24/98", - "10 -- 24 -- 98", - "10/24/1998", - "October 24, 1998", - NULL -}; - -int main(int argc, char** argv) -{ - GDate* d; - gchar* loc; - gchar input[1024]; - - loc = setlocale(LC_ALL,""); - if (loc) - g_print("\nLocale set to %s\n", loc); - else - g_print("\nLocale unchanged\n"); - - d = g_date_new(); - - while (fgets(input, 1023, stdin)) - { - if (input[0] == '\n') - { - g_print("Enter a date to parse and press enter, or type `POSIX':\n"); - continue; - } - - if (strcmp(input,"POSIX\n") == 0) - { - char** s = posix_tests; - while (*s) { - g_date_set_parse(d, *s); - - g_print("POSIXy parse test `%s' ...", *s); - - if (!g_date_valid(d)) - { - g_print(" failed.\n"); - } - else - { - gchar buf[256]; - - g_date_strftime(buf,100," parsed `%x' (%B %d %Y)\n", - d); - g_print("%s", buf); - } - - ++s; - } - } - else - { - g_date_set_parse(d, input); - - if (!g_date_valid(d)) - { - g_print("Parse failed.\n"); - } - else - { - gchar buf[256]; - - g_date_strftime(buf,100,"Parsed: `%x' (%B %d %Y)\n", - d); - g_print("%s", buf); - } - } - } - - g_date_free(d); - - return 0; -} - - diff --git a/testglib.c b/testglib.c deleted file mode 100644 index ec058616..00000000 --- a/testglib.c +++ /dev/null @@ -1,1252 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This 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. - * - * This 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 this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GLib Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GLib Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GLib at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#undef G_LOG_DOMAIN - -#ifdef GLIB_COMPILATION -#undef GLIB_COMPILATION -#endif - -#include -#include -#include - -#include "glib.h" - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef G_OS_WIN32 -#include /* For read(), write() etc */ -#endif - -static int array[10000]; -static gboolean failed = FALSE; - -#define TEST(m,cond) G_STMT_START { failed = !(cond); \ -if (failed) \ - { if (!m) \ - g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ - else \ - g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ - } \ -else \ - g_print ("."); fflush (stdout); \ -} G_STMT_END - -#define C2P(c) ((gpointer) ((long) (c))) -#define P2C(p) ((gchar) ((long) (p))) - -#define GLIB_TEST_STRING "el dorado " -#define GLIB_TEST_STRING_5 "el do" - -static gboolean -node_build_string (GNode *node, - gpointer data) -{ - gchar **p = data; - gchar *string; - gchar c[2] = "_"; - - c[0] = P2C (node->data); - - string = g_strconcat (*p ? *p : "", c, NULL); - g_free (*p); - *p = string; - - return FALSE; -} - -static void -g_node_test (void) -{ - GNode *root; - GNode *node; - GNode *node_B; - GNode *node_F; - GNode *node_G; - GNode *node_J; - guint i; - gchar *tstring, *cstring; - - g_print ("checking n-way trees: "); - failed = FALSE; - - root = g_node_new (C2P ('A')); - TEST (NULL, g_node_depth (root) == 1 && g_node_max_height (root) == 1); - - node_B = g_node_new (C2P ('B')); - g_node_append (root, node_B); - TEST (NULL, root->children == node_B); - - g_node_append_data (node_B, C2P ('E')); - g_node_prepend_data (node_B, C2P ('C')); - g_node_insert (node_B, 1, g_node_new (C2P ('D'))); - - node_F = g_node_new (C2P ('F')); - g_node_append (root, node_F); - TEST (NULL, root->children->next == node_F); - - node_G = g_node_new (C2P ('G')); - g_node_append (node_F, node_G); - node_J = g_node_new (C2P ('J')); - g_node_prepend (node_G, node_J); - g_node_insert (node_G, 42, g_node_new (C2P ('K'))); - g_node_insert_data (node_G, 0, C2P ('H')); - g_node_insert (node_G, 1, g_node_new (C2P ('I'))); - - TEST (NULL, g_node_depth (root) == 1); - TEST (NULL, g_node_max_height (root) == 4); - TEST (NULL, g_node_depth (node_G->children->next) == 4); - TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_LEAFS) == 7); - TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS) == 4); - TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 11); - TEST (NULL, g_node_max_height (node_F) == 3); - TEST (NULL, g_node_n_children (node_G) == 4); - TEST (NULL, g_node_find_child (root, G_TRAVERSE_ALL, C2P ('F')) == node_F); - TEST (NULL, g_node_find (root, G_LEVEL_ORDER, G_TRAVERSE_NON_LEAFS, C2P ('I')) == NULL); - TEST (NULL, g_node_find (root, G_IN_ORDER, G_TRAVERSE_LEAFS, C2P ('J')) == node_J); - - for (i = 0; i < g_node_n_children (node_B); i++) - { - node = g_node_nth_child (node_B, i); - TEST (NULL, P2C (node->data) == ('C' + i)); - } - - for (i = 0; i < g_node_n_children (node_G); i++) - TEST (NULL, g_node_child_position (node_G, g_node_nth_child (node_G, i)) == i); - - /* we have built: A - * / \ - * B F - * / | \ \ - * C D E G - * / /\ \ - * H I J K - * - * for in-order traversal, 'G' is considered to be the "left" - * child of 'F', which will cause 'F' to be the last node visited. - */ - - tstring = NULL; - g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "ABCDEFGHIJK") == 0); - g_free (tstring); tstring = NULL; - g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "CDEBHIJKGFA") == 0); - g_free (tstring); tstring = NULL; - g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "CBDEAHGIJKF") == 0); - g_free (tstring); tstring = NULL; - g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "ABFCDEGHIJK") == 0); - g_free (tstring); tstring = NULL; - - g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_LEAFS, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "CDEHIJK") == 0); - g_free (tstring); tstring = NULL; - g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_NON_LEAFS, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "ABFG") == 0); - g_free (tstring); tstring = NULL; - - g_node_reverse_children (node_B); - g_node_reverse_children (node_G); - - g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0); - g_free (tstring); tstring = NULL; - - cstring = NULL; - node = g_node_copy (root); - TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == g_node_n_nodes (node, G_TRAVERSE_ALL)); - TEST (NULL, g_node_max_height (root) == g_node_max_height (node)); - g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); - g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &cstring); - TEST (cstring, strcmp (tstring, cstring) == 0); - g_free (tstring); tstring = NULL; - g_free (cstring); cstring = NULL; - g_node_destroy (node); - - g_node_destroy (root); - - /* allocation tests */ - - root = g_node_new (NULL); - node = root; - - for (i = 0; i < 2048; i++) - { - g_node_append (node, g_node_new (NULL)); - if ((i%5) == 4) - node = node->children->next; - } - TEST (NULL, g_node_max_height (root) > 100); - TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 1 + 2048); - - g_node_destroy (root); - - if (!failed) - g_print ("ok\n"); -} - -static gboolean -my_hash_callback_remove (gpointer key, - gpointer value, - gpointer user_data) -{ - int *d = value; - - if ((*d) % 2) - return TRUE; - - return FALSE; -} - -static void -my_hash_callback_remove_test (gpointer key, - gpointer value, - gpointer user_data) -{ - int *d = value; - - if ((*d) % 2) - g_print ("bad!\n"); -} - -static void -my_hash_callback (gpointer key, - gpointer value, - gpointer user_data) -{ - int *d = value; - *d = 1; -} - -static guint -my_hash (gconstpointer key) -{ - return (guint) *((const gint*) key); -} - -static gboolean -my_hash_equal (gconstpointer a, - gconstpointer b) -{ - return *((const gint*) a) == *((const gint*) b); -} - -static gint -my_list_compare_one (gconstpointer a, gconstpointer b) -{ - gint one = *((const gint*)a); - gint two = *((const gint*)b); - return one-two; -} - -static gint -my_list_compare_two (gconstpointer a, gconstpointer b) -{ - gint one = *((const gint*)a); - gint two = *((const gint*)b); - return two-one; -} - -/* static void -my_list_print (gpointer a, gpointer b) -{ - gint three = *((gint*)a); - g_print("%d", three); -}; */ - -static gint -my_compare (gconstpointer a, - gconstpointer b) -{ - const char *cha = a; - const char *chb = b; - - return *cha - *chb; -} - -static gint -my_traverse (gpointer key, - gpointer value, - gpointer data) -{ - char *ch = key; - g_print ("%c ", *ch); - return FALSE; -} - -int -main (int argc, - char *argv[]) -{ - GList *list, *t; - GSList *slist, *st; - GHashTable *hash_table; - GMemChunk *mem_chunk; - GStringChunk *string_chunk; - GTimer *timer; - gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - gint morenums[10] = { 8, 9, 7, 0, 3, 2, 5, 1, 4, 6}; - gchar *string; - - gchar *mem[10000], *tmp_string = NULL, *tmp_string_2; - gint i, j; - GArray *garray; - GPtrArray *gparray; - GByteArray *gbarray; - GString *string1, *string2; - GTree *tree; - char chars[62]; - GRelation *relation; - GTuples *tuples; - gint data [1024]; - struct { - gchar *filename; - gchar *dirname; - } dirname_checks[] = { -#ifndef G_OS_WIN32 - { "/", "/" }, - { "////", "/" }, - { ".////", "." }, - { "../", ".." }, - { "..////", ".." }, - { "a/b", "a" }, - { "a/b/", "a/b" }, - { "c///", "c" }, -#else - { "\\", "\\" }, - { ".\\\\\\\\", "." }, - { "..\\", ".." }, - { "..\\\\\\\\", ".." }, - { "a\\b", "a" }, - { "a\\b\\", "a\\b" }, - { "c\\\\\\", "c" }, -#endif -#ifdef G_WITH_CYGWIN - { "//server/share///x", "//server/share" }, -#endif - { ".", "." }, - { "..", "." }, - { "", "." }, - }; - guint n_dirname_checks = G_N_ELEMENTS (dirname_checks); - - struct { - gchar *filename; - gchar *without_root; - } skip_root_checks[] = { -#ifndef G_OS_WIN32 - { "/", "" }, - { "//", "" }, - { "/foo", "foo" }, - { "//foo", "foo" }, - { "a/b", NULL }, -#else - { "\\", "" }, - { "\\foo", "foo" }, - { "\\\\server\\foo", "" }, - { "\\\\server\\foo\\bar", "bar" }, - { "a\\b", NULL }, -#endif -#ifdef G_WITH_CYGWIN - { "//server/share///x", "//x" }, -#endif - { ".", NULL }, - { "", NULL }, - }; - guint n_skip_root_checks = G_N_ELEMENTS (skip_root_checks); - - guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U; - guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U; -#ifdef G_HAVE_GINT64 - guint64 gu64t1 = G_GINT64_CONSTANT(0x1d636b02300a7aa7U), - gu64t2 = G_GINT64_CONSTANT(0xa77a0a30026b631dU); -#endif - const char hello[] = "Hello, World"; - const int hellolen = sizeof (hello) - 1; - int fd; - char template[32]; - GError *error; - char *name_used; -#ifdef G_OS_WIN32 - gchar *glib_dll = g_strdup_printf ("glib-%d.%d.dll", - GLIB_MAJOR_VERSION, - GLIB_MINOR_VERSION); -#endif -#ifdef G_WITH_CYGWIN - gchar *glib_dll = g_strdup_printf ("cygglib-%d.%d.dll", - GLIB_MAJOR_VERSION, - GLIB_MINOR_VERSION); -#endif - - g_print ("TestGLib v%u.%u.%u (i:%u b:%u)\n", - glib_major_version, - glib_minor_version, - glib_micro_version, - glib_interface_age, - glib_binary_age); - - string = g_get_current_dir (); - g_print ("cwd: %s\n", string); - g_free (string); - g_print ("user: %s\n", g_get_user_name ()); - g_print ("real: %s\n", g_get_real_name ()); - g_print ("home: %s\n", g_get_home_dir ()); - g_print ("tmp-dir: %s\n", g_get_tmp_dir ()); - - /* type sizes */ - g_print ("checking size of gint8: %d", (int)sizeof (gint8)); - TEST (NULL, sizeof (gint8) == 1); - g_print ("\nchecking size of gint16: %d", (int)sizeof (gint16)); - TEST (NULL, sizeof (gint16) == 2); - g_print ("\nchecking size of gint32: %d", (int)sizeof (gint32)); - TEST (NULL, sizeof (gint32) == 4); - g_print ("\nchecking size of gsize: %d", (int)sizeof (gsize)); -#ifdef G_HAVE_GINT64 - g_print ("\nchecking size of gint64: %d", (int)sizeof (gint64)); - TEST (NULL, sizeof (gint64) == 8); -#endif /* G_HAVE_GINT64 */ - g_print ("\n"); - - g_print ("checking g_path_get_dirname()..."); - for (i = 0; i < n_dirname_checks; i++) - { - gchar *dirname; - - dirname = g_path_get_dirname (dirname_checks[i].filename); - if (strcmp (dirname, dirname_checks[i].dirname) != 0) - { - g_print ("\nfailed for \"%s\"==\"%s\" (returned: \"%s\")\n", - dirname_checks[i].filename, - dirname_checks[i].dirname, - dirname); - n_dirname_checks = 0; - } - g_free (dirname); - } - if (n_dirname_checks) - g_print ("ok\n"); - - g_print ("checking g_path_skip_root()..."); - for (i = 0; i < n_skip_root_checks; i++) - { - const gchar *skipped; - - skipped = g_path_skip_root (skip_root_checks[i].filename); - if ((skipped && !skip_root_checks[i].without_root) || - (!skipped && skip_root_checks[i].without_root) || - ((skipped && skip_root_checks[i].without_root) && - strcmp (skipped, skip_root_checks[i].without_root))) - { - g_print ("\nfailed for \"%s\"==\"%s\" (returned: \"%s\")\n", - skip_root_checks[i].filename, - (skip_root_checks[i].without_root ? - skip_root_checks[i].without_root : ""), - (skipped ? skipped : "")); - n_skip_root_checks = 0; - } - } - if (n_skip_root_checks) - g_print ("ok\n"); - - g_print ("checking doubly linked lists..."); - - list = NULL; - for (i = 0; i < 10; i++) - list = g_list_append (list, &nums[i]); - list = g_list_reverse (list); - - for (i = 0; i < 10; i++) - { - t = g_list_nth (list, i); - if (*((gint*) t->data) != (9 - i)) - g_error ("Regular insert failed"); - } - - for (i = 0; i < 10; i++) - if(g_list_position(list, g_list_nth (list, i)) != i) - g_error("g_list_position does not seem to be the inverse of g_list_nth\n"); - - g_list_free (list); - list = NULL; - - for (i = 0; i < 10; i++) - list = g_list_insert_sorted (list, &morenums[i], my_list_compare_one); - - /* - g_print("\n"); - g_list_foreach (list, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - t = g_list_nth (list, i); - if (*((gint*) t->data) != i) - g_error ("Sorted insert failed"); - } - - g_list_free (list); - list = NULL; - - for (i = 0; i < 10; i++) - list = g_list_insert_sorted (list, &morenums[i], my_list_compare_two); - - /* - g_print("\n"); - g_list_foreach (list, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - t = g_list_nth (list, i); - if (*((gint*) t->data) != (9 - i)) - g_error ("Sorted insert failed"); - } - - g_list_free (list); - list = NULL; - - for (i = 0; i < 10; i++) - list = g_list_prepend (list, &morenums[i]); - - list = g_list_sort (list, my_list_compare_two); - - /* - g_print("\n"); - g_list_foreach (list, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - t = g_list_nth (list, i); - if (*((gint*) t->data) != (9 - i)) - g_error ("Merge sort failed"); - } - - g_list_free (list); - - g_print ("ok\n"); - - - g_print ("checking singly linked lists..."); - - slist = NULL; - for (i = 0; i < 10; i++) - slist = g_slist_append (slist, &nums[i]); - slist = g_slist_reverse (slist); - - for (i = 0; i < 10; i++) - { - st = g_slist_nth (slist, i); - if (*((gint*) st->data) != (9 - i)) - g_error ("failed"); - } - - g_slist_free (slist); - slist = NULL; - - for (i = 0; i < 10; i++) - slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_one); - - /* - g_print("\n"); - g_slist_foreach (slist, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - st = g_slist_nth (slist, i); - if (*((gint*) st->data) != i) - g_error ("Sorted insert failed"); - } - - g_slist_free(slist); - slist = NULL; - - for (i = 0; i < 10; i++) - slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_two); - - /* - g_print("\n"); - g_slist_foreach (slist, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - st = g_slist_nth (slist, i); - if (*((gint*) st->data) != (9 - i)) - g_error("Sorted insert failed"); - } - - g_slist_free(slist); - slist = NULL; - - for (i = 0; i < 10; i++) - slist = g_slist_prepend (slist, &morenums[i]); - - slist = g_slist_sort (slist, my_list_compare_two); - - /* - g_print("\n"); - g_slist_foreach (slist, my_list_print, NULL); - */ - - for (i = 0; i < 10; i++) - { - st = g_slist_nth (slist, i); - if (*((gint*) st->data) != (9 - i)) - g_error("Sorted insert failed"); - } - - g_slist_free(slist); - - g_print ("ok\n"); - - - g_print ("checking binary trees...\n"); - - tree = g_tree_new (my_compare); - i = 0; - for (j = 0; j < 10; j++, i++) - { - chars[i] = '0' + j; - g_tree_insert (tree, &chars[i], &chars[i]); - } - for (j = 0; j < 26; j++, i++) - { - chars[i] = 'A' + j; - g_tree_insert (tree, &chars[i], &chars[i]); - } - for (j = 0; j < 26; j++, i++) - { - chars[i] = 'a' + j; - g_tree_insert (tree, &chars[i], &chars[i]); - } - - g_print ("tree height: %d\n", g_tree_height (tree)); - g_print ("tree nnodes: %d\n", g_tree_nnodes (tree)); - - g_print ("tree: "); - g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL); - g_print ("\n"); - - for (i = 0; i < 10; i++) - g_tree_remove (tree, &chars[i]); - - g_print ("tree height: %d\n", g_tree_height (tree)); - g_print ("tree nnodes: %d\n", g_tree_nnodes (tree)); - - g_print ("tree: "); - g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL); - g_print ("\n"); - - g_print ("ok\n"); - - - /* check n-way trees */ - g_node_test (); - - g_print ("checking mem chunks..."); - - mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE); - - for (i = 0; i < 10000; i++) - { - mem[i] = g_chunk_new (gchar, mem_chunk); - - for (j = 0; j < 50; j++) - mem[i][j] = i * j; - } - - for (i = 0; i < 10000; i++) - { - g_mem_chunk_free (mem_chunk, mem[i]); - } - - g_print ("ok\n"); - - - g_print ("checking hash tables..."); - - hash_table = g_hash_table_new (my_hash, my_hash_equal); - for (i = 0; i < 10000; i++) - { - array[i] = i; - g_hash_table_insert (hash_table, &array[i], &array[i]); - } - g_hash_table_foreach (hash_table, my_hash_callback, NULL); - - for (i = 0; i < 10000; i++) - if (array[i] == 0) - g_print ("%d\n", i); - - for (i = 0; i < 10000; i++) - g_hash_table_remove (hash_table, &array[i]); - - for (i = 0; i < 10000; i++) - { - array[i] = i; - g_hash_table_insert (hash_table, &array[i], &array[i]); - } - - if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 || - g_hash_table_size (hash_table) != 5000) - g_print ("bad!\n"); - - g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL); - - - g_hash_table_destroy (hash_table); - - g_print ("ok\n"); - - - g_print ("checking string chunks..."); - - string_chunk = g_string_chunk_new (1024); - - for (i = 0; i < 100000; i ++) - { - tmp_string = g_string_chunk_insert (string_chunk, "hi pete"); - - if (strcmp ("hi pete", tmp_string) != 0) - g_error ("string chunks are broken.\n"); - } - - tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string); - - g_assert (tmp_string_2 != tmp_string && - strcmp(tmp_string_2, tmp_string) == 0); - - tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string); - - g_assert (tmp_string_2 == tmp_string); - - g_string_chunk_free (string_chunk); - - g_print ("ok\n"); - - - g_print ("checking arrays..."); - - garray = g_array_new (FALSE, FALSE, sizeof (gint)); - for (i = 0; i < 10000; i++) - g_array_append_val (garray, i); - - for (i = 0; i < 10000; i++) - if (g_array_index (garray, gint, i) != i) - g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), i); - - g_array_free (garray, TRUE); - - garray = g_array_new (FALSE, FALSE, sizeof (gint)); - for (i = 0; i < 100; i++) - g_array_prepend_val (garray, i); - - for (i = 0; i < 100; i++) - if (g_array_index (garray, gint, i) != (100 - i - 1)) - g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), 100 - i - 1); - - g_array_free (garray, TRUE); - - g_print ("ok\n"); - - - g_print ("checking strings..."); - - string1 = g_string_new ("hi pete!"); - string2 = g_string_new (""); - - g_assert (strcmp ("hi pete!", string1->str) == 0); - - for (i = 0; i < 10000; i++) - g_string_append_c (string1, 'a'+(i%26)); - -#ifndef G_OS_WIN32 - /* MSVC, mingw32 and LCC use the same run-time C library, which doesn't like - the %10000.10000f format... */ - g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f", - "this pete guy sure is a wuss, like he's the number ", - 1, - " wuss. everyone agrees.\n", - string1->str, - 10, 666, 15, 15, 666.666666666, 666.666666666); -#else - g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%100.100f", - "this pete guy sure is a wuss, like he's the number ", - 1, - " wuss. everyone agrees.\n", - string1->str, - 10, 666, 15, 15, 666.666666666, 666.666666666); -#endif - - g_print ("string2 length = %d...\n", string2->len); - string2->str[70] = '\0'; - g_print ("first 70 chars:\n%s\n", string2->str); - string2->str[141] = '\0'; - g_print ("next 70 chars:\n%s\n", string2->str+71); - string2->str[212] = '\0'; - g_print ("and next 70:\n%s\n", string2->str+142); - g_print ("last 70 chars:\n%s\n", string2->str+string2->len - 70); - - g_string_free (string1, TRUE); - g_string_free (string2, TRUE); - - /* append */ - string1 = g_string_new ("firsthalf"); - g_string_append (string1, "lasthalf"); - g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); - g_string_free (string1, TRUE); - - /* append_len */ - - string1 = g_string_new ("firsthalf"); - g_string_append_len (string1, "lasthalfjunkjunk", strlen ("lasthalf")); - g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); - g_string_free (string1, TRUE); - - /* prepend */ - string1 = g_string_new ("lasthalf"); - g_string_prepend (string1, "firsthalf"); - g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); - g_string_free (string1, TRUE); - - /* prepend_len */ - string1 = g_string_new ("lasthalf"); - g_string_prepend_len (string1, "firsthalfjunkjunk", strlen ("firsthalf")); - g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); - g_string_free (string1, TRUE); - - /* insert */ - string1 = g_string_new ("firstlast"); - g_string_insert (string1, 5, "middle"); - g_assert (strcmp (string1->str, "firstmiddlelast") == 0); - g_string_free (string1, TRUE); - - /* insert with pos == end of the string */ - string1 = g_string_new ("firstmiddle"); - g_string_insert (string1, strlen ("firstmiddle"), "last"); - g_assert (strcmp (string1->str, "firstmiddlelast") == 0); - g_string_free (string1, TRUE); - - /* insert_len */ - - string1 = g_string_new ("firstlast"); - g_string_insert_len (string1, 5, "middlejunkjunk", strlen ("middle")); - g_assert (strcmp (string1->str, "firstmiddlelast") == 0); - g_string_free (string1, TRUE); - - /* insert_len with magic -1 pos for append */ - string1 = g_string_new ("first"); - g_string_insert_len (string1, -1, "lastjunkjunk", strlen ("last")); - g_assert (strcmp (string1->str, "firstlast") == 0); - g_string_free (string1, TRUE); - - /* insert_len with magic -1 len for strlen-the-string */ - string1 = g_string_new ("first"); - g_string_insert_len (string1, 5, "last", -1); - g_assert (strcmp (string1->str, "firstlast") == 0); - g_string_free (string1, TRUE); - - g_print ("ok\n"); - - /* g_string_equal */ - string1 = g_string_new ("test"); - string2 = g_string_new ("te"); - g_assert (! g_string_equal(string1, string2)); - g_string_append (string2, "st"); - g_assert (g_string_equal(string1, string2)); - g_string_free (string1, TRUE); - g_string_free (string2, TRUE); - - /* Check handling of embedded ASCII 0 (NUL) characters in GString. */ - string1 = g_string_new ("fiddle"); - string2 = g_string_new ("fiddle"); - g_assert (g_string_equal(string1, string2)); - g_string_append_c(string1, '\0'); - g_assert (! g_string_equal(string1, string2)); - g_string_append_c(string2, '\0'); - g_assert (g_string_equal(string1, string2)); - g_string_append_c(string1, 'x'); - g_string_append_c(string2, 'y'); - g_assert (! g_string_equal(string1, string2)); - g_assert (string1->len == 8); - g_string_append(string1, "yzzy"); - g_assert (string1->len == 12); - g_assert ( memcmp(string1->str, "fiddle\0xyzzy", 13) == 0); - g_string_insert(string1, 1, "QED"); - g_assert ( memcmp(string1->str, "fQEDiddle\0xyzzy", 16) == 0); - g_string_free (string1, TRUE); - g_string_free (string2, TRUE); - - g_print ("test positional printf formats (not supported): "); - string = g_strdup_printf ("%.*s%s", 5, "a", "b"); - tmp_string = g_strdup_printf ("%2$*1$s", 5, "c"); - g_print ("%s%s\n", string, tmp_string); - g_free (tmp_string); - g_free (string); - - g_print ("checking timers...\n"); - - timer = g_timer_new (); - g_print (" spinning for 3 seconds...\n"); - - g_timer_start (timer); - while (g_timer_elapsed (timer, NULL) < 3) - ; - - g_timer_stop (timer); - g_timer_destroy (timer); - - g_print ("ok\n"); - - g_print ("checking g_strcasecmp..."); - g_assert (g_strcasecmp ("FroboZZ", "frobozz") == 0); - g_assert (g_strcasecmp ("frobozz", "frobozz") == 0); - g_assert (g_strcasecmp ("frobozz", "FROBOZZ") == 0); - g_assert (g_strcasecmp ("FROBOZZ", "froboz") != 0); - g_assert (g_strcasecmp ("", "") == 0); - g_assert (g_strcasecmp ("!#%&/()", "!#%&/()") == 0); - g_assert (g_strcasecmp ("a", "b") < 0); - g_assert (g_strcasecmp ("a", "B") < 0); - g_assert (g_strcasecmp ("A", "b") < 0); - g_assert (g_strcasecmp ("A", "B") < 0); - g_assert (g_strcasecmp ("b", "a") > 0); - g_assert (g_strcasecmp ("b", "A") > 0); - g_assert (g_strcasecmp ("B", "a") > 0); - g_assert (g_strcasecmp ("B", "A") > 0); - - g_print ("ok\n"); - - g_print ("checking g_strdup..."); - g_assert(g_strdup(NULL) == NULL); - string = g_strdup(GLIB_TEST_STRING); - g_assert(string != NULL); - g_assert(strcmp(string, GLIB_TEST_STRING) == 0); - g_free(string); - - g_print ("ok\n"); - - g_print ("checking g_strconcat..."); - string = g_strconcat(GLIB_TEST_STRING, NULL); - g_assert(string != NULL); - g_assert(strcmp(string, GLIB_TEST_STRING) == 0); - g_free(string); - string = g_strconcat(GLIB_TEST_STRING, GLIB_TEST_STRING, - GLIB_TEST_STRING, NULL); - g_assert(string != NULL); - g_assert(strcmp(string, GLIB_TEST_STRING GLIB_TEST_STRING - GLIB_TEST_STRING) == 0); - g_free(string); - g_print ("ok\n"); - - - g_print("checking g_strlcpy/g_strlcat..."); - /* The following is a torture test for strlcpy/strlcat, with lots of - * checking; normal users wouldn't use them this way! - */ - string = g_malloc (6); - *(string + 5) = 'Z'; /* guard value, shouldn't change during test */ - *string = 'q'; - g_assert (g_strlcpy(string, "" , 5) == 0); - g_assert ( *string == '\0' ); - *string = 'q'; - g_assert (g_strlcpy(string, "abc" , 5) == 3); - g_assert ( *(string + 3) == '\0' ); - g_assert (g_str_equal(string, "abc")); - g_assert (g_strlcpy(string, "abcd" , 5) == 4); - g_assert ( *(string + 4) == '\0' ); - g_assert ( *(string + 5) == 'Z' ); - g_assert (g_str_equal(string, "abcd")); - g_assert (g_strlcpy(string, "abcde" , 5) == 5); - g_assert ( *(string + 4) == '\0' ); - g_assert ( *(string + 5) == 'Z' ); - g_assert (g_str_equal(string, "abcd")); - g_assert (g_strlcpy(string, "abcdef" , 5) == 6); - g_assert ( *(string + 4) == '\0' ); - g_assert ( *(string + 5) == 'Z' ); - g_assert (g_str_equal(string, "abcd")); - *string = 'Y'; - *(string + 1)= '\0'; - g_assert (g_strlcpy(string, "Hello" , 0) == 5); - g_assert (*string == 'Y'); - *string = '\0'; - g_assert (g_strlcat(string, "123" , 5) == 3); - g_assert ( *(string + 3) == '\0' ); - g_assert (g_str_equal(string, "123")); - g_assert (g_strlcat(string, "" , 5) == 3); - g_assert ( *(string + 3) == '\0' ); - g_assert (g_str_equal(string, "123")); - g_assert (g_strlcat(string, "4", 5) == 4); - g_assert (g_str_equal(string, "1234")); - g_assert (g_strlcat(string, "5", 5) == 5); - g_assert ( *(string + 4) == '\0' ); - g_assert (g_str_equal(string, "1234")); - g_assert ( *(string + 5) == 'Z' ); - *string = 'Y'; - *(string + 1)= '\0'; - g_assert (g_strlcat(string, "123" , 0) == 3); - g_assert (*string == 'Y'); - - /* A few more tests, demonstrating more "normal" use */ - g_assert (g_strlcpy(string, "hi", 5) == 2); - g_assert (g_str_equal(string, "hi")); - g_assert (g_strlcat(string, "t", 5) == 3); - g_assert (g_str_equal(string, "hit")); - g_free(string); - - g_print ("ok\n"); - - - g_print ("checking g_strdup_printf..."); - string = g_strdup_printf ("%05d %-5s", 21, "test"); - g_assert (string != NULL); - g_assert (strcmp(string, "00021 test ") == 0); - g_free (string); - - g_print ("ok\n"); - - /* g_debug (argv[0]); */ - - /* Relation tests */ - - g_print ("checking relations..."); - - relation = g_relation_new (2); - - g_relation_index (relation, 0, g_int_hash, g_int_equal); - g_relation_index (relation, 1, g_int_hash, g_int_equal); - - for (i = 0; i < 1024; i += 1) - data[i] = i; - - for (i = 1; i < 1023; i += 1) - { - g_relation_insert (relation, data + i, data + i + 1); - g_relation_insert (relation, data + i, data + i - 1); - } - - for (i = 2; i < 1022; i += 1) - { - g_assert (! g_relation_exists (relation, data + i, data + i)); - g_assert (! g_relation_exists (relation, data + i, data + i + 2)); - g_assert (! g_relation_exists (relation, data + i, data + i - 2)); - } - - for (i = 1; i < 1023; i += 1) - { - g_assert (g_relation_exists (relation, data + i, data + i + 1)); - g_assert (g_relation_exists (relation, data + i, data + i - 1)); - } - - for (i = 2; i < 1022; i += 1) - { - g_assert (g_relation_count (relation, data + i, 0) == 2); - g_assert (g_relation_count (relation, data + i, 1) == 2); - } - - g_assert (g_relation_count (relation, data, 0) == 0); - - g_assert (g_relation_count (relation, data + 42, 0) == 2); - g_assert (g_relation_count (relation, data + 43, 1) == 2); - g_assert (g_relation_count (relation, data + 41, 1) == 2); - g_relation_delete (relation, data + 42, 0); - g_assert (g_relation_count (relation, data + 42, 0) == 0); - g_assert (g_relation_count (relation, data + 43, 1) == 1); - g_assert (g_relation_count (relation, data + 41, 1) == 1); - - tuples = g_relation_select (relation, data + 200, 0); - - g_assert (tuples->len == 2); - -#if 0 - for (i = 0; i < tuples->len; i += 1) - { - printf ("%d %d\n", - *(gint*) g_tuples_index (tuples, i, 0), - *(gint*) g_tuples_index (tuples, i, 1)); - } -#endif - - g_assert (g_relation_exists (relation, data + 300, data + 301)); - g_relation_delete (relation, data + 300, 0); - g_assert (!g_relation_exists (relation, data + 300, data + 301)); - - g_tuples_destroy (tuples); - - g_relation_destroy (relation); - - relation = NULL; - - g_print ("ok\n"); - - g_print ("checking pointer arrays..."); - - gparray = g_ptr_array_new (); - for (i = 0; i < 10000; i++) - g_ptr_array_add (gparray, GINT_TO_POINTER (i)); - - for (i = 0; i < 10000; i++) - if (g_ptr_array_index (gparray, i) != GINT_TO_POINTER (i)) - g_print ("array fails: %p ( %p )\n", g_ptr_array_index (gparray, i), GINT_TO_POINTER (i)); - - g_ptr_array_free (gparray, TRUE); - - g_print ("ok\n"); - - - g_print ("checking byte arrays..."); - - gbarray = g_byte_array_new (); - for (i = 0; i < 10000; i++) - g_byte_array_append (gbarray, (guint8*) "abcd", 4); - - for (i = 0; i < 10000; i++) - { - g_assert (gbarray->data[4*i] == 'a'); - g_assert (gbarray->data[4*i+1] == 'b'); - g_assert (gbarray->data[4*i+2] == 'c'); - g_assert (gbarray->data[4*i+3] == 'd'); - } - - g_byte_array_free (gbarray, TRUE); - g_print ("ok\n"); - - g_printerr ("g_log tests:"); - g_warning ("harmless warning with parameters: %d %s %#x", 42, "Boo", 12345); - g_message ("the next warning is a test:"); - string = NULL; - g_print (string); - - g_print ("checking endian macros (host is "); -#if G_BYTE_ORDER == G_BIG_ENDIAN - g_print ("big endian)..."); -#else - g_print ("little endian)..."); -#endif - g_assert (GUINT16_SWAP_LE_BE (gu16t1) == gu16t2); - g_assert (GUINT32_SWAP_LE_BE (gu32t1) == gu32t2); -#ifdef G_HAVE_GINT64 - g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2); -#endif - - g_print ("ok\n"); - -#ifdef G_PLATFORM_WIN32 - g_print ("current locale: %s\n", g_win32_getlocale ()); - - g_print ("GLib installation directory, from Registry entry for %s if available: %s\n", - GETTEXT_PACKAGE, - g_win32_get_package_installation_directory (GETTEXT_PACKAGE, NULL)); - g_print ("Ditto, or from GLib DLL name: %s\n", - g_win32_get_package_installation_directory (GETTEXT_PACKAGE, glib_dll)); - g_print ("Ditto, only from GLib DLL name: %s\n", - g_win32_get_package_installation_directory (NULL, glib_dll)); - g_print ("locale subdirectory of GLib installation directory: %s\n", - g_win32_get_package_installation_subdirectory (NULL, glib_dll, "locale")); - g_print ("GTK+ 2.0 installation directory, if available: %s\n", - g_win32_get_package_installation_directory ("gtk20", NULL)); - - g_print ("found more.com as %s\n", g_find_program_in_path ("more.com")); - g_print ("found regedit as %s\n", g_find_program_in_path ("regedit")); - -#endif - - g_print ("checking file functions...\n"); - - strcpy (template, "foobar"); - fd = g_mkstemp (template); - if (fd != -1) - g_print ("g_mkstemp works even if template doesn't end in XXXXXX\n"); - close (fd); - strcpy (template, "fooXXXXXX"); - fd = g_mkstemp (template); - if (fd == -1) - g_print ("g_mkstemp didn't work for template %s\n", template); - i = write (fd, hello, hellolen); - if (i == -1) - g_print ("write() failed: %s\n", g_strerror (errno)); - else if (i != hellolen) - g_print ("write() should have written %d bytes, wrote %d\n", hellolen, i); - - lseek (fd, 0, 0); - i = read (fd, chars, sizeof (chars)); - if (i == -1) - g_print ("read() failed: %s\n", g_strerror (errno)); - else if (i != hellolen) - g_print ("read() should have read %d bytes, got %d\n", hellolen, i); - - chars[i] = 0; - if (strcmp (chars, hello) != 0) - g_print ("wrote '%s', but got '%s'\n", hello, chars); - - close (fd); - remove (template); - - error = NULL; - strcpy (template, "zap" G_DIR_SEPARATOR_S "barXXXXXX"); - fd = g_file_open_tmp (template, &name_used, &error); - if (fd != -1) - g_print ("g_file_open_tmp works even if template contains '%s'\n", - G_DIR_SEPARATOR_S); - else - g_print ("g_file_open_tmp correctly returns error: %s\n", - error->message); - close (fd); - g_clear_error (&error); - - strcpy (template, "zapXXXXXX"); - fd = g_file_open_tmp (template, &name_used, &error); - if (fd == -1) - g_print ("g_file_open_tmp didn't work for template '%s': %s\n", - template, error->message); - else - g_print ("g_file_open_tmp for template '%s' used name '%s'\n", - template, name_used); - close (fd); - g_clear_error (&error); - remove (name_used); - - fd = g_file_open_tmp (NULL, &name_used, &error); - if (fd == -1) - g_print ("g_file_open_tmp didn't work for a NULL template: %s\n", - error->message); - else - g_print ("g_file_open_tmp for NULL template used name '%s'\n", - name_used); - close (fd); - g_clear_error (&error); - remove (name_used); - - return 0; -} - diff --git a/tests/.cvsignore b/tests/.cvsignore index 0b3055bf..7b0e531a 100644 --- a/tests/.cvsignore +++ b/tests/.cvsignore @@ -39,3 +39,8 @@ tree-test type-test unicode-encoding gio-test +testgdate +testgdateparser +testglib +timeloop +timeloop-basic diff --git a/tests/Makefile.am b/tests/Makefile.am index 2006e5c4..49e277fc 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,8 +1,8 @@ -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/gmodule @GLIB_DEBUG_FLAGS@ +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gmodule @GLIB_DEBUG_FLAGS@ EFENCE= -libglib = $(top_builddir)/libglib-1.3.la +libglib = $(top_builddir)/glib/libglib-1.3.la libgthread = $(top_builddir)/gthread/libgthread-1.3.la libgmodule = $(top_builddir)/gmodule/libgmodule-1.3.la libgobject = $(top_builddir)/gobject/libgobject-1.3.la @@ -31,6 +31,17 @@ else CXX_TEST = endif +if ENABLE_TIMELOOP +timeloop = timeloop +endif +noinst_PROGRAMS = testglib testgdate testgdateparser $(timeloop) +testglib_LDADD = $(libglib) +testgdate_LDADD = $(libglib) +testgdateparser_LDADD = $(libglib) +if ENABLE_TIMELOOP +timeloop_LDADD = $(libglib) +endif + test_programs = \ array-test \ $(CXX_TEST) \ diff --git a/timeloop-basic.c b/timeloop-basic.c deleted file mode 100644 index 6e8051f7..00000000 --- a/timeloop-basic.c +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define TRUE 1 -#define FALSE 0 - -static int n_children = 3; -static int n_active_children; -static int n_iters = 10000; - -static int write_fds[1024]; -static struct pollfd poll_fds[1024]; - -void -my_pipe (int *fds) -{ - if (pipe(fds) < 0) - { - fprintf (stderr, "Cannot create pipe %s\n", strerror (errno)); - exit (1); - } -} - -int -read_all (int fd, char *buf, int len) -{ - size_t bytes_read = 0; - ssize_t count; - - while (bytes_read < len) - { - count = read (fd, buf + bytes_read, len - bytes_read); - if (count < 0) - { - if (errno != EAGAIN) - return FALSE; - } - else if (count == 0) - return FALSE; - - bytes_read += count; - } - - return TRUE; -} - -int -write_all (int fd, char *buf, int len) -{ - size_t bytes_written = 0; - ssize_t count; - - while (bytes_written < len) - { - count = write (fd, buf + bytes_written, len - bytes_written); - if (count < 0) - { - if (errno != EAGAIN) - return FALSE; - } - - bytes_written += count; - } - - return TRUE; -} - -void -run_child (int in_fd, int out_fd) -{ - int i; - int val = 1; - - for (i = 0; i < n_iters; i++) - { - write_all (out_fd, (char *)&val, sizeof (val)); - read_all (in_fd, (char *)&val, sizeof (val)); - } - - val = 0; - write_all (out_fd, (char *)&val, sizeof (val)); - - exit (0); -} - -int -input_callback (int source, int dest) -{ - int val; - - if (!read_all (source, (char *)&val, sizeof(val))) - { - fprintf (stderr,"Unexpected EOF\n"); - exit (1); - } - - if (val) - { - write_all (dest, (char *)&val, sizeof(val)); - return TRUE; - } - else - { - close (source); - close (dest); - - n_active_children--; - return FALSE; - } -} - -void -create_child (int pos) -{ - int pid; - int in_fds[2]; - int out_fds[2]; - - my_pipe (in_fds); - my_pipe (out_fds); - - pid = fork (); - - if (pid > 0) /* Parent */ - { - close (in_fds[0]); - close (out_fds[1]); - - write_fds[pos] = in_fds[1]; - poll_fds[pos].fd = out_fds[0]; - poll_fds[pos].events = POLLIN; - } - else if (pid == 0) /* Child */ - { - close (in_fds[1]); - close (out_fds[0]); - - setsid (); - - run_child (in_fds[0], out_fds[1]); - } - else /* Error */ - { - fprintf (stderr,"Cannot fork: %s\n", strerror (errno)); - exit (1); - } -} - -static double -difftimeval (struct timeval *old, struct timeval *new) -{ - return - (new->tv_sec - old->tv_sec) * 1000. + (new->tv_usec - old->tv_usec) / 1000; -} - -int -main (int argc, char **argv) -{ - int i, j; - struct rusage old_usage; - struct rusage new_usage; - - if (argc > 1) - n_children = atoi(argv[1]); - - if (argc > 2) - n_iters = atoi(argv[2]); - - printf ("Children: %d Iters: %d\n", n_children, n_iters); - - n_active_children = n_children; - for (i = 0; i < n_children; i++) - create_child (i); - - getrusage (RUSAGE_SELF, &old_usage); - - while (n_active_children > 0) - { - int old_n_active_children = n_active_children; - - poll (poll_fds, n_active_children, -1); - - for (i=0; i n_active_children) - { - j = 0; - for (i=0; i -#include -#include -#include -#include -#include - -#include - -static int n_children = 3; -static int n_active_children; -static int n_iters = 10000; -static GMainLoop *loop; - -static void -io_pipe (GIOChannel **channels) -{ - int fds[2]; - - if (pipe(fds) < 0) - { - fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno)); - exit (1); - } - - channels[0] = g_io_channel_unix_new (fds[0]); - channels[1] = g_io_channel_unix_new (fds[1]); -} - -static gboolean -read_all (GIOChannel *channel, char *buf, int len) -{ - gsize bytes_read = 0; - gsize count; - GIOError err; - - while (bytes_read < len) - { - err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count); - if (err) - { - if (err != G_IO_ERROR_AGAIN) - return FALSE; - } - else if (count == 0) - return FALSE; - - bytes_read += count; - } - - return TRUE; -} - -static gboolean -write_all (GIOChannel *channel, char *buf, int len) -{ - gsize bytes_written = 0; - gsize count; - GIOError err; - - while (bytes_written < len) - { - err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count); - if (err && err != G_IO_ERROR_AGAIN) - return FALSE; - - bytes_written += count; - } - - return TRUE; -} - -static void -run_child (GIOChannel *in_channel, GIOChannel *out_channel) -{ - int i; - int val = 1; - GTimer *timer = g_timer_new(); - - for (i = 0; i < n_iters; i++) - { - write_all (out_channel, (char *)&val, sizeof (val)); - read_all (in_channel, (char *)&val, sizeof (val)); - } - - val = 0; - write_all (out_channel, (char *)&val, sizeof (val)); - - val = g_timer_elapsed (timer, NULL) * 1000; - - write_all (out_channel, (char *)&val, sizeof (val)); - g_timer_destroy (timer); - - exit (0); -} - -static gboolean -input_callback (GIOChannel *source, - GIOCondition condition, - gpointer data) -{ - int val; - GIOChannel *dest = (GIOChannel *)data; - - if (!read_all (source, (char *)&val, sizeof(val))) - { - fprintf (stderr, "Unexpected EOF\n"); - exit (1); - } - - if (val) - { - write_all (dest, (char *)&val, sizeof(val)); - - return TRUE; - } - else - { - g_io_channel_close (source); - g_io_channel_close (dest); - - g_io_channel_unref (source); - g_io_channel_unref (dest); - - n_active_children--; - if (n_active_children == 0) - g_main_loop_quit (loop); - - return FALSE; - } -} - -static void -create_child () -{ - int pid; - GIOChannel *in_channels[2]; - GIOChannel *out_channels[2]; - - io_pipe (in_channels); - io_pipe (out_channels); - - pid = fork (); - - if (pid > 0) /* Parent */ - { - g_io_channel_close (in_channels[0]); - g_io_channel_close (out_channels[1]); - - g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP, - input_callback, in_channels[1]); - } - else if (pid == 0) /* Child */ - { - g_io_channel_close (in_channels[1]); - g_io_channel_close (out_channels[0]); - - setsid (); - - run_child (in_channels[0], out_channels[1]); - } - else /* Error */ - { - fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno)); - exit (1); - } -} - -static double -difftimeval (struct timeval *old, struct timeval *new) -{ - return - (new->tv_sec - old->tv_sec) * 1000. + (new->tv_usec - old->tv_usec) / 1000; -} - -int -main (int argc, char **argv) -{ - int i; - struct rusage old_usage; - struct rusage new_usage; - - if (argc > 1) - n_children = atoi(argv[1]); - - if (argc > 2) - n_iters = atoi(argv[2]); - - printf ("Children: %d Iters: %d\n", n_children, n_iters); - - n_active_children = n_children; - for (i = 0; i < n_children; i++) - create_child (); - - getrusage (RUSAGE_SELF, &old_usage); - loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (loop); - getrusage (RUSAGE_SELF, &new_usage); - - printf ("Elapsed user: %g\n", - difftimeval (&old_usage.ru_utime, &new_usage.ru_utime)); - printf ("Elapsed system: %g\n", - difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); - printf ("Elapsed total: %g\n", - difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + - difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); - printf ("total / iteration: %g\n", - (difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + - difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)) / - (n_iters * n_children)); - - return 0; -} -- 2.34.1